페이징 초기화/실행시...?

kkojiband의 이미지

안녕하세요! 간만에 질문 올립니다! ^^;

간단한 키보드 핸들러까지 만들고 이제 페이징을 구현하려고 하는데요,

역시나 보호 모드 처음 진입할때처럼 헤매고 있습니다...--;

일단 제가 구성해놓은 내용은,

페이지 디렉토리를 0x16000 에다가 놓고,
(커널이미지가 0x1000 ~ 0x15000 에 놓여있어서...)

첫 번째 페이지 테이블을 0x17000 에 놓았습니다...

cr3 에 올린 내용은 0x16000

페이지 디렉토리 첫 번째 엔트리 0x17003

첫 번째 페이지 테이블들의 엔트리는,

일단은 0 부터 커널 이미지와 페이지 테이블들이 올려져 있는 0x17000 까지와 0xa0000 ~ 0x100000 까지를 맵시켜놨습니다...

이래놓고 페이징을 켜면 바로 리부팅이 됩니다...-_-;

혹시나 cr3 나 페이지 디렉토리나 페이지 테이블들의 내용이 틀렸나해서 확인해봤는데 제가 원하는 값이 그대로 들어가있습니다...

대체 왜 안 될까요? 고수님들 도와주세요~!

kkojiband의 이미지

휴...아무리 책을 찾아봐도 틀린 걸 못 찾겠습니다...

페이징 구현해 보신 분들 도와주세요~ T.T

이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~

sliver의 이미지

원래 제 코드에서 페이징 부분만 간추린 것입니다.
pageDir에는 page directory의 주소가,
pageTable에는 첫번째 page table의 주소가 들어있다고 가정합니다.
0~memorySize부분을 1:1 매핑을 하게 되는데,
0~0xA0000는 그냥 매핑하고
0xA0000~1MB는 no cache옵션을 더 줘서 매핑합니다.
1MB~memorySize또한 그냥 매핑합니다.

  U32 *pt;
  for(int i=0;i<memorySize/PAGE_SIZE;i++) {
      if(i%1024==0) {
          pageDir[i/1024] = pageTable|PAGE_PRESENT|PAGE_USER|PAGE_WRITE;
          pt = reinterpret_cast<U32 *>(pageTable);
          pageTable+=PAGE_SIZE;
      }
      pt[i%1024] = (i<<PAGE_SHIFT)|PAGE_WRITE|PAGE_PRESENT;
      if(i>=0xA0000/PAGE_SIZE && i<(1<<20)/PAGE_SIZE) {
          pt[i%1024] |= PAGE_NOCACHE;
      }
          	
  }
  asm volatile (
      "movl %0,%%cr3\n\t"
      "movl %%cr0,%%eax\n\t"
      "orl $0x80000000,%%eax\n\t"
      "movl %%eax,%%cr0\n\t"
      "nop; nop; nop; nop" : :"a"(pageDir));
kkojiband의 이미지

먼저, 답변 감사드립니다!

제가 원래 사용하고 있는 부분만 페이지 테이블에 매핑을 시켜놨었는데, 1mb 이하 영역을 모두 페이지 테이블에 매핑을 시키니 되네요...음...

그러니까 0번째 페이지 테이블을 보면,

0~17까지는 물리주소와 1:1 매핑시키고,

17~a0 까지는 0, a0~100 까지는 다시 1:1...

이런식으로 매핑시키면 안되는건가요? 왜 이렇게 하면 안되는걸까요?

솔직히 왜 안됐었는지 이유를 모르겠습니다...

0으로 설정된 부분을 참조해서 페이지 폴트나 머 이런게 잘못되서 안된것도 아니고, 단지 페이징을 켜자마자 위의 이유로(?) 바로 리부팅이 되니...음...

혹시 이유를 아시면 가르쳐주세요~ 감사감사~!

이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~

sliver의 이미지

이유가 있다면 매핑되지 않은 페이지를 접근한 경우 밖에 없을 듯 한데요.

근데 사용하는 부분은 다 매핑했다고 하시니..

real machine에서 하지 마시고 bochs받아서 디버깅모드에서 돌려보세요.

인스트럭션 하나하나 수행할 수도 있습니다.

에러나면 그에 대한 정보도 보여주고요..

kkojiband의 이미지

답변 감사드립니다~!

나중에 bochs 받아서 다시 테스트를 해봐야겠군요...

그럼 나중에 해보고 안되면 다시 질문드리겠습니다~ 꾸벅~!

이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~

atlacpi의 이미지

pgtbl중간에 빈영역이 있다고 죽는건 아닌데..

아마도 어디선가 17~a0 까지를 억세스하는 부분이 있겠죠..

일단 system.map하나 만들어서 보세요 자세히 나오잖아여..
makefile에서

$(KERNEL) : $(KERNEL_OBJS)
	$(LD) $(LDFLAGS) -o $@ \
	$(KERNEL_OBJS) > System.map

LDFLAGS는 "LDFLAGS = -M --oformat binary -Ttext 0x100000" 이렇게 선언했습니다. 간단하게나마 debugging이 가능할듯합니다.

앞으로도 많이 남으신거 같은데 고생문이 보입니다. 암튼 수고 하시고요, 진행사항 자주올려 주세요.. 필요하신 자료있으면 적극적으로 보내드리겠습니다.--;
수고 하세요...

Vm~*

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.