概述 在這裡以x86的處理器為例 機器在啟動的時候會執行 第一條指令 。這條指令會去執行 bios ,將控制權交給bios。 bios完成硬體的質檢,然後將bootloader從硬碟讀到記憶體中,執行 bootloader ,並將控制權交給bootloader bootloader負責使能保護模式、建 ...
概述
在這裡以x86的處理器為例
機器在啟動的時候會執行第一條指令。這條指令會去執行bios,將控制權交給bios。
bios完成硬體的質檢,然後將bootloader從硬碟讀到記憶體中,執行bootloader,並將控制權交給bootloader
bootloader負責使能保護模式、建立段機制以及載入操作系統,然後將控制權交給操作系統
第一條指令
執行機器的第一條指令是為了跳轉到bios執行,那麼需要知道bios在哪裡?cpu是怎麼定址的?
bios在哪裡
bios是固化在記憶體EPROM中的,斷電不會丟失(非易失性),這樣biod的地址是固定的,因為在cpu第一次加電了之後,寄存器就會有預設的初始值,所以bios地址=定址寄存器的預設值就好啦。
定址是由段寄存器以及指令指針共同完成,bios地址由CS:IP=16*CS+IP(代碼段寄存器:指令指針)來表示。
CS的預設值是FFFF0000H,IP的預設值是0000FFF0H。
CS:IP=FFFFFFF0H
定址機制
定址是由段寄存器以及指令指針共同完成。因為記憶體很大,而且在一段時間內操作的記憶體具有空間局部性,所以可以將記憶體分為一段一段由段寄存器來定位,這一段的記憶體中再由指令指針來定位到具體的代碼、數據
段寄存器:
- CS——code segment,代碼段寄存器
- DS——data segment,數據段寄存器
- ES——extra segment,附加段寄存器
- SS——stack segment,堆棧寄存器
指令寄存器IP(instruction pointer),即是我們熟悉的程式計數器PC。
一個地址由段寄存器:指令指針=16*段寄存器+指令指針來表示
由於在這一階段,機器還是處於實模式,實模式是20位定址,所以單單隻用段寄存器(16位)是不夠的。
因為實模式只有20位定址,所以最大可調用的空間只有1M
bios
bios是負責做硬體自檢並初始化以及將bootloader載入到記憶體中
要保證硬碟、記憶體...在後續工作中不會出錯。
然後將bootloader載入到記憶體中的0x7c00,然後跳轉到0x7c00執行。
bootloader
bootloader要完成使能保護模式(實模式——>保護模式)、建立段機制以及載入操作系統
bootloader結構
bootloader在硬碟中的第一個扇區也叫主引導扇區,一個扇區是512位元組,所以bootloader也是512位元組。
其中有400+個位元組是啟動代碼,負責完成bootloader需要完成的工作,剩下的位元組是記錄硬碟分區表。
建立段機制
當沒有段機制,CS:IP得到的是真實的物理地址,段機制就是為了更加靈活的分段。
段機制就是中間做了一層映射,CS先定位到GDT(全局描述表)相應的段描述符,再從段描述符中找到段的起始地址,與IP組成物理地址。
使能保護模式
將CR0寄存器(control 0 register控制寄存器),的第0位設為1,這樣就開啟了保護模式