Asembler x86/Zaawansowana architektura: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
błąd językowy |
literówki |
||
Linia 17:
*<font color ="green">TI</font> - (ang. Table Indicator) oznacza, czy dany deskryptor segmentu znajduje się w GTK (gdy TI = 0) lub w LDT (gdy TI = 1). Pole to zajmuje bit nr 2.
Selektor segmentu zapisywany jest w rejestrze segmentowym jak CS, DS, SS, ES,FS, GS. Gdy posiadamy pewny '''adres logiczny''' np. 0xc00d:1001 wówczas wartość 0xC00D będzie właśnie w pewnym rejestrze
Każdy nasz "logiczny segment" jest reprezentowany przez tzw '''deskryptor segmentu''', o długości 8 bajtów (64 bity). Deskryptor ten zaś jak sama nazwa wskazuje opisuje nasz segment.
[[Grafika:Deskryptory.PNG|640px]]
*<font color ="green">Base</font> - tutaj znajduje się adres liniowy pierwszego bajtu danego segmentu.
*<font color ="green">G </font>- (ang. Granularity flag) jeśli ta flaga jest ustawiona na 0 (wyczyszczona), wówczas wielkość
*<font color ="green">Limit</font> - Przetrzymuje offset (przesunięcie) ostatniej komórki pamięci danego segmentu. Ta flaga ma związek z flagą G. Gdy G = 0 wówczas wielkość segmentu może wynosić od 1 bajta do 1 MB (czyli maksimum pamięci jaki mógł mieć procesor w trybie rzeczywistym) gdy G = 1 wówczas segment może mieć wielkość od 4 KB (rozmiar strony - o tym nieco później) aż do 4 GB.
*<font color ="green">S</font> - (ang. system flag) jeśli ta flaga jest wyzerowana dany segment jest tzw '''segmentem systemowym''', który przechowuje bardzo ważne struktury danych systemowych jak np położenie LDT. Jeśli S = 1 wówczas dany segment jest zwykłym segmentem kodu albo danych. Zwróc uwagę na nieco nietypowe ustawienie flag. Do tej pory jeśli dana flaga jest ustawiona na 1 wówczas spełnia swoją funkcję. W fladze S jest odwrotnie, tylko jeśli jest wyczyszczona zaczyna spełniać swoją rolę.
*<font color ="green">Type</font> - ta flaga determinuje typ segmentu. Może oznaczać, że dany segment (również deskryptor segmentu) jest albo
*<font color ="green">DPL</font> - (ang. Descriptor Privilege Level) służy do ograniczenia dostępu do danego segmentu. DPL reprezentuje '''minimalny''' stan uprzywilejowania CPU wymagany do użycia tego segmentu. Dla przykładu jeśli pole DPL danego segmentu ma wartość 0 wówczas jest adresowalne tylko dla programu z CPL
*<font color ="green">P </font>- (ang. Semgnet-Present Flag) jeśli ta flaga jest równa 0 to dany segment nie jest w ogóle w pamięci operacyjnej, czyli jest odłożony na dysku twardym w postaci
*<font color ="green">D</font> lub <font color ="green">B</font> - flaga nazywana D lub w zależności od tego czy dany segment jest segmentem kodu czy danych. Znaczenie tego pola zależy ściśle od kontekstu w jakim został użyty.
**<font color="green">D</font> - Ta flaga w deskryptorze segmentu kodu mówi nam o "szerokości stosu". Jeśli flaga jest wyzerowana, szerokość stosu wynosi 16 bit (czyli ESP jest inkrementowany i dekrementowany o 2 bajty). Jeśli jest ustawiona na 1, szerokość wynosi 32 bity (analogicznie ESP rośnie lub maleje o 4 bajty).
Linia 38:
Co musi zrobić system operacyjny aby uzyskać adres liniowy z adresu logicznego ? Dla przykładu mamy wcześniejszy adres logiczny 0xc00d:1001. Najpierw brana jest część 0xC00D.
Poniżej znajduje się rysunek pokazujący jak powstaje adres liniowy:
|