[질문] Copy On Write와 관련하여 궁금한 점이 있습니다.

Arcyze의 이미지

안녕하세요~

Copy on write를 공부하다가 문득 궁금해진것인데, Copy On write는

자식의 주소 공간을 만들때 일단 부모의 것(부모의 페이지 테이블)을 복사하여

가리키고 있다가 "쓰기"가 발생하면 그 페이지를 복사하여 주는것으로 알고 있는데요,

무엇을 하는것인지는 알겠는데, 실제로 OS가 COW를 하기 위해서는 '프로세스가 쓰기(write)를 하려 한다'

는것을 알아야 하지 않을까요? 이것을 어떻게 알 수 있는지 궁금합니다.(가능하면 x86 기준으로;)

리눅스 커널의 이해를 보니 COW 이전에 (쓰기 동작이 발생하면) 페이지 폴트가 발생하고, 페이지폴트 핸들러에서

현재 접근이 write_access인 경우 실제 복사 동작을 실행하는것 같습니다.폴트 발생 이전에(프로세스가 생성될때) 이 페이지는 쓰기 권한이 없는 상태로

설정되었을테고 지금 write로 접근하여 페이지 폴트로 진입하였을것 같은데 책에서는 예외가 발생할때 제어 유닛이 스택에 저장하는 3비트의 error_code가 설정되고

에러 코드의 비트 1(두번째 비트)의 값이 0이면 읽기나 실행 접근, 1이면 쓰기 접근때문에 예외가 발생한것인지를 나타낸다고 되어 있습니다.

결국 이 error_code가 어떻게 설정되는지 알면 제 궁금중이 풀릴것 같은데 혹시 아시는분 계시다면 알려주시면 정말 감사하겠습니다.

(제목과는 조금 엉뚱한 질문이 되어버린것 같아 죄송합니다;;)

Arcyze의 이미지

찾아보니 예외가 발생한것이므로 IDT에서 page_fault로 점프하게 될것이고

그게 x86에서는 linux/arch/x86/kernel/entry_32.S 에 있는

ENTRY(page_fault)
...

의 어셈블리코드들이네요. 여기서 각 레지스터를 저장하고 C 함수에서 예외처리를 한다(이게 아마 do_page_fault같은 함수겠죠?)고 되어있고

이 어셈블리코드에서 아랫 부분에 보면

movl PT_GS(%esp), %edi          # get the function address
movl PT_ORIG_EAX(%esp), %edx    # get the error code
movl $-1, PT_ORIG_EAX(%esp)     # no syscall to restart

이런 코드가 있네요 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 매뉴얼을 봐야 하는걸까요..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.