做了幾天時(shí)間的這個(gè)教程,現(xiàn)在來總結(jié)一下我的收獲
操作系統(tǒng)啟動(dòng)過程
因?yàn)檫@個(gè)系列有一個(gè)特點(diǎn)就是不使用grub這樣的存在的bootloader,那么你就需要自己去手寫引導(dǎo)
現(xiàn)在我們來梳理一下計(jì)算機(jī)啟動(dòng)的整個(gè)過程發(fā)生了什么?
-
點(diǎn)擊電源鍵,主板通電,CPU初始化(寄存器初始化,主要是CS,IP),這兩個(gè)寄存器關(guān)系著CPU執(zhí)行的第一個(gè)指令,
而這個(gè)指令指向的地址就是BIOS的程序入口 (jump post)
-
而BIOS又會(huì)進(jìn)行開機(jī)自檢,檢查硬件是否存在,是否有問題,如果出現(xiàn)問題,會(huì)發(fā)出蜂鳴聲,沒問題則會(huì)向屏幕打印硬件信息,而在開機(jī)自檢之后,BIOS還會(huì)檢查是否存在Bootable device,如何區(qū)分他是不是Bootable呢?
這里就涉及到了MBR和boot sector
講道理,BIOS會(huì)去檢查每個(gè)設(shè)備的前512字節(jié),并且在512字節(jié)的末尾,會(huì)有一個(gè)magic number : 0xaaff(好像是)
如果是,他就會(huì)認(rèn)為他是bootable device,而這512字節(jié)一般來說存放的都是MBR(main boot record),而其實(shí)就我的理解,MBR的存在呢,主要是為了解決一個(gè)問題:硬盤的每個(gè)分區(qū)都可以裝一個(gè)系統(tǒng),MBR中存放的就是分區(qū)表和代碼,代碼呢,可能就是bootloader
而在我們的這個(gè)教程中,就沒有是使用MBR,因?yàn)樗皇且粋€(gè)在虛擬機(jī)上模擬的一個(gè)簡(jiǎn)單系統(tǒng),所以他使用了boot sector啟動(dòng)
接著剛才說:
而CPU會(huì)把這512字節(jié)的內(nèi)容讀到內(nèi)存中:0x7c00處,然后開始執(zhí)行MBR或者boot sector的代碼
-
而boot sector接著要干什么呢?
加載內(nèi)核,但是這里我們就又要說一下實(shí)模式和保護(hù)模式了
Intel8086的CPU是16位的,那也就代表著,我們可以使用的空間只有2的16次個(gè)bits,也就是8KB左右吧,但是8086設(shè)計(jì)時(shí)的目標(biāo)是使用1MB的內(nèi)存,于是他就是用了一種分段的尋址方式,段地址偏移4位+邏輯地址,這樣就實(shí)現(xiàn)了20位的尋址,也就勉強(qiáng)達(dá)到了1MB的內(nèi)容
但是后面的幾代CPU為了兼容8086,他們就將8086的這種啟動(dòng)方式作為實(shí)模式:
- 16位尋址
- 使用分段的方法
- 只能使用單個(gè)CPU
- 沒有內(nèi)存保護(hù)
但是,根據(jù)我們嘗試來說,這所謂的1MB內(nèi)存根本不足以讓我們把內(nèi)核加載進(jìn)來,而且后面的幾代CPU從32位進(jìn)步到64位,繼續(xù)使用16位的尋址未免太low,于是對(duì)應(yīng)實(shí)模式,就有了保護(hù)模式(32位)
- 32位尋址
- 使用GDT,而不是簡(jiǎn)單的分段
- 有了段的權(quán)限控制
- 有了內(nèi)存保護(hù)
- 可以使用多個(gè)CPU
- 有了更大的內(nèi)存空間
內(nèi)核加載完成后,會(huì)初始化寄存器,因?yàn)閺?6位進(jìn)入32位,寄存器也需要重新初始化,并且要?jiǎng)?chuàng)建一些重要的進(jìn)程
加載操作系統(tǒng)的其他部分,文件系統(tǒng),網(wǎng)絡(luò)....
其實(shí),操作系統(tǒng)不見得都是在保護(hù)模式下進(jìn)行加載的,比如linux,他使用了一種叫做unreal mode的模式,所謂的unreal其實(shí)也就是在real和protect之間反復(fù)橫跳來加載內(nèi)核
而且,linux為了減小內(nèi)核大小,還采用了一般壓縮,一半不壓縮的騷操作,沒壓縮的一半會(huì)去解壓另一半
其他
其實(shí),總的來說,這一系列下來收獲還是蠻大的
比如說:
- GDT是怎么被加載到內(nèi)存,又是怎么被CPU找到的
- GDT為什么結(jié)構(gòu)那么復(fù)雜
- 如何配置交叉編譯的環(huán)境
- 匯編的一些知識(shí)
- 段錯(cuò)誤和GDT有什么關(guān)系
- 實(shí)模式如何進(jìn)入保護(hù)模式
- 以及CPU尋址
- 堆棧是怎么分配的
- ......