이전 질문에 첫번째 답변에 답이 있는걸로 보입니다.
즉, 32bits 디스크립터를 설정하는 부분에서 값이 틀리게 들어간것 같습니다.
gdt 값을 설정한것을보면
code read나 exec는 9A00으로 들어가야하는데 질문하신분은 8A00으로 설정을
한것 같네요.
또한 data read/write는 9200으로 설정해야하는데 8200으로 설정을 했습니다.
이부분때문에 정확한 보호모드로 진입을하지 못한것 같습니다.
본 내용은 /usr/src/linux/arch/i386/boot/setup.S의 1007라인에 있는 소스입니다.
이전 답변을 다시 읽어보세요.
이전 질문에 첫번째 답변에 답이 있는걸로 보입니다.
즉, 32bits 디스크립터를 설정하는 부분에서 값이 틀리게 들어간것 같습니다.
gdt 값을 설정한것을보면
code read나 exec는 9A00으로 들어가야하는데 질문하신분은 8A00으로 설정을
한것 같네요.
또한 data read/write는 9200으로 설정해야하는데 8200으로 설정을 했습니다.
이부분때문에 정확한 보호모드로 진입을하지 못한것 같습니다.
본 내용은 /usr/src/linux/arch/i386/boot/setup.S의 1007라인에 있는 소스입니다.
저 값이 잘못 설정되면 먼저번 답변자 말씀대로 리붓될 수도 있습니다.
------------------------------
좋은 하루 되세요.
님께서 지적해주신 건 수정했었습니다...^^;근데도 안되요...T
님께서 지적해주신 건 수정했었습니다...^^;
근데도 안되요...T.T
존 파인씨 홈페이지 가서 받은 코드랑 리눅스 setup.S 코드랑 비교해가면서 수정할것들 수정했는데도 안됩니다...T.T
vmware 가 잘못된건 아닐테고...대체 왜 안될까요...으악...T.T
이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~
[quote="kkojiband"]vmware 가 잘못된건 아닐테고...
원인이 먼곳이 있지 않을수 있겠네요.
정말로 vmware가 보호모드로 진입하는 코드를 무시할수 있을까요?
원글에다가 답글 달았으니 보세요.gdt의 base를 잘못 설정하셨
원글에다가 답글 달았으니 보세요.
gdt의 base를 잘못 설정하셨더군요..
그것도 수정했었습니다...-_-;근데도 안됩니다...T.T
그것도 수정했었습니다...-_-;
근데도 안됩니다...T.T
그리고 vmware 문제는 혹시나해서 디스켓 넣고 컴퓨터 자체를 리부팅시켜보니 결과는 똑같았습니다...vmware 의 문제는 아닌듯...차라리 그랬으면 좋으련만...-_-;
근데 만약에 보호 모드로 진입하고나서 far jump 로 cs 셋업하고나서부터는 16bit 어셈 코드 사용은 바로 리부팅인가요??
아무리 생각해봐도 원인은 그거밖에 없는듯해서요...
nasm 사용하는데 그냥 32bit 코드로 사용할 곳 앞에 'bits 32' 만 붙이고 컴파일해서 사용하고 있거든요...
- run.asm
그냥 간단히 이런 식으로 만들어서, nasm -o run run.asm 으로해서 사용하고 있습니다...
밑에 흑기사님께서 nasm 이 디폴트 옵션으로 elf 실행 파일을 만들준다고 하셨는데...
제가 위와 같이 컴파일해서 ndisasm run 해보니까 elf 헤더가 추가된게 전혀없이 그냥 제가 만든 코드만 들어있더라구요...
섹션 설정이 없어도 최소한 elf 헤더는 들어가있어야 되는거 아닌가요?? 제 컴터가 절 거부하는건지 암튼 이상해요...-_-;
여기저기 찾아봐도 32bit 코드를 사용하라고 나오던데, 아무래도 그 문제밖에 없는거같습니다...제가 32bit 코드로 컴파일하는데 문제가 있는듯...
이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~
일단 해볼것은...
cr0 PE비트 세팅하는 전후방 쪽에 jmp $등의 명령어를 집어넣어서
시스템 다운 여부를 알아보는 겁니다.
또 스피커 소리나게 하는 방법도 있습니다.
아마 아래의 코드로 될겁니다. (후방에 jmp $등을 같이 집어넣으세요)
아쉽게도 제가 알기론 보호모드 프로그래밍의 디버깅 방법은 이걸로 의심이 가는
부분 근방에 놓아서 반응을 지켜보는거 외는 전혀 없습니다...
레지스터 덤프코드 집어넣으면 금상첨화입니다만 보호모드 전환하는
핵심부 쪽에서는 이거 해도 잘 안되는 경우도 많죠.
그리고 먼저 16비트 코드부터 실험해보시고 차근차근 하시는게.
하나더..
nasm 매뉴얼 보니까 디폴트 오브젝트 포맷은 bin이네요. 제가 잘못 봤습니다.
Written By the Black Knight of Destruction
아무래도 gdt 주소가 잘못 설정되어서 그런 것 같습니다. 그런데 굳이
아무래도 gdt 주소가 잘못 설정되어서 그런 것 같습니다. 그런데 굳이 실제 모드쪽과 보호 모드 쪽을 파일 두개로 나눌 필요가 있는지 모르겠네요. 보호 모드 전환한 다음 바로 밑의 레이블로 far jump 한번하면 되는데...
[quote="방준영"]아무래도 gdt 주소가 잘못 설정되어서 그런 것
아마도, 어셈 코드에서 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님 좋은 조언 감사합니다.
하여튼, 다음 사람에게 도움이 되면 좋겠네요.
저도 같은 증상이었는데 이글 덕분에 해결했네요
저도 부팅하면 자꾸 재부팅 됐는데 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님 좋은 조언 감사합니다.
하여튼, 다음 사람에게 도움이 되면 좋겠네요.
인텔 개발자 메뉴얼 보시면
인텔 개발자 매뉴얼 보시면 보호모드로 진입 후에는 반드시 jmp 하라고 나와있다고 합니다 (저는 책에서 봤습니다)
gdt 설정후 그다음에 예를들어
jmp pipelineflush
pipelineflush:
mov...
하라고 하는군요
댓글 달기