Deskryptor segmentu: Różnice pomiędzy wersjami

[wersja przejrzana][wersja przejrzana]
Usunięta treść Dodana treść
Matekm (dyskusja | edycje)
m drobna merytoryczna
Matekm (dyskusja | edycje)
m →‎W procesorach o architekturze x86: poprawa według speyfikacji intela
Linia 2:
'''Deskryptor segmentu''' ([[język angielski|ang.]] ''Segment descriptor'') - struktura występująca w globalnej oraz lokalnej [[Tablica deskryptorów|tablicy deksryptorów]], opisująca położenie i właściwości (rodzaj, rozmiar, flagi dostępu, status) segmentu.
 
== Budowa ogólna ==
== W [[procesor]]ach o architekturze [[x86]] ==
W ogólności deskryptor segmentu jest 64-bitową strukturą określającą jednoznacznie położenie segmentu w pamięci, jego typ, rozmiar, prawa dostępu oraz pozostałe informacje przydatne przy dostępie do segmentu w [[tryb chroniony|trybie chronionym]] procesora. Poniższy rysunek przedstawia budowę deskryptora segmentu procesorów [[x86]]:
Struktura deskryptora jest 64-bitowa i określa segment w pamięci, dostępnych jest kilka rodzajów deskryptorów. Podstawowym typem deskryptora w architekturze [[x86]] jest deskryptor segmentu (ang. ''Segment Descriptor'') umieszczony jest on w lokalnej lub globalnej [[tablica deskryptorów|tablicy deskryptorów]] (ang. ''Global Descriptor Table - GDT, Local Descriptor Table - LDT''). Przez GDT lub LDT prowadzą wszystkie odwołania do pamięci. Deskryptor segmentu określa jednoznacznie segment, jego położenie w pamięci, rozmiar, typ, prawa dostępu do segmentu oraz inne dane potrzebne przy dostępie do segmentu w [[tryb chroniony|trybie chronionym]] pracy [[procesor]]a [[x86]]. Z każdym deskryptorem segmentu jest związany jego [[selektor]] (a właściwie możliwych jest kilka selektorów różniących się prawami uprzywilejowania selektora, a mające taki sam indeks deskryptora oraz wskaźnik na rodzaj tablicy GDT lub LDT).
[[Plik:Deskrypt.gif|center|Ogólna budowa deskryptora segmentu]]
 
Opis pól deskryptora:
Deskryptory służą także do definiowania bramek [[przerwanie|przerwań]] i procedur (''interrupt gate'' i ''callgate'') - wówczas deskryptor podaje adres takiej procedury i reguły dostępu. Bramki umożliwiają wywoływania kodu o wyższym uprawnieniach (np. procedur systemu operacyjnego lub sterownika) z poziomu programu o niższych uprawnieniach (np. programu użytkowego).
* ''Limit segmentu'' - określa wielkość segmentu; procesor łączy oba pola, aby otrzymać 20-bitową liczbę reprezentującą wielkość segmentu. Liczba ta jest następnie interpretowana w zależności od stanu pola G.
* ''Adres bazowy, Baza'' - pola określające [[offset]] segmentu. Z trzech pól adresu bazowego w deskryptorze segmentu procesor tworzy jedną 32-bitową liczbę.
* ''Typ'' - określa typ segmentu oraz prawa dostępu do niego; pole te jest interpretowane różnie dla każdego typu segmentu.
* ''S'' - okresla typ deskryptora segmentu. Jeżeli to pole ustawione jest na 0 to deskryptor opisuje segment systemowy, w przeciwnym wypadku opisuje segment danych lub kodu.
* '''DPL''' - poziom uprzywilejowania segmentu (Descriptor0 Privilege- największy, 3 - Levelnajmniejszy)
* ''P'' - pole informujące o tym, czy segment jest załadowany do pamięci. W przypadku obecności segmentu w pamięci pole ustawiane jest na 1.
* '''AVL''' - bity przeznaczone do dowolnego wykorzystania przez [[system operacyjny]]
* '''D/B''' - domyślny rozmiar operacji (0 - segment 16-bitowy, 1 - segment 32-bitowy)
* '''G''' - ziarnistość (Granularity) określa jaka jest jednostka liczenia rozmiaru segmentu (0 - ziarnistość 1B, 1 - ziarnistość 4kB). Jeśli G = 0, maksymalny rozmiar segmentu to 1MB, przy G = 1, rozmiar maksymalny wynosi 4GB
 
Z każdym deskryptorem segmentu związane są [[selektor]]y, które mają taki sam indeks deskryptora segmentu lecz różnią się prawami uprzywilejowania.
Poniższy rysunek przedstawia budowę deskryptora segmentu procesorów [[x86]]:
<div style="float:center; margin-left:10px; margin-right:1px;">[[Plik:Deskrypt.gif]]
</div>
 
Deskryptory służą także do definiowania bramek [[przerwanie|przerwań]] i procedur (''interrupt gate'' i ''callgate'') - wówczas deskryptor podaje adres takiej procedury i reguły dostępu. Bramki umożliwiają wywoływania kodu o wyższym uprawnieniach (np. procedur systemu operacyjnego lub sterownika) z poziomu programu o niższych uprawnieniach (np. programu użytkowego).
Opis pól deskryptora:
* '''G''' - ziarnistość (Granularity) określa jaka jest jednostka liczenia rozmiaru segmentu (0 - ziarnistość 1B, 1 - ziarnistość 4kB). Jeśli G = 0, maksymalny rozmiar segmentu to 1MB, przy G = 1, rozmiar maksymalny wynosi 4GB
* '''D/B''' - domyślny rozmiar operacji (0 - segment 16-bitowy, 1 - segment 32-bitowy)
* '''AVL''' - bity przeznaczone do dowolnego wykorzystania przez [[system operacyjny]]
* '''Limit Segmentu''' - określa rozmiar całego segmentu w jednostkach określonych przez flagę '''G'''
* '''P''' - czy segment jest obecny pamięci operacyjnej
* '''DPL''' - poziom uprzywilejowania segmentu (Descriptor Privilege Level)
* '''S''' - typ deskryptora (0 - systemowy 1 - kodu lub danych)
* '''Typ''' - typ segmentu: dane, stos, kod programu, bramki (przerwań i procedur, ''interrupt gate'', ''call gate'')
* '''Baza, Adres Bazowy''' - adres bazowy (początkowy) segmentu
 
== Zobacz też ==