[asm] pmode i pamiec wideo

0

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
0

u mnie to wyglada tak:

/* 32bit data /
gdt: /
Global Descriptor Table /
.word 3 * 8 - 1
.long _gdt
_gdt:
.long 0,0
.long 0x0000ffff,0x00cf9a00 /
code descriptor: base=0 limit=4GB DPL=0 /
.long 0x0000ffff,0x00cf9200 /
data descriptor: base=0 limit=4gb DPL=0 */

Kod ładuje pod 0x10000

Skok :

lgdt gdt
cli
mov %cr0,%eax
or $1,%eax
mov %eax,%cr0
ljmp $8,$entry32

Czyli normalnie po bozemu :P

PS. S<ort>proboj</ort> przetestowac kody pod bochs'em z tego wzgledu ze moze ci skakac nie tam gdzie trzeba a wtedy bochs sam ci wywali odpowiedni blad i bedziesz wiedzial co sie dzieje...

0

Skacze dobrze bo kernel sie wykonuje, bochs dziala bez bledow, konczy na jmp $, czy hlt, jak kto woli, tylko pamiec jakby nie ta, na ekranie ani sladu a wartosc sie zapisuje (tj moge zapisac, odczytac)

0

Ja miałem podobny problem. Kernel był napisany dobrze, jednak po wykonaniu nic się nie działo. Mimo że komputer się nie resetował skok odbywał się z nieprawidłowe miejsce.

Nie jestem tego pewien, ale kernel trzeba zacząć od jakiegoś offsetu i skoczyć pod ten adres 0x8:Offset. Ale powtarzam TO SĄ TYLKO MOJE PRZYPUSZCZENIA

0

Skacze chyba ok, bo moge zrobic taki manewr, przed pmode zapisuje do jakiegos rejestru segmentowego b800 i potem moge spokojnie wg niego zapisac cos do pamieci (ta juz wskazuje prawidlowo na ekran).

1 użytkowników online, w tym zalogowanych: 0, gości: 1