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