![스왑 영역에서 페이지가 스왑될 때 pte 플래그를 복원하는 방법은 무엇입니까?](https://linux55.com/image/10378/%EC%8A%A4%EC%99%91%20%EC%98%81%EC%97%AD%EC%97%90%EC%84%9C%20%ED%8E%98%EC%9D%B4%EC%A7%80%EA%B0%80%20%EC%8A%A4%EC%99%91%EB%90%A0%20%EB%95%8C%20pte%20%ED%94%8C%EB%9E%98%EA%B7%B8%EB%A5%BC%20%EB%B3%B5%EC%9B%90%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
스왑 프로세스를 제대로 이해하고 싶지만 페이지가 메모리로 다시 스왑된 후 페이지의 pte 플래그가 어떻게 복원되는지에 대한 완전한 설명을 찾을 수 없습니다. 스왑 아웃 시 해당 정보와 주소가 "손실"되기 때문입니다. 해당 디스크 영역은 페이지의 pte 항목에서 스왑 아웃된 영역에 삽입됩니다. 가상 주소에 대한 플래그가 저장되지만 vm_area_struct
스왑 인 프로세스 중에 사용되는 단계를 추적할 수 없다는 것을 이해합니다.
또 다른 잠재적인 문제는 - fork
상위 프로세스가 수정되고 상위 프로세스와 하위 프로세스가 모두 교체되면 어떻게 되는지입니다. 제가 생각하는 한, 두 페이지 테이블 모두에서 플래그가 read_only
켜져 있지만 vm_area_struct
쓰기가 허용됩니다. 왜냐하면 둘 다 있기 때문입니다. 특정 메모리 영역에 대한 권한 이지만 VM_MAYWRITE
일단 교체되면 read_only
해당 pte의 플래그가 "삭제"됩니다. 페이지가 교체되고 하위 프로세스가 쓰기를 원하면 둘 다 가리키는 페이지에 대해 COW 기술이 계속 작동합니까?
답변1
말씀하신 것처럼 vm_area_struct
오류가 발생한 메모리 영역을 알려주고 이 구조에는 보호 플래그가 포함되어 있습니다. 이 함수는 포인터가 를 가리키도록 하기 위해 __do_page_fault
호출됩니다 . 그런 다음 이 구조는 보호 비트를 매개변수로 사용하여 호출된 구조 (매개변수에서 ) 까지 전달 됩니다.find_vma
vm_area_struct
handle_pte_fault
do_swap_page
vm_fault *vmf
mk_pte
다른 질문: COW 페이지가 교체되고 프로세스가 여기에 쓰려고 하는 경우입니다. 이 경우 페이지가 스왑 아웃되었기 때문에 페이지 폴트가 발생합니다. 핸들러는 이 상황을 처리하고 프로세스는 디스크에서 페이지를 읽을 때까지 대기 상태로 유지됩니다. 프로세스가 다시 실행되도록 예약되면 잘못된 쓰기 명령을 다시 실행한 다음 bam! — 이번에는 쓰기 중 복사로 인해 페이지가 읽기 전용이 되었기 때문에 새로운 오류가 발생했습니다.