보호 모드 관련 또 질문드립니다...-_-;

kkojiband의 이미지

정확히 에러가 나는 곳은 세그먼트 셀럭터가 로드 되는 부분들입니다...

jump 시나,

mov ax, 18h
mov ds, ax

이런 식으로 바꾸면 바로 리부팅이 되어버립니다...

아무리봐도 왜 안되는지 이유를 모르겠습니다...T.T

codebank의 이미지

이전 질문에 첫번째 답변에 답이 있는걸로 보입니다.
즉, 32bits 디스크립터를 설정하는 부분에서 값이 틀리게 들어간것 같습니다.
gdt 값을 설정한것을보면
code read나 exec는 9A00으로 들어가야하는데 질문하신분은 8A00으로 설정을
한것 같네요.
또한 data read/write는 9200으로 설정해야하는데 8200으로 설정을 했습니다.
이부분때문에 정확한 보호모드로 진입을하지 못한것 같습니다.
본 내용은 /usr/src/linux/arch/i386/boot/setup.S의 1007라인에 있는 소스입니다.

# Descriptor tables
gdt:
        .word   0, 0, 0, 0                      # dummy
        .word   0, 0, 0, 0                      # unused

        .word   0xFFFF                          # 4Gb - (0x100000*0x1000 = 4Gb)
        .word   0                               # base address = 0
        .word   0x9A00                          # code read/exec
        .word   0x00CF                          # granularity = 4096, 386
                                                #  (+5th nibble of limit)

        .word   0xFFFF                          # 4Gb - (0x100000*0x1000 = 4Gb)
        .word   0                               # base address = 0
        .word   0x9200                          # data read/write
        .word   0x00CF                          # granularity = 4096, 386
                                                #  (+5th nibble of limit)

저 값이 잘못 설정되면 먼저번 답변자 말씀대로 리붓될 수도 있습니다.

------------------------------
좋은 하루 되세요.

kkojiband의 이미지

님께서 지적해주신 건 수정했었습니다...^^;

근데도 안되요...T.T

존 파인씨 홈페이지 가서 받은 코드랑 리눅스 setup.S 코드랑 비교해가면서 수정할것들 수정했는데도 안됩니다...T.T

vmware 가 잘못된건 아닐테고...대체 왜 안될까요...으악...T.T

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

익명 사용자의 이미지

kkojiband wrote:
vmware 가 잘못된건 아닐테고...대체 왜 안될까요...으악...T.T

원인이 먼곳이 있지 않을수 있겠네요.
정말로 vmware가 보호모드로 진입하는 코드를 무시할수 있을까요?

sliver의 이미지

원글에다가 답글 달았으니 보세요.

gdt의 base를 잘못 설정하셨더군요..

kkojiband의 이미지

그것도 수정했었습니다...-_-;

근데도 안됩니다...T.T

그리고 vmware 문제는 혹시나해서 디스켓 넣고 컴퓨터 자체를 리부팅시켜보니 결과는 똑같았습니다...vmware 의 문제는 아닌듯...차라리 그랬으면 좋으련만...-_-;

근데 만약에 보호 모드로 진입하고나서 far jump 로 cs 셋업하고나서부터는 16bit 어셈 코드 사용은 바로 리부팅인가요??

아무리 생각해봐도 원인은 그거밖에 없는듯해서요...

nasm 사용하는데 그냥 32bit 코드로 사용할 곳 앞에 'bits 32' 만 붙이고 컴파일해서 사용하고 있거든요...

- run.asm

bits 32
   mov ax, 18h            ; 데이타 셀렉터 번호
   mov ds, ax
   mov es, ax

   mov edi, 0B8000h
 
   mov al, 'Q'
 
   stosb

hang:
   jmp hang

그냥 간단히 이런 식으로 만들어서, nasm -o run run.asm 으로해서 사용하고 있습니다...

밑에 흑기사님께서 nasm 이 디폴트 옵션으로 elf 실행 파일을 만들준다고 하셨는데...

제가 위와 같이 컴파일해서 ndisasm run 해보니까 elf 헤더가 추가된게 전혀없이 그냥 제가 만든 코드만 들어있더라구요...

섹션 설정이 없어도 최소한 elf 헤더는 들어가있어야 되는거 아닌가요?? 제 컴터가 절 거부하는건지 암튼 이상해요...-_-;

여기저기 찾아봐도 32bit 코드를 사용하라고 나오던데, 아무래도 그 문제밖에 없는거같습니다...제가 32bit 코드로 컴파일하는데 문제가 있는듯...

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

Necromancer의 이미지

cr0 PE비트 세팅하는 전후방 쪽에 jmp $등의 명령어를 집어넣어서
시스템 다운 여부를 알아보는 겁니다.
또 스피커 소리나게 하는 방법도 있습니다.
아마 아래의 코드로 될겁니다. (후방에 jmp $등을 같이 집어넣으세요)

  in al,61h
  or al,3
  out 61h,al

아쉽게도 제가 알기론 보호모드 프로그래밍의 디버깅 방법은 이걸로 의심이 가는
부분 근방에 놓아서 반응을 지켜보는거 외는 전혀 없습니다...
레지스터 덤프코드 집어넣으면 금상첨화입니다만 보호모드 전환하는
핵심부 쪽에서는 이거 해도 잘 안되는 경우도 많죠.

그리고 먼저 16비트 코드부터 실험해보시고 차근차근 하시는게.

하나더..
nasm 매뉴얼 보니까 디폴트 오브젝트 포맷은 bin이네요. 제가 잘못 봤습니다.

Written By the Black Knight of Destruction

익명 사용자의 이미지

아무래도 gdt 주소가 잘못 설정되어서 그런 것 같습니다. 그런데 굳이 실제 모드쪽과 보호 모드 쪽을 파일 두개로 나눌 필요가 있는지 모르겠네요. 보호 모드 전환한 다음 바로 밑의 레이블로 far jump 한번하면 되는데...

charsyam의 이미지

방준영 wrote:
아무래도 gdt 주소가 잘못 설정되어서 그런 것 같습니다. 그런데 굳이 실제 모드쪽과 보호 모드 쪽을 파일 두개로 나눌 필요가 있는지 모르겠네요. 보호 모드 전환한 다음 바로 밑의 레이블로 far jump 한번하면 되는데...

아마도, 어셈 코드에서 C 코드로 넘어갈려고 그러는게 아닐까요?
음... 그럼 고운 하루

=========================
CharSyam ^^ --- 고운 하루
=========================

익명 사용자의 이미지

저도 부팅하면 자꾸 재부팅 됐는데 jmp $로 디버깅해보고 수정하였습니다.

'만들면서 배우는 OS커널의 구조와 원리'(한빛미디어, 김범준)에서 발췌
...

lgdt[gdtr]

mov eax, cr0
or eax, 0x00000001
mov cr0, eax

jmp $+2 -> jmp $+3
nop -> nop
nop -> nop
-> nop

;far jmp;
db 0x66
db 0x67
db 0xEA
dd PM_Start
dw SysCodeSelector

...

위 코드를 이렇게 수정하니 잘되더군요. 정확한 원인은 모르겠지만 모드 전환후에는 충분히 명령어를 넘겨줘야 하는 모양입니다. Necromancer님 좋은 조언 감사합니다.

하여튼, 다음 사람에게 도움이 되면 좋겠네요.

juyolkim의 이미지

저도 부팅하면 자꾸 재부팅 됐는데 jmp $로 디버깅해보고 수정하였습니다.

'만들면서 배우는 OS커널의 구조와 원리'(한빛미디어, 김범준)에서 발췌
...

lgdt[gdtr]

mov eax, cr0
or eax, 0x00000001
mov cr0, eax

jmp $+2 -> jmp $+3
nop -> nop
nop -> nop
-> nop

;far jmp;
db 0x66
db 0x67
db 0xEA
dd PM_Start
dw SysCodeSelector

...

위 코드를 이렇게 수정하니 잘되더군요. 정확한 원인은 모르겠지만 모드 전환후에는 충분히 명령어를 넘겨줘야 하는 모양입니다. Necromancer님 좋은 조언 감사합니다.

하여튼, 다음 사람에게 도움이 되면 좋겠네요.

kws4679의 이미지

인텔 개발자 매뉴얼 보시면 보호모드로 진입 후에는 반드시 jmp 하라고 나와있다고 합니다 (저는 책에서 봤습니다)

gdt 설정후 그다음에 예를들어

jmp pipelineflush

pipelineflush:
mov...

하라고 하는군요

댓글 달기

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