W O J S K O W A A K A D E M I A T E C H N I C Z N A
Wydział Cybernetyki
Kierunek: Informatyka
Laboratorium Systemów Wbudowanych
Temat:
Konfiguracja oprogramowania firmowego.
WAT 2008
Poniższy program dokonuje przejścia w tryb PROTECTED, wykonaniu jednej procedury i
powrocie do trybu REAL wraz z zakończeniem programu.
[BITS 16]
[ORG 0x7C00]
cli
W tym miejscu następuje wyłączenie przerwań. Normalnie aby zaimplementować
przerwania w trybie PROTECTED należało by załadować tablice IDTR ale w naszym
programie przerwania są nie wykorzystywane.
xor ax, ax
mov ds, ax
W tym miejscu następuje zerowanie DS. Będzie on nam potrzebny w dalszej części
programu gdy załadujemy odpowiednie deskryptory.
lgdt [gdt_desc]
Lgdt to polecenie które ładuje globalną tablice deskryptorów. [gdt_desc] to pseudo
deskryptor. Na jego temat powiemy co nieco więcej pod koniec programu.
mov eax, cr0
or eax, 1
mov cr0, eax
Ten mały fragment kodu to właściwie przejście w tryb PROTECTED. Rejestr CR0 zostaje
zapisany wartością jeden co daje sygnał procesorowi że nastąpiła zmiana dotychczasowego
trybu pracy.
jmp 08h:DoProtect
W tym miejscu realizowany jest skok daleki. Jest to bardzo ważne ponieważ w momencie
wykonania tego rozkazu oczyszczana jest dotychczasowa kolejka rozkazów. Proszę nie
zapominać że do niedawna procesor pracował w trybie REAL a więc wszystkie rozkazy były
wykonywane na 16 bitowych rejestrach, miały mniejszy zasób pamięci, a dodatkowo żaden z
procesów nie miał chronionej pamięci. Jeżeli taki rozkaz zaczął by się nagle wykonywać w
trybie PROTECTED mogło by to spowodować małe zamieszanie w programie.
Uwagę zwraca także wartość 08h. Tak naprawdę wartość ta jest selektorem wskazującym na
deskryptor w GDT, a dokładnie na jej pierwszą część czyli deskryptor kodu (gdt_code).
DoProtect to offset czyli przesunięcie w ramach danego deskryptora.
[BITS 32]
DoProtect:
mov ax, 10h
mov ds, ax
mov ss, ax
mov esp, 090000h
10h to w rzeczywistości kolejny deskryptor który tym razem wskazuje na drugą część
Globalnej Tablicy Deskryptorów (GDT). Aby to lepiej zrozumieć proszę zauważyć, że
selektor to 16 bitowa struktura. Bity 0 i 1 (najmniej znaczące) to tzw. PRL czyli poziom
ochrony zadania żądającego dostępu. Bit 2 to wskaznik tablicy (0 jeśli GDT a 1 jeśli LDT),
natomiast bity od 3 do 15 to numer deskryptora. To właśnie te bity ustawiają podane wartości.
8h to 1000b, a więc deskryptor numer 1 (1|000) a 10h to 10000b czyli deskryptor numer 2
(10|000).
mov eax, 0B8000h
mov bx, 08h
Tutaj następuje ustawienie eax na początek pamięci obrazu.
F_prot:
mov byte [ds:eax], '!'
inc eax
mov byte [ds:eax], 1Eh
inc eax
mov byte [ds:eax], '?'
inc eax
mov byte [ds:eax], 1Ah
inc eax
dec bx
cmp bx,0
je shutdown
jmp F_prot
Ten fragment kodu wyswietla !? osiem razy. Każdy znak ma inne podświetlenie. Eax
zwiększa się o jeden i zapisuje kolejne znaki wraz z ich atrybutami w pamięci obrazu. Jeden
znak to jeden bajt. Dodatkowo zaraz obok zapisuje się jego atrybut (też o rozmiarze 1 bajta).
shutdown:
mov eax, cr0
dec eax
mov cr0,eax
Tutaj następuje powrót do trybu REAL (ustawienie CR0 na 0)
PreventReste:
jmp PreventReste
gdt:
gdt_null:
dd 0
dd 0
gdt_code:
dw 0FFFFh
dw 0
db 0
db 10011010b
db 11001111b
db 0
gdt_data:
dw 0FFFFh
dw 0
db 0
db 10010010b
db 11001111b
db 0
gdt_end:
gdt_desc:
dw gdt_end - gdt - 1
dd gdt
Powyższy kod to właśnie nasza GDT. gdt_end - gdt 1 oblicza jej długość (odjęliśmy
jedynkę ponieważ wtedy długość tablicy byłaby powiększona o gdt_end). gdt_desc to
taka struktura przechowuje długość tablicy i jej adres początkowy.
times 510-($-$$) db 0
dw 0AA55h
Kompletny kod programu:
[BITS 16]
[ORG 0x7C00]
cli
xor ax, ax
mov ds, ax
lgdt [gdt_desc]
mov eax, cr0
or eax, 1
mov cr0, eax
jmp 08h:DoProtect
[BITS 32]
DoProtect:
mov ax, 10h
mov ds, ax
mov ss, ax
mov esp, 090000h
mov eax, 0B8000h
mov bx, 08h
F_prot:
mov byte [ds:eax], '!'
inc eax
mov byte [ds:eax], 1Eh
inc eax
mov byte [ds:eax], '?'
inc eax
mov byte [ds:eax], 1Ah
inc eax
dec bx
cmp bx,0
je shutdown
jmp F_prot
shutdown:
mov eax, cr0
dec eax
mov cr0,eax
PreventReste:
jmp PreventReste
gdt:
gdt_null:
dd 0
dd 0
gdt_code:
dw 0FFFFh
dw 0
db 0
db 10011010b
db 11001111b
db 0
gdt_data:
dw 0FFFFh
dw 0
db 0
db 10010010b
db 11001111b
db 0
gdt_end:
gdt_desc:
dw gdt_end - gdt - 1
dd gdt
times 510-($-$$) db 0
dw 0AA55h
Wyszukiwarka
Podobne podstrony:
sw sprawozdanie lab2 v2sw sprawozdanie lab2 v4sw sprawozdanie lab2 v1sw sprawozdanie lab2 v1sw sprawozdanie lab2 v3Sprawozdanie lab2 Szewczak Piotrsprawozdanie lab2tm sprawozdanie lab2 v2tm sprawozdanie lab2 v1Mechanika płynów sprawozdanie z lab2lab2 sprawozdanieSW LAB2 LukaszJanikRóżnice w sprawowaniu św Liturgii w prawosławnych Kościołach lokalnychsw gimnazjum 6więcej podobnych podstron