Window核心學習之保護模式基礎

2022-06-14 15:09:10 字數 2492 閱讀 6241

段暫存器有6個分別是 cs,ss,ds,es,fs,gs。這些段暫存器包含16位的可見部分和80位的隱藏部分,共90位。

16位的可見部分就是我們知道的cs等段暫存器的值,我們可以在od中檢視。

這16位可見部分也稱為是段選擇子,其16位的結構的最低兩位是rpl即此段訪問的請求許可權級別,再往前一位是ti位,當ti位為0時表示查詢gdt表,如果ti位為1表示查詢ldt表。剩餘13位為索引值,用來在gdt表或ldt表中索引對應的段描述符。

而剩餘80位的不可見部分壓縮儲存在全域性描述符表gdt或區域性描述符表ldt的段描述符中,這80位的結構32位為段的base,32位為段的範圍大小,16位為段的屬性。

struct  hidden part

例如:mov eax,ds:[0x123456], 0x123456是虛擬位址,ds.base + 0x123456 是線性位址,最後利用分頁機制再將其對映到對應的實體地址上。(一般除了fs段暫存器之外,其他的段暫存器的基位址都為0)

讀暫存器通過mov指令,mov ax,cs讀暫存器指令只是將cs段暫存器的16位可見值放到了ax中。

寫暫存器通過mov指令或les,lds等指令,mov ds,ax此指令將ax的值傳送到ds中,因為ds段選擇子的索引值發生變化了所以其指向的段描述符也變化了,實際是相當於將隱藏的80位的值進行了複製,一共傳輸了96位。

gdtr是全域性描述符表暫存器有48位,其中32位為全域性描述符表的基位址,16位為全域性描述符表的範圍大小。在windbg中可以檢視對應gdtr的基位址與大小。

ldtr是區域性描述符表暫存器也是16位,idtr是中斷描述符表暫存器有48位,tr是任務暫存器有16位。

x86中段描述符是8個位元組,也就是段描述符表中每8個位元組為1個段描述符。

段描述符的結構如下:

當p位為1時表示此段描述符有效,p位為0表示此段描述符無效。

我們知道段暫存器不可見的80位壓縮儲存在64位的段描述符中,我們看到基位址的32位分布在段描述符中,而16位的段屬性access information就是段描述符中的8-23位,但是段大小只有0-19位直接儲存到段描述符中了(0xfffff)。

當g位為0時,段描述符中儲存的段的大小的單位為位元組,所以其能表示的段的大小為0 - 0xfffff。

當g為為1時,段描述符中儲存的段的大小的單位為4kb,所以其能表示的段的大小為0xfff - 0xffffffff。(也就是當g為1時,如果段描述符中存的段的大小值為0,那麼其實際段的大小為0xfff,這也解釋了fs段暫存器一般大小都為0xfff)

當s位為1時表示此段描述符表示的是**段或資料段

當s位為0時表示此段描述符表示的是系統段

當此段描述符表示的是資料段時,第11位為0,a位表示是否已經被訪問,w表示是否可寫,e位為擴充套件方向位。

當此段描述符表示的是**段時,第11位為1,a位表示是否已經被訪問,r表示是否可讀,c位為一致位(1為一致,0為非一致)

當此段描述符表示的是系統段時,其表示是中斷門還是陷阱門,或者是tss。

對cs段的影響:當d/b位為1時採用32位定址方式,當為0時採用16位定址方式。(硬編碼字首67可以修改定址方式為16位的)

對ss段的影響:當d/b位為1時隱式堆疊訪問指令改變esp,當為0時改變sp。

對向下擴充套件資料段的影響:當d/b位為1時段上限為4gb,當為0時段上限為0。

rpl:段選擇子的低兩位就是rpl,其為此段訪問的請求許可權級別。(乙個段描述符可以由多個段選擇子索引,這些段選擇子可以有不同的請求許可權級別)

cpl:cs段選擇子的低兩位就是cpl,其指定了當前**位於哪一環。

dpl:其規定當前段的需要的訪問請求級別,位於段描述符中。

假如此時cs == 0x1b,所以cpl == 3,段選擇子為0x4b,所以rpl == 3,因為其是一致**段,而cpl > dpl,所以可以訪問此段描述符。

mov eax,0x4b

mov ds,ax

參考:滴水中級課

linux核心學習之保護模式 一

這一章涉及intel8086系列cpu的保護模式程式設計,應該是學習核心程式設計,驅動程式設計及嵌入式程式設計一些基礎知識。不過對於沒接觸過底層程式設計的我來說,感覺還是好複雜 不過裡面也有許多以前彙編學過的東西,大部分還是能看懂的 我覺得圖表就能說明大部分內容了,細節東西,不能都做筆記,所以大部分...

核心程式設計 保護模式下讀取磁碟絕對扇區

在實模式下,可通過13號bios中斷讀取磁碟扇區。但保護模式下,中斷方式發生改變。中斷處理程式的段基址通過idt表中的描述符得到,而非實模式下的中斷向量表。故保護模式下,已無法使用實模式下的中斷處理程式。磁碟讀寫屬於i o,可通過直接的io讀寫來完成,實際上bios的中斷處理程式也是這樣完成的。以下...

Linux核心學習之鍊錶

文章參照任橋位linux核心修煉之道3.6節編寫。1.鍊錶的定義 這個跟我們在課本上學習的一樣,相當簡單。包括了乙個前項指標,和後項指標。是不是有點不對勁?不錯,竟然沒有資料域!不急,我們慢慢看。struct list head 沒有資料是核心鍊錶的一大特色,因為他採用的方式比較特殊,他不是用鍊錶來...