읽기 전용 메모리 매핑 영역에 더티 페이지가 있는 이유는 무엇입니까?

읽기 전용 메모리 매핑 영역에 더티 페이지가 있는 이유는 무엇입니까?

예를 들어 다음 명령을 실행하여 메모리 매핑된 페이지 목록을 가져옵니다.

pmap -x `pidof bash`

나는 다음과 같은 결과를 얻습니다. 여기에 이미지 설명을 입력하세요. 일부 읽기 전용 페이지가 "더티"로 표시되는 이유는 무엇입니까? 이는 작성된 후 다시 작성해야 함을 의미합니까? 읽기 전용인 경우 프로세스는 여기에 쓸 수 없어야 합니다... (제공된 예에서 더티 페이지는 항상 4kB이지만 값이 다른 다른 경우를 찾았습니다)

/proc/도 확인했습니다.PID/smaps 페이지는 "개인 정보 보호 더러운"으로 설명되었습니다.

답변1

더티 페이지를 반드시 다시 작성할 필요는 없습니다. 더티 페이지는 커널이 마지막으로 클린 페이지로 표시한 이후에 기록된 페이지입니다. 데이터를 항상 원본 파일에 다시 저장할 필요는 없습니다.

이러한 페이지는 비공개이며 공유되지 않으므로 원본 파일에 다시 저장되지 않습니다. 읽기 전용 파일은 더티 페이지를 지원할 수 없습니다. 페이지를 RAM에서 제거해야 하는 경우 해당 페이지는 스왑 영역에 저장됩니다.

읽기 전용, 개인 및 더티 페이지(메모리 매핑된 파일 범위 내에 있음)는 일반적으로 런타임 시 초기화해야 하지만 초기화 후에 변경되지 않는 상수를 포함하는 데이터 페이지입니다. 예를 들어 포인터가 포함된 정적 데이터가 포함될 수 있습니다. 포인터 값은 프로그램이나 라이브러리에 의해 매핑된 주소에 따라 달라지므로 프로그램이 시작된 후 페이지를 읽고 쓰는 동안 계산되어야 합니다. 포인터가 계산되면 페이지의 내용은 이 프로그램 인스턴스에서 절대 변경되지 않으므로 페이지를 읽기 전용으로 변경할 수 있습니다. 바라보다Stosb에 대한 "더티 메모리 페이지 찾기"코드 조각이 포함된 예시.

읽기 전용, 실행 가능, 개인용, 더티 페이지는 코드와 데이터를 보다 자유롭게 혼합하는 일부 링커 또는 적시 컴파일에서 발생하는 경우가 거의 없습니다.

답변2

경우를 제외하고자일스목록:

프로세스가 분기되면 커널은 모든 더티 페이지를 읽기 전용으로 표시할 수 있으며 상위 프로세스와 하위 프로세스 간에 공유됩니다. 프로세스 중 하나가 페이지에 쓰면 예외가 발생하고 커널은 페이지를 복사하여 쓰기 가능으로 표시합니다. 이렇게 하면 두 프로세스 모두에서 최종적으로 다시 수정되지 않는 페이지 복사 작업이 절약됩니다. (이 경우 이 페이지는 하드웨어에서 읽기 전용으로 표시되지만 커널은 이 페이지가 쓰기 가능하다는 것을 알고 있습니다.)

관련 정보