【OS学习笔记】十五 保护模式三:保护模式下的内存访问机制
上一篇文章學習了段描述符與段描述符各個標志位的含義:段描述符
本篇文章學習如何進入保護模式,并學習如何在保護模式下進行內存訪問。
1、如何進入保護模式
假設我們已經用匯編語言將段描述符安裝到GDT中(具體的匯編代碼在后面的文章中會給出),并且也已經將GDTR的線性地址與界限值加載到了GDTR中。現在前期的準備已經準備好了,可以直接進入到保護模式了。那么如何進入到保護模式呢?
控制實模式與保護模式切換的一個控制器是CR0寄存器。CR0是處理器內部的一個控制寄存器。
CR0是32位寄存器。如下圖:
它的第一位(位0)是保護模式允許位(PE位)。如果把該位置1,則處理器進入保護模式的規則下運行。其他位暫時不用,所以顯示的空白。以后學習過程中會繼續學習。
好了,只要我們再匯編代碼中將CR0寄存器的PE位置1,則進入保護模式的規則。現在假設我們已經進入了保護模式。
2、進入保護模式后如何訪問內存
2.1、32位處理器的段寄存器
我們很清楚16位的8086處理器的是如何通過段寄存器來訪問內存的。
在保護模式下,32位的處理器中。段寄存器有所變化。如下圖是32位處理器的段寄存器:
每個段寄存器的前16位于8086的寄存器一樣,在實模式下,他們用傳統的方式訪問1M內存,使用方法沒有變化。
同時每個段寄存器還包括一個不可見的部分,如上述圖的紅色部分,稱為描述符高速緩存器,用來存放所要訪問的段的線性地址、段界限和屬性。
說它不可見是因為只有處理器可以訪問,只能是處理器來使用。
那么保護模式下,是如何聽過上述的段寄存器訪問內存的呢?
在保護模式中,前16位的段寄存器稱為段選擇器。 將段描述符在GDT中的索引號傳送給段選擇器。
如下圖所示,是段選擇器里的內容。
在保護模式下訪問一個段時,傳送到段選擇器的是段選擇子。它由上述三部分組成。
- 描述符索引: 用來在描述符表(GDT)中找到一個段描述符。
- TI :描述符表指示器。TI=0時,表示描述符在GDT中。TI=1時表示描述符在LDT中。LDT是局部描述符表,在后面會有所介紹。
- RPL :請求特權級,表示給出當前選擇字的能程序的特權級,正式該程序要訪問這個內存段。
2.2、開始訪問內存
到了這里,我們知道了段選擇器的作用,就是用來索引段描述符的。現在還不知道描述符高速緩存器的作用呢??? 不著急,馬上就來。
假設現在我們要訪問的是數據段。
DS寄存器的段選擇器中存放的是數據段描述符在GDT中的索引號,而GDTR寄存器又保存的是GDT的基地址。GDT中每一個描述符的大小是8字節。那么訪問數據段的內容,就如下圖所示了:
在第一次訪問數據段的時候, 首先將之前傳送到段選擇器的段選擇子部分的描述符的索引號乘以8,得到描述符在GDT中的偏移地址。再用這個偏移地址加上GDT的基地址GDTR指向的內容,就可以訪問到內存中的段。
如果沒有發現什么問題,就自動的找到數據段描述符,將它加載到段寄存器的描述符高速緩存部分。加載的部分包括數據段的線性地址、段界限、與訪問屬性。
此后,如果再有訪問數據段的內存操作,處理器直接訪問段寄存器的描述符高速緩存部分的內容,而不用像開始那樣還用段選擇子部分的描述符索引號乘以8加上GDTR指向的GDT基地址。不用那么麻煩了,以后如果還訪問數據段,直接在數據段的描述符高速緩存中查找段的地址以及訪問屬性即可。
比如接下來如果有一條指令mov byte [0x00],'P' 假設現在的DS中的描述符高速緩存存的數據段的線性地址是 0x000B8000,那么上述指令的訪問就如下圖所示:
不只是訪問數據段。訪問代碼段也是與上述過程類似。只不過指令的偏移地址一般是由EIP寄存器指定。那么訪問一個內存中的指令大概就是下面的過程:
到了這里,我們已經很明白段寄存器中的描述符高速緩存的作用。它其實就是一個cache的作用。
3、總結
本篇文章有點繞。但是只要很用心的看,多看幾遍,肯定會看明白保護模式下的內存訪問機制。
筆記記得不是很全,如果有不懂的可以加我聯系方式一起交流。
學習探討加個人:
qq:1126137994
微信:liu1126137994
總結
以上是生活随笔為你收集整理的【OS学习笔记】十五 保护模式三:保护模式下的内存访问机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 零基础不建议学前端_web前端开发零基础
- 下一篇: GMSSL双证书认证C/S(Linux版