[질문] Copy On Write와 관련하여 궁금한 점이 있습니다.
글쓴이: Arcyze / 작성시간: 월, 2009/07/06 - 5:15오후
안녕하세요~
Copy on write를 공부하다가 문득 궁금해진것인데, Copy On write는
자식의 주소 공간을 만들때 일단 부모의 것(부모의 페이지 테이블)을 복사하여
가리키고 있다가 "쓰기"가 발생하면 그 페이지를 복사하여 주는것으로 알고 있는데요,
무엇을 하는것인지는 알겠는데, 실제로 OS가 COW를 하기 위해서는 '프로세스가 쓰기(write)를 하려 한다'
는것을 알아야 하지 않을까요? 이것을 어떻게 알 수 있는지 궁금합니다.(가능하면 x86 기준으로;)
리눅스 커널의 이해를 보니 COW 이전에 (쓰기 동작이 발생하면) 페이지 폴트가 발생하고, 페이지폴트 핸들러에서
현재 접근이 write_access인 경우 실제 복사 동작을 실행하는것 같습니다.폴트 발생 이전에(프로세스가 생성될때) 이 페이지는 쓰기 권한이 없는 상태로
설정되었을테고 지금 write로 접근하여 페이지 폴트로 진입하였을것 같은데 책에서는 예외가 발생할때 제어 유닛이 스택에 저장하는 3비트의 error_code가 설정되고
에러 코드의 비트 1(두번째 비트)의 값이 0이면 읽기나 실행 접근, 1이면 쓰기 접근때문에 예외가 발생한것인지를 나타낸다고 되어 있습니다.
결국 이 error_code가 어떻게 설정되는지 알면 제 궁금중이 풀릴것 같은데 혹시 아시는분 계시다면 알려주시면 정말 감사하겠습니다.
(제목과는 조금 엉뚱한 질문이 되어버린것 같아 죄송합니다;;)
Forums:
더 찾아보니..
찾아보니 예외가 발생한것이므로 IDT에서 page_fault로 점프하게 될것이고
그게 x86에서는 linux/arch/x86/kernel/entry_32.S 에 있는
ENTRY(page_fault)
...
의 어셈블리코드들이네요. 여기서 각 레지스터를 저장하고 C 함수에서 예외처리를 한다(이게 아마 do_page_fault같은 함수겠죠?)고 되어있고
이 어셈블리코드에서 아랫 부분에 보면
이런 코드가 있네요 PT_GS같은 매크로는
#define PT_GS 10
#define PT_ORIG_EAX 11
로 정의되어 있고 이 의미는 esp+32(PT_GS) 나 esp+36(PT_ORIG_EAX)라고 되어 있군요.(32비트 기준이라서 *4를 한것 같습니다.)
문제는 movl PT_ORIG_EAX(%esp), %edx # get the error code 코드가 결국 스택의 esp+36에 저장된 에러코드를 가져온다 라고 설명되어 있고 끝이네요.
아마 이것이 설정되는것은 하드웨어가 예외가 발생하면 에러코드를 자동으로 스택에 저장해주는 것인가보네요. 이게 어떻게 되는지 알려면 x86 매뉴얼을 봐야 하는걸까요..
댓글 달기