페이징 초기화/실행시...?
글쓴이: kkojiband / 작성시간: 수, 2003/08/06 - 3:00오후
안녕하세요! 간만에 질문 올립니다! ^^;
간단한 키보드 핸들러까지 만들고 이제 페이징을 구현하려고 하는데요,
역시나 보호 모드 처음 진입할때처럼 헤매고 있습니다...--;
일단 제가 구성해놓은 내용은,
페이지 디렉토리를 0x16000 에다가 놓고,
(커널이미지가 0x1000 ~ 0x15000 에 놓여있어서...)
첫 번째 페이지 테이블을 0x17000 에 놓았습니다...
cr3 에 올린 내용은 0x16000
페이지 디렉토리 첫 번째 엔트리 0x17003
첫 번째 페이지 테이블들의 엔트리는,
일단은 0 부터 커널 이미지와 페이지 테이블들이 올려져 있는 0x17000 까지와 0xa0000 ~ 0x100000 까지를 맵시켜놨습니다...
이래놓고 페이징을 켜면 바로 리부팅이 됩니다...-_-;
혹시나 cr3 나 페이지 디렉토리나 페이지 테이블들의 내용이 틀렸나해서 확인해봤는데 제가 원하는 값이 그대로 들어가있습니다...
대체 왜 안 될까요? 고수님들 도와주세요~!
Forums:


휴...아무리 책을 찾아봐도 틀린 걸 못 찾겠습니다...페이징 구
휴...아무리 책을 찾아봐도 틀린 걸 못 찾겠습니다...
페이징 구현해 보신 분들 도와주세요~ T.T
이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~
원래 제 코드에서 페이징 부분만 간추린 것입니다.pageDir에는 p
원래 제 코드에서 페이징 부분만 간추린 것입니다.
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));먼저, 답변 감사드립니다!제가 원래 사용하고 있는 부분만 페이지
먼저, 답변 감사드립니다!
제가 원래 사용하고 있는 부분만 페이지 테이블에 매핑을 시켜놨었는데, 1mb 이하 영역을 모두 페이지 테이블에 매핑을 시키니 되네요...음...
그러니까 0번째 페이지 테이블을 보면,
0~17까지는 물리주소와 1:1 매핑시키고,
17~a0 까지는 0, a0~100 까지는 다시 1:1...
이런식으로 매핑시키면 안되는건가요? 왜 이렇게 하면 안되는걸까요?
솔직히 왜 안됐었는지 이유를 모르겠습니다...
0으로 설정된 부분을 참조해서 페이지 폴트나 머 이런게 잘못되서 안된것도 아니고, 단지 페이징을 켜자마자 위의 이유로(?) 바로 리부팅이 되니...음...
혹시 이유를 아시면 가르쳐주세요~ 감사감사~!
이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~
이유가 있다면 매핑되지 않은 페이지를 접근한 경우 밖에 없을 듯 한데요.
이유가 있다면 매핑되지 않은 페이지를 접근한 경우 밖에 없을 듯 한데요.
근데 사용하는 부분은 다 매핑했다고 하시니..
real machine에서 하지 마시고 bochs받아서 디버깅모드에서 돌려보세요.
인스트럭션 하나하나 수행할 수도 있습니다.
에러나면 그에 대한 정보도 보여주고요..
답변 감사드립니다~! 나중에 bochs 받아서 다시 테스트를 해봐
답변 감사드립니다~!
나중에 bochs 받아서 다시 테스트를 해봐야겠군요...
그럼 나중에 해보고 안되면 다시 질문드리겠습니다~ 꾸벅~!
이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~
훔..
pgtbl중간에 빈영역이 있다고 죽는건 아닌데..
아마도 어디선가 17~a0 까지를 억세스하는 부분이 있겠죠..
일단 system.map하나 만들어서 보세요 자세히 나오잖아여..
makefile에서
LDFLAGS는 "LDFLAGS = -M --oformat binary -Ttext 0x100000" 이렇게 선언했습니다. 간단하게나마 debugging이 가능할듯합니다.
앞으로도 많이 남으신거 같은데 고생문이 보입니다. 암튼 수고 하시고요, 진행사항 자주올려 주세요.. 필요하신 자료있으면 적극적으로 보내드리겠습니다.--;
수고 하세요...
Vm~*
댓글 달기