x86架构linux内核引导过程分析,SylixOS---x86引导过程分析
1. 上電啟動(dòng)流程
當(dāng)x86電源打開(kāi)后,CPU將自動(dòng)進(jìn)入實(shí)模式,并從地址0xFFFF0(CS:0xFFFF,IP:0x0)開(kāi)始自動(dòng)運(yùn)行程序代碼,此地址一般是BIOS的地址。
BIOS啟動(dòng)后,將啟動(dòng)設(shè)備的主引導(dǎo)記錄。主引導(dǎo)記錄位于第0磁道的第1個(gè)扇區(qū),它的大小是512字節(jié),里面存放了用匯編語(yǔ)言編寫(xiě)的預(yù)啟動(dòng)信息、分區(qū)表信息、魔數(shù)0x55AA等。
BIOS將主引導(dǎo)記錄讀入內(nèi)存絕對(duì)地址0x7C00處,并跳轉(zhuǎn)到此地址運(yùn)行。
在SylixOS平臺(tái)中,事實(shí)上被拷貝到物理內(nèi)存0x7C00處的內(nèi)容就是GRUB。
2. GRUB的作用
GRUB是目前較流行啟動(dòng)引導(dǎo)程序。
GRUB(Grand Unified Bootloader)是當(dāng)前Linux諸多發(fā)行版本默認(rèn)的引導(dǎo)程序,SylixOS遵循了GRUB的引導(dǎo)協(xié)議Multiboot后,也可以使用GRUB進(jìn)行引導(dǎo)。
GRUB執(zhí)行后,將初始化設(shè)置內(nèi)核執(zhí)行所需的環(huán)境,載入內(nèi)核鏡像。
GRUB分為1.x版本和2.x版本,兩個(gè)版本的架構(gòu)有所不同,目前SylixOS啟動(dòng)還是使用1.x版本的GRUB。
GRUB1.x磁盤(pán)引導(dǎo)SylixOS全過(guò)程:
stage1
GRUB讀取磁盤(pán)的第一個(gè)512字節(jié)的主引導(dǎo)記錄MBR。
stage1.5
識(shí)別各種不同的文件系統(tǒng)格式,目的是為了GRUB能識(shí)別到文件系統(tǒng)。
stage2
載入系統(tǒng)引導(dǎo)菜單(“/boot/grub/menu.lst”或“grub.lst”),載入SylixOS的x86鏡像bspx86.elf。
3. Multiboot協(xié)議
為了統(tǒng)一x86平臺(tái)GRUB引導(dǎo)各式操作系統(tǒng)的流程,GRUB支持了Multiboot的引導(dǎo)協(xié)議,該協(xié)議定義了一個(gè)可識(shí)別的系統(tǒng)鏡像文件頭部應(yīng)具備的格式協(xié)議,Multiboot首部定義如下表所示。
SylixOS參照上表所示的Multiboot首部定義規(guī)則,對(duì)SylixOS的x86鏡像的Multiboot首部進(jìn)行了定義,如下圖所示。
并且按照Multiboot的協(xié)議要求,Multiboot的首部應(yīng)當(dāng)位于整個(gè)elf鏡像的首部位置,所以對(duì)于SylixOS的BSP鏡像工程,在鏈接Multiboot文件時(shí)需要指定其地址,如下圖所示。
4. SylixOS啟動(dòng)
4.1 GRUB解析bspx86.elf
GRUB啟動(dòng)時(shí),會(huì)根據(jù)menu.lst文件加載對(duì)應(yīng)的系統(tǒng)鏡像。
SylixOS的RealEvo-IDE默認(rèn)提供的menu.lst文件內(nèi)容如下圖所示。
在menu.lst文件中指定了GRUB啟動(dòng)的默認(rèn)等待時(shí)間timeout、默認(rèn)加載菜單項(xiàng)default以及各菜單條目。
如,菜單條目“title SylixOS(UP)”,其定義了使用GRUB的kernel命令引導(dǎo)bspx86.elf文件,并為其傳遞“ncpus=1 hz=1000”等參數(shù)。
GRUB的kernel命令會(huì)解析bspx86.elf文件,判斷其Multiboot首部的有效性,在有效性完整判斷結(jié)束之后,根據(jù)elf的頭信息,對(duì)bspx86.elf的各個(gè)段進(jìn)行重定位。
4.2 重定位入口地址
elf文件的頭信息中包含了該elf文件眾多的信息,使用elf文件分析工具等程序,可以查看elf文件頭部的信息,如下圖所示。
程序的入口地址是在elf文件中設(shè)定好的,所以GRUB在將SylixOS鏡像重定位后,也會(huì)將該入口地址設(shè)置在elf頭信息中指定的位置。
4.3 跳轉(zhuǎn)到主核入口地址
x86主核入口代碼如下圖所示。
以SylixOS的32位系統(tǒng)為例,在跳轉(zhuǎn)到該入口地址后,應(yīng)先設(shè)置棧指針,而設(shè)置棧指針之前,需要關(guān)閉中斷。
最后調(diào)用CALL命令,跳轉(zhuǎn)到C程序入口bspInit,而bspInit的兩個(gè)參數(shù)由%EBX和%EAX寄存器傳遞,分別為Multiboot的魔數(shù)和Multiboot信息結(jié)構(gòu)體的首地址。
4.4 主核引導(dǎo)從核啟動(dòng)
主核引導(dǎo)從核啟動(dòng)也是遵循了Intel制定的從核啟動(dòng)規(guī)則。
如下圖所示,BSP為BIOS引導(dǎo)的主核,AP為待BSP啟動(dòng)的從核。BSP需要首先向AP發(fā)送INIT IPI命令,之后連續(xù)發(fā)送兩次STARTUP IPI命令。
INIT IPI命令與STARTUP IPI命令都是固定的帶有參數(shù)的指令,通過(guò)核間中斷的方式進(jìn)行發(fā)送。
INIT IPI命令可以使AP自動(dòng)進(jìn)行復(fù)位操作,并完成上電啟動(dòng)后POST自檢等硬件所需流程。
STARTUP IPI命令中可以指定從核跳轉(zhuǎn)到實(shí)模式執(zhí)行的指令內(nèi)容和地址,由此可以使從核按照SMP或AMP的流程進(jìn)行初始化。
總結(jié)
以上是生活随笔為你收集整理的x86架构linux内核引导过程分析,SylixOS---x86引导过程分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: linux系统清除日志,如何清除Linu
- 下一篇: linux内核定时唤醒,Linux内核时
