Къде ми е грешката? ...
4 отговора
563 прегледа
Къде ми е грешката? ...
... Защо следният код не кара процесора да мине под 32 битов режим ами се рестартира ????????
[ORG 0]
[BITS 16]
jmp _start
gdt:
;# Null Descriptor
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
;# Code Descriptor
dw 0xFFFF
dw 0x0000
dw 0x9A00
dw 0x00CF
;# Data Descriptor
dw 0xFFFF
dw 0x0000
dw 0x9200
dw 0x00CF
;# Stack Descriptor
dw 0xFFFF
dw 0x0000
dw 0x9700
dw 0x00CF
;# Video Descriptor
dw 0xFFFF
dw 0x8000
dw 0x920B
dw 0x0040
gdt_table:
dw 0x200
dd gdt
_start:
mov ax,0x9000
mov ds,ax
mov es,ax
cli
mov ss,ax
mov sp,0xFFFF
lgdt [gdt_table]
;# Enable A20 Gate
_enable_a20:
call .1
mov al,0xD1
out 0x64,al
call .1
mov al,0xDF
out 0x60,al
call .1
mov al,0x02
out 0x92,al
sti
jmp _pmode
.1:
in al,0x64
test al,0x02
jnz .1
ret
_pmode:
mov eax,cr0
or al,1
mov cr0,eax
jmp 0x8:_32mode
[BITS 32]
_32mode:
mov ax,0x10
mov ds,ax
mov es,ax
mov ss,ax
_main:
halt
jmp short $
Кодът се зарежда на адрес 0х9000.
Според мен причината НЕ е в halt, а по скоро в lgdt.
За компилация се използва NASM 0.98.35 или нещо такова...
[ORG 0]
[BITS 16]
jmp _start
gdt:
;# Null Descriptor
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
;# Code Descriptor
dw 0xFFFF
dw 0x0000
dw 0x9A00
dw 0x00CF
;# Data Descriptor
dw 0xFFFF
dw 0x0000
dw 0x9200
dw 0x00CF
;# Stack Descriptor
dw 0xFFFF
dw 0x0000
dw 0x9700
dw 0x00CF
;# Video Descriptor
dw 0xFFFF
dw 0x8000
dw 0x920B
dw 0x0040
gdt_table:
dw 0x200
dd gdt
_start:
mov ax,0x9000
mov ds,ax
mov es,ax
cli
mov ss,ax
mov sp,0xFFFF
lgdt [gdt_table]
;# Enable A20 Gate
_enable_a20:
call .1
mov al,0xD1
out 0x64,al
call .1
mov al,0xDF
out 0x60,al
call .1
mov al,0x02
out 0x92,al
sti
jmp _pmode
.1:
in al,0x64
test al,0x02
jnz .1
ret
_pmode:
mov eax,cr0
or al,1
mov cr0,eax
jmp 0x8:_32mode
[BITS 32]
_32mode:
mov ax,0x10
mov ds,ax
mov es,ax
mov ss,ax
_main:
halt
jmp short $
Кодът се зарежда на адрес 0х9000.
Според мен причината НЕ е в halt, а по скоро в lgdt.
За компилация се използва NASM 0.98.35 или нещо такова...
Re: Къде ми е грешката? ...
Последните няколко седмици и аз се занимавам с това ... даи маил да ти прата няколко документации .... виж също:
avenger.webgroup-bg.com
Все още е демо версия ... но вече имам много свободно време и ще го пооправя скоро .... на Операциони ситеми съм сложил няколко линка точно по този въпрос ... има и сорс ... при мен всичко работи без проблем ... боотна си от дискета, превключва в пмоде ... и т.н.
Надявам се ако намериш нещо друго ценно да копи/пеист натам ... а също и линковете да ти бъдат полезни ;)
По този въпрос съществуват две мнения. Едното е неправилно, а другото е моето.
avenger.webgroup-bg.com
Все още е демо версия ... но вече имам много свободно време и ще го пооправя скоро .... на Операциони ситеми съм сложил няколко линка точно по този въпрос ... има и сорс ... при мен всичко работи без проблем ... боотна си от дискета, превключва в пмоде ... и т.н.
Надявам се ако намериш нещо друго ценно да копи/пеист натам ... а също и линковете да ти бъдат полезни ;)
По този въпрос съществуват две мнения. Едното е неправилно, а другото е моето.
Re: Къде ми е грешката? ...
Zavisi na kakyv procesor i bios go prawish. Nqkoi procesori nqma da go ponesat dobre.
Re: Къде ми е грешката? ...
CPU-то е най-малко 386, като този код съм го пускал на Pentium 4 2,4GHz и Celeron 850. И при двата, при задействането на кода за преминаване в защитен режим, компютъра незабавно се рестартира. Не мога да разбера дали проблема е в GDT или начина по който се пуска в Protect Mode.
В други сорсове съм виждал да се преминава в PM на два пъти. Обикновено след първия път веднага се връща в RM, прочитат се необходимите сектори (става въпрос за BOOT часта) и отново се преминава в PM. Това не мога да разбера.
Ако някой се занимава с писане на този тип код и открие някаква грешка умолявам да пише, защото точно това ми спъва цялата работа
В други сорсове съм виждал да се преминава в PM на два пъти. Обикновено след първия път веднага се връща в RM, прочитат се необходимите сектори (става въпрос за BOOT часта) и отново се преминава в PM. Това не мога да разбера.
Ако някой се занимава с писане на този тип код и открие някаква грешка умолявам да пише, защото точно това ми спъва цялата работа