從實模式到保護模式

2021-07-27 07:26:59 字數 1198 閱讀 7822

計算機啟動之後,bios會初始化計算機,然後計算機開始自動讀取磁碟,磁碟讀取乙個扇區(512位元組),當讀到某個磁碟0磁軌1扇區扇區的最後的結束位址是0xaa55,bios就會認為它是乙個引導扇區,然後就會把這512位元組的內容裝載到記憶體位址0000:7c00處,然後跳轉到0000:7c00處將控制權交給這段引導**,這樣bios的任務就結束了,作業系統也成功被引導起來了。作為乙個引導扇區,它至少有這樣3個條件:1.大小只能為512位元組(少了可以填充成0,多了則不行)。2.結束位址為0xaa55。3.載入到0000:7c00處。

在ia32下計算機啟動之後,cpu有兩種工作模式:實模式、保護模式。在實模式下,實體地址=段值x16+偏移,並且段值和偏移都是16位的,從這個公式可以看出段值是具有實際意義的,它作為了位址的一部分。因為實模式下的資料匯流排只有16位,也就是一次最多能取2^16=64kb,這就是為什麼實模式下每個段最大只有64kb,並且它的位址匯流排為20位,因此能定址的能力是2^20=1mb,既然有1mb的尋值能力,但是一次只能讀取64kb的資料,所以才引入了分段機制。

但是在保護模式下,段值雖然還是16位,但是意義發生了改變,它變成了乙個索引,指向乙個資料結構的表項,表項中存著段的起始位址、界限和屬性等資訊,這個資料結構的名字叫gdt(global descriptor table),表項被稱為描述符。gdt提供了段式儲存機制,由段暫存器和描述符共同實現,而每個描述符都對應了乙個段。段暫存器需要對應到相應的段,只需要通過選擇子就可實現,選擇子其實就是一系列描述符的索引,在段暫存器中儲存對應的索引就行了,它的儲存結構如圖所示。

64tb這麼大的定址能力。

總之,保護模式下的定址和實模式下有點類似,只是保護模式下的段值指向了gdt中的描述符,通過描述符定位到相應的段,再通過偏移,轉換成線性位址,如果沒有分頁機制,那麼該線性位址就是真正的實體地址。

從實模式要轉到保護模式,需要以下幾個步驟:

第一步就要初始化準備好gdt;

接下來,需要把gdt的實體地址載入到暫存器gdtr中;

然後關閉中斷,這是因為保護模式和實模式的中斷處理機制不相同;

接著將暫存器cr0的pe位置1,0表示實模式,1表示保護模式;

最後跳轉到保護模式。

具體**參見《orange『s:乙個作業系統的實現》

從實模式到保護模式跳轉的詳解

從實模式到保護模式跳轉的詳解 三年前拿到 自己動手寫作業系統 第一版的時候,雖然很有興趣,但是沒有時間詳細地 看進去,直到前段時間又看到它的第二版出來,興趣又提上來了。正好此時的工作之餘可以 深入地研究一下。第一遍看這段 沒懂 我承認是個很不聰明的人 只看懂了下面中文描述,說是 從實模式跳到保護模式...

保護模式到實模式

弄了幾天了,終於弄好了,呵呵,也得到了不少東西。從保護模式到是模式的轉換一定要注意的有 1 程式開始時在實模式下要有自己的堆疊段,進入保護模式前先暫存ss及sp的值至某記憶體處,以便從保護模式返回實模式後恢復到原先的堆疊。2 返回實模式前需把各段暫存器設定為規範段,包括ss也要設定 3 返回實模式前...

X86組合語言從實模式到保護模式(一)

不對請指正,歡迎交流 單位換算 1 byte 8 bit 1 kb 1024 byte 1 mb 1024 kb 1 gb 1024 mb8位暫存器可以容納8位元 bit 或者說1個位元組 1byte 8bit,8個二進位制數 1111 1111 0xff 16位暫存器可以存放2個位元組,也就是1個...