페이징 초기화/실행시...?
글쓴이: 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또한 그냥 매핑합니다.
먼저, 답변 감사드립니다!제가 원래 사용하고 있는 부분만 페이지
먼저, 답변 감사드립니다!
제가 원래 사용하고 있는 부분만 페이지 테이블에 매핑을 시켜놨었는데, 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~*
댓글 달기