日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

初识保护模式

發布時間:2025/6/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 初识保护模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

書本第三章第一節是《認識保護模式》,初步講解了保護模式下全局描述符表GDT、段描述符、段選擇子、從實模式進入保護模式等內容。去年看這個的時候,如果不是有以前學習保護模式時做的筆記,還真不好懂呢,因為作者提供的材料不夠系統,對僅學習過8086匯編語言的人來說,是不太好理解的。下面的內容大體以我以前做的筆記為綱,較為簡略,只說明要點。(本來還可以參考下以前學習保護模式時收集的資料的,很可惜,移動硬盤壞了,資料都沒有了,早就該注意信息安全了的。)

  • 描述符與描述符表

???? 8086是16位處理器,有16位的寄存器和數據總線,20位的地址總線,尋址能力為1MB。地址由段基址和段偏移兩部分組成,段基址和偏移地址都是16 位的,物理地址的計算方式為:物理地址=段基址×16+段偏移。從80386開始,Intel處理器進入了32位時代,地址總線為32位,尋址能力為 4GB。此時,通用寄存器變成從16位變成了32位,但段寄存器仍然是16位的,原來的基地址加偏移值的物理地址計算方法已經不適用了,需要新的計算方法。

??? 386以上CPU運行于保護模式時,雖然段寄存器仍然是16位的,但是其意義已經發生了變化:不再是表示段基地址了,而是表示段描述符在描述符表中的索引。此時,段寄存器的值也有了一個新的名稱:段選擇子。

?????? 段描述符是描述段屬性的一個8字節數據結構,分為三種類型:(數據段和代碼段)段描述符、系統段描述符和門描述符。書本第43頁給出了描述符的結構圖。書中說“由于歷史問題,它們(描述符中的段基址和段偏移)都被拆開存放”。我想,這個歷史問題是指為兼容80286處理器的設計吧:80286采用24位地址線,尋址能力16MB,所以段基址被拆開成低24位和高8位兩部分;80286已經引入“保護模式”的概念,是推出實模式和保護模式CPU的分水嶺。附兩個粗略介紹80286的網址:http://wiki.ccw.com.cn/80286?,http://baike.baidu.com/view/193778.htm

????? 描述符表是內存中保存一個或者多個描述符的區域,由相關寄存器(GDTR、LDTR、IDTR)指示其起始地址。有三種描述符表:

????? GDT Global Description Table 全局描述符表

????? LDT Local Description Table? 局部描述符表

????? IDT Interrupt Description Table 中斷描述符表

????? 段選擇子是段寄存器的內容。雖然386處理器中段寄存器還是16位的,但是在保護模式下,其內容的意義已經發生了變化,不再是表示段基地址,而是表示段描述符在描述符表中的位置。其中第0位和第1位是RPL(Request Privilege Level 請求特權級),用以進行訪問權限檢查,這個以后再詳細描述;第2位是TI(Task Indication,任務指示),其值為0表示使用GDT,為1表示使用LDT;第3至15位是段描述符在相應的描述符表中的索引。

  • 存儲器尋址

???? 實模式下的尋址方式同8086:段基地址×16+段偏移地址。

???? 保護模式下使用48位地址指針:16位段選擇子和32位段偏移地址。尋址過程為:從相應的段寄存器中取出段選擇子,根據高13位從相應的描述符表中取得段描述符;用段描述符給出的32位段基地址,加上32位的偏移地址得到32位線性地址;如果沒有啟用分頁,則32位線性地址就是物理地址,否則線性地址再經過分頁機制轉化成物理地址。當然,尋址過程中會根據段描述符給出的段屬性進行各種檢查,如特權級檢查、地址越界檢查、段頁是否存在檢查等。

  • 寄存器模型

?? 我覺得,沒有給出386的寄存器模型是本書的一大缺憾。這里給出386的寄存器模型并作簡要說明。(這張圖我花了好長時間用WPS Office畫的)

???



?????? 圖中陰影部分是實模式下可用的寄存器。

?????? EAX、EBX、ECX、EDX:8086中的通用寄存器已經擴展成32位的了。當然,還是可以使用AX、BX、CX、DX訪問低16位;或者用AH、AL等分別訪問低16位的高低兩個字節。

?????? CS、DS、SS、ES、FS、GS:新增了FS和GS這兩個16位的段寄存器。CS、DS、SS、ES的用途不變,還是代碼段、數據段、堆棧段和擴展段寄存器;FS和GS也可以看作是方便程序員使用的擴展段寄存器。

?????? EIP:地址變成32位了,指令指針當然也要擴展成32位的了。

?????? ESP、EBP、ESI、EDI:堆棧指針、基址指針、源變址、目標變址寄存器,名字前面加上字母E表示擴展成32位了。

?????? EFLAGS:標志寄存器也變成32位的了。

?????? 以下是386新增的寄存器:

?????? IDTR、GDTR和LDTR:IDTR和GDTR是48位的,分別用以保存中斷描述符表和全局描述符表的基地址(32位)和限長(16位)。LDTR保存局部描述符的段選擇子,其使用方式為:1 在LDTR中裝入段選擇子,CPU自動從GDT中取出局部描述符,放入高速緩存中,為當前任務建立LDT;2 以后使用段寄存器中的選擇子時,若發現TI位為1,則從LDT中找到相應的段描述符進行尋址操作。

?????? TR:任務寄存器,存放任務狀態段選擇子,指示任務狀態段描述符在GDT中的位置(類似LDTR)。使用方式類似LDTR:在TR中裝入段選擇子,CPU 自動從GDT中取出任務狀態段描述符,放入高速緩存中,為當前任務建立TSS。TSS是Task State Segment(任務狀態段)的簡寫,它定義了啟動任務所需要的信息,簡言之(不太準確),就是一個進程的相關信息。

?????? CR0、CR1、CR2、CR3、CR4:控制寄存器,保存了系統的各種標志位。其中CR0的低16位就是8086中的MSW(Machine State Word,機器狀態字)。這里需要關注的是CR0的第0位PE標志,其值為0表示當前運行在實模式下;為1表示運行于保護模式下。

  • 進入保護模式

??? 書本上給出了進入保護模式的代碼,還有詳細的說明,我就不給自己的代碼了,只對一個地方進行簡要說明:為什么要在GDT的起始位置處定義一個沒有使用的空的描述符???
??? 這個問題我想了好久也沒想通,后來在網上找到了答案:GDT中索引為0的描述符是特殊的空描述符,是不能使用的,如果使用它進行存儲器訪問,會引發Genernal Protection異常。關于這個問題,可以參考http://leonstar.bokee.com/36918.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的初识保护模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。