Trzeba byc mna, zeby cos takiego sknocic.
Powiedzmy, ze chce napisac bootsektor, ktory zaladuje kernela i go uruchomi, a ten zapisze cos w pamieci wideo pod adresem 0x0B8000 (tryb tekstowy), wiec najnormalniej laduje kod kernela pod 0x8000 (przed pmode, wiec bios pomoze :)) ustawiam gdt (kod nizej), przestawiam cr0 i skacze (long) do kernela, ktory po prostu umieszcza cos pod 0x0B8000 (mov byte [0x0B8000], '1' - NASM) i zapetla sie.
Niby proste, ale na ekranie nic sie pokazuje. Zrobilem wszystko co mi przychodzilo do glowy, sprawdzalem gdt, ladowalem ja przed i po ustawieniu cr0, skakalem przez jmp, jmp long, ret. Dodam, ze kod kernela sie uruchamia prawidlowo.
gdt:
; NULL Descriptor
dd 0
dd 0
; CODE, BASE:0, LIMIT: 4GB, DPL:0
dw 0xFFFF ; low word of limit
dw 0 ; low word of base
db 0 ; low byte of high word of base
db 10011010b ; code exec-read
db 11001111b ; flags and 4 bits of limit
db 0 ; highest byte of base
; DATA R/W, BASE:0, LIMIT: 4GB, DPL:0
dw 0xFFFF ; low word of limit
dw 0 ; low word of base
db 0 ; low byte of high word of base
db 10010010b ; data read/write
db 11001111b ; flags and 4 bits of limit
db 0 ; highest byte of base
gdt_end:
gdt_descr:
dw gdt_end - gdt - 1 ; gdt size
dd gdt ; address of the gdt