2012-02-20 5 views
3

C로 운영 체제를 개발 중이며 페이징에 어려움을 겪고 있습니다. 메모리를 할당하고 실제 및 가상 페이지 할당을 처리하는 저수준 메모리 할당 출력을 출력하여 루프에서 커널 힙을 테스트하고 있습니다.페이지 폴트 후 재시작 명령어

PDE 0, 모든 페이지 0-1023에 대한 잘 작동하지만 다른 물리적 주소 할당 시작하면 즉시 PDE 1에 할당 이동할 때, 페이지 오류가 너무 본 플래그를 설정하고, 때로는 rw 플래그와 함께 발생합니다.

오류가있는 주소를 cr2에서 가져와 PDE 페이지로 다시 매핑하고 페이지가 속한 페이지를 설정해야합니다. 그렇지 않으면 주소를 3으로 설정해야합니까? 그 후에 지시를 다시 시작해야하지만 어떻게해야합니까? 어떤 제안?

+0

첫 번째 질문에서 무엇을 묻고 있는지 잘 모르겠습니다. 실수로 주소를 어떻게 처리해야하는지 이미 알고있는 것 같습니다. 돌아 오는 경우 : 페이지 폴트는 다른 인터럽트와 동일합니다. - 페이지 폴트 핸들러가 호출되기 전에 EIP/RIP (이 경우 * 페이지 폴트를 일으킨 명령어 *를 가리킴)가 스택에 저장됩니다. – pmdj

+0

답장을 보내 주셔서 감사합니다. 페이지 오류는 이미 할당 된 프레임을 실수로 할당 한 오작동 한 물리적 프레임 할당자가 발생했습니다. 또한 페이지 경계를 넘은 바이트를 kmallocing하는 것은 문제였습니다. 그러나 이제는 모두 해결되었습니다. 감사! –

답변

2

Page Fault는 오류 예외입니다. 즉, 페이지 오류 처리기가 인터럽트가 발생한 것처럼 프로세서에서 직접 호출됨을 의미합니다.

페이지 오류를 처리 한 후 호출자에게 돌아가려면 IRET 명령을 통해 오류에서 돌아와야합니다. 이렇게하면 코드 세그먼트, eflags 레지스터 및 EIP (그리고 링이 3에서 발생한 경우 사용자 모드 SS 및 ESP가 될 수 있음)가 다시 오류를 트리거 한 명령으로 반환됩니다.