這個東西其實很多,但是文章裡不想細講,我就大概的講一下,這個篇文章還是偏筆記為主。

總之全局描述符這個東西是繼實模式之後保護模式推出的一種內存管理結構。

在實模式下訪問內存基本就是靠“段地址+偏移地址=線性地址”這種方式來訪問。

保護模式下兼容了原先的內存訪問方式,並且加強了安全性,還擴大了尋址範圍。

全局描述表(GDT),下對所有管理的內存就會以全局表述符的方式保存。

image.png

上圖有些字段被拆開zz了,例如段基址被拆分再了三個不連續的內存上。這是因為為了兼容一些遺留問題導致的。具體就別想了。實際使用的時候需要組裝成連續的數據。

下面就簡單的解釋一下每個位的意義:

位31-24:段基地址高8位

存儲段起始物理地址的最高字節(bits 24-31),與低16位共同組成32位基地址。

位23:G(Granularity)- 粒度位

  • 0 = 段界限以 1字節 為單位(傳統模式)
  • 1 = 段界限以 4KB 為單位(現代OS必選)

位22:D/B(Default Operation Size)- 操作數/棧大小

  • 代碼段1=32位指令(EIP),0=16位指令(IP
  • 數據段1=32位棧(ESP),0=16位棧(SP

位21:L(Long Mode)- 64位模式

  • 1= 進入64位長模式(x86-64)
  • 0= 保持32/16位模式

位20:AVL(Available)- 保留位

操作系統自由使用(通常為0)

位19-16:段界限高4位

段界限的最高4位(bits 16-19),與低16位構成20位總界限值。

位15:P(Present)- 存在位

  • 1= 段在內存中(訪問時觸發缺頁異常)
  • 0= 段不在內存(訪問時觸發#NP異常)

位14-13:DPL(Descriptor Privilege Level)- 特權級

  • 00= 特權級0(內核)
  • 01= 特權級1
  • 10= 特權級2
  • 11= 特權級3(用戶程序)

位12:S(Descriptor Type)- 描述符類型

  • 1= 代碼/數據段
  • 0= 系統段(TSS/LDT等)

位11-8:TYPE - 段類型(S=1時生效)

代碼段數據段
31(可執行)0(向上擴展)
21(一致性)1(可寫)
11(可讀)1(允許寫入)
01(已被訪問)1(已被訪問)

例:只執行代碼段 = 1000b,可寫數據段 = 0010b

位7-0:段基址中8位

基地址的中間字節(bits 16-23)

位31-16:段基址低16位

基地址的最低字(bits 0-15)

位15-0:段界限低16位

段界限的最低字(bits 0-15)