안녕하세요? 보호모드와 페이징에 관한 질문입니다.

kdzm8id의 이미지

안녕하세요?
보호모드와 페이징에 관한 질문입니다.
페이징을 사용한 보호모드에서, 간단히 메모리로의 대입 등을 하려고 하는데요.(예를 들면 16비트 세그먼트 0xb800을 통해 글자를 쓴다든지.)
저는 다음과 같은 절차를 거쳤습니다.
처음 프로그램이 실행될때 코드,데이터세그먼트는 16비트 0x1000임을 가정하겠습니다.

1.물리주소 0x00000000에서 4kb페이지 디렉토리를 만들고,
1023번째 디렉토리에 0x00001003이라고 썼어요. 나머지는 전부 0이라고 썼습니다.

2.물리주소 0x00001000에서 4kb페이지 테이블을 만들고,
페이지 테이블의 각 구성요소에 0x00000000 ~ 0x003FF000물리주소를 차례대로 썼어요.(총실제메모리가 4메가) 플래그는 RW 와 P만 켰습니다.

3.코드,데이터,스택 세그먼트등등을 페이지주소에 맞춰서, GDT에 썼습니다. 코드세그먼트의 시작위치같은 경우, 0xFFC10000으로 썼습니다.

4.GDTR의, GDT위치를 적는곳에 페이지 주소를 썼습니다. IDTR도 마찬가지이고요. 지금같은경우, GDTR에 적는 GDT의 위치는 0xFFC10000 + GDT(프로그램안의 상대GDT시작위치)로 썼습니다.

5.cr3레지스터에 0x00000000을 썼습니다. 페이지디렉토리의 물리주소가 0이고 cr3비트의 나머지 플래그들은 다 껐습니다.

6.cr0레지스터에서 or ... , 0x80000001을 사용해서 페이지 기능과 보호모드 기능을 한꺼번에 켰습니다.

7.그리고 jmp 코드세그먼트셀렉터:32비트코드시작위치 와 같이 했습니다.

이상과 같이 했는데요, 저의 문제는 위와 같이 하니깐 프로그램이 제대로 움직이지 않더라는것인데요. 어떻게 해결방법이 없나요? 혹시 빠뜨린게 있는지도 궁금하고요.

죄송하지만, 아시는분들께서는 리눅스커널등을 참조하라는 식으로 말고, 직접 구체적으로 답변을 좀 해주셨으면 고맙겠습니다.

날씨 더운데 읽어주셔서 감사하고요, 즐거운 하루 되세요.

p.s.페이징을 사용하지 않고 그냥 선형주소방식으로는 했는데, 페이징은 잘 안되네요.

Necromancer의 이미지

물리주소 0-0x3ff까지는 리얼모드 INT 핸들러 테이블입니다.
리얼모드에서 이들을 잘못 건들면 INT 처리가 엉망으로 됩니다. 당연히 시스템
다운입니다. (IRQ도 이들 테이블에 같이 매핑되며, 특히 irq0 타이머
같은 경우는 별다른 작업 안해도 1초에 18.2회씩 수시로 발생합니다.
설정에 따라서 달라지긴 하지만)

또 물리주소 0xa0000 이상의 영역은 롬바이오스나 장치드라이버
IO 등에 쓰이고요.

그외에도 바이오스 데이터 영역이라고 해서 INT 테이블 바로 뒤에
위치하는 영역이 있고 또 확장 바이오스 데이터 영역이라고 해서
0xa0000 이전에 위치하는 영역이 있습니다.
보호모드 구조체를 다 만들 때는 이들 영역을 다 피해야 합니다.

Written By the Black Knight of Destruction

kkamagui의 이미지

3.코드,데이터,스택 세그먼트등등을 페이지주소에 맞춰서, GDT에 썼습니다. 코드세그먼트의 시작위치같은 경우, 0xFFC10000으로 썼습니다.

=> 허접 까마굼니다..

흐음.. GDT의 제생각에는 코드 세그먼트 시작위치가.. 잘못된거 같습니다..

0x1000이.. 코드가 시작하는 위치라 했으면..

코드 세그먼트의 시작위치는 0xFFC10000 이 아니라..

0x00010000 이 되어야 하지 않나요??

만약 님이 0xFFC10000 으로 쓰시고 싶다면..

페이지 디렉토리와 테이블에.. 0xFFC10000의 로지컬 주소가..

0x10000의 물리 주소에 맵핑이 되어야 하겠죠.. ^^

0x10000으로 설정하고.. 해보십시오..

그럼.. 좋은하루 되시구요..

이만..

kdzm8id의 이미지

제가 구상한 그대로가 맞습니다.
일단 16비트 인터럽트 테이블은 전혀 고려할 문제가 아니라는걸 먼저 말씀드리고 싶고요. 문제삼으신 인터럽트 벡터테이블은 인터럽트 디스크립터 테이블로 대체되거니와, 실행될 인터럽트도 바꿀수가 있거든요.

둘째로 제가 구상한 페이지스토리대로의 상황을 가정할때 0x00010000을 코드세그먼트로 해서는 안되는 이유는,
그것은 물리주소이지 페이지주소가 아니기 때문입니다. 1023번 페이지 디렉토리 전체가 0x00000000 ~ 0x003FFFFF의 물리주소를 가리키는 페이지 테이블을 가리키고 있기때문에, 페이지주소 0xFFC10000은 물리주소 0x00010000을 가리키는게 맞습니다.

여하튼 날씨도 더운데 관심가져주셔서 고맙습니다.
제가 궁금했던것은, 페이지에 대한 이해보다는 16비트모드에서 32비트페이지기능을 허용하는 보호모드로 들어가는 절차가 궁금했거든요.

댓글 달기

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