在這裡以x86的處理器為例
機器在啟動的時候會執行第一條指令。這條指令會去執行bios,將控制權交給bios。
bios完成硬體的質檢,然後將bootloader從硬碟讀到記憶體中,執行bootloader,並將控制權交給bootloader
bootloader負責使能保護模式、建立段機制以及載入作業系統,然後將控制權交給作業系統
執行機器的第一條指令是為了跳轉到bios執行,那麼需要知道bios在**?cpu是怎麼定址的?
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是負責做硬體自檢並初始化以及將bootloader載入到記憶體中
要保證硬碟、記憶體…在後續工作中不會出錯。
然後將bootloader載入到記憶體中的0x7c00,然後跳轉到0x7c00執行。
bootloader要完成使能保護模式(實模式——>保護模式)、建立段機制以及載入作業系統
bootloader在硬碟中的第乙個扇區也叫主引導扇區,乙個扇區是512位元組,所以bootloader也是512位元組。
其中有400+個位元組是啟動**,負責完成bootloader需要完成的工作,剩下的位元組是記錄硬碟分割槽表。
當沒有段機制,cs:ip得到的是真實的實體地址,段機制就是為了更加靈活的分段。
段機制就是中間做了一層對映,cs先定位到gdt(全域性描述表)相應的段描述符,再從段描述符中找到段的起始位址,與ip組成實體地址。
將cr0暫存器(control 0 register控制暫存器),的第0位設為1,這樣就開啟了保護模式
Linux作業系統啟動順序
1 開機自檢,夾在核心 2核心識別並載入根檔案系統rootfs bin sbin,lib,lib64,proc,sys,dev 首先讀取根檔案系統下 sbin init init負責替代kenel負責啟動使用者所需要的一起子程序。所以這些程序都是init的子程序。3掛載別的檔案系統 在根檔案系統下的...
cebtos6 7作業系統啟動順序
1 進行開機自檢 檢查硬體 載入識別bios 2 識別mbr引導資訊 引導系統啟動 3 載入grub選單 選擇核心資訊 4 載入核心資訊 控制管理硬體 5 啟動第乙個服務程序 init服務程序 6 載入系統檔案執行級別檔案 etc inittab 載入系統檔案磁碟掛載檔案 etc fstab 7 載...
詳解作業系統啟動
我們作業系統在啟動的時候,我們的計算機到底什麼?讓我們從馮諾依曼體系說起!其實說白了,整個計算機執行過程就是在取指令和執行指令,如下圖所示,其中pc 程式計數器 指向一條指令,計算機將其從儲存器取出,然後放到運算器中執行,也就是如圖所示,最終得到ax的值是0。開機一瞬間軟體上做了什麼?在我們開機的那...