스왑 영역에서 페이지가 스왑될 때 pte 플래그를 복원하는 방법은 무엇입니까?

스왑 영역에서 페이지가 스왑될 때 pte 플래그를 복원하는 방법은 무엇입니까?

스왑 프로세스를 제대로 이해하고 싶지만 페이지가 메모리로 다시 스왑된 후 페이지의 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_vmavm_area_structhandle_pte_faultdo_swap_pagevm_fault *vmfmk_pte

다른 질문: COW 페이지가 교체되고 프로세스가 여기에 쓰려고 하는 경우입니다. 이 경우 페이지가 스왑 아웃되었기 때문에 페이지 폴트가 발생합니다. 핸들러는 이 상황을 처리하고 프로세스는 디스크에서 페이지를 읽을 때까지 대기 상태로 유지됩니다. 프로세스가 다시 실행되도록 예약되면 잘못된 쓰기 명령을 다시 실행한 다음 bam! — 이번에는 쓰기 중 복사로 인해 페이지가 읽기 전용이 되었기 때문에 새로운 오류가 발생했습니다.

관련 정보