加载不同linux内核,Linux内核加载过程
以32位x86,bzImge為例
grub版本為0.97
1、計(jì)算機(jī)上電
2、0xFFFFFFF0
當(dāng)cpu檢測reset引腳上的信號后
便將指令指針寄存器的值設(shè)置為0xfff0
——INTEL 80386 PROGRAMMER'S REFERENCE MANUAL 1986, Chapter 10
此時(shí)為實(shí)模式,cpu將執(zhí)行物理地址0xFFFFFFF0處的指令
訪址的時(shí)候,硬件將該地址映射到BIOS的ROM中
BIOS中的指令將MBR復(fù)制到物理地址0x7c00處,并跳轉(zhuǎn)到該處執(zhí)行
3、0x7C00
MBR中的指令由grub安裝而來,為grub-0.97/stage1/stage1.S
stage1將stage2的第1部分grub-0.97/stage2/start.S(512字節(jié))復(fù)制到物理地址0x8000處,并跳轉(zhuǎn)到該處執(zhí)行
stage2將剩余部分grub-0.97/stage2/asm.S復(fù)制到物理地址0x8200處,并跳轉(zhuǎn)到該處執(zhí)行
...
grub-0.97/stage2/boot.c——load_image()函數(shù)
將內(nèi)核映像bzImage的setup部分復(fù)制到物理地址0x90000
vmlinux部分復(fù)制到物理地址0x100000處
隨后跳轉(zhuǎn)到0x90200處執(zhí)行
4、0x90200
arch/x86/boot/heaer.S——_start => start_of_setup
檢查準(zhǔn)備實(shí)模式堆棧,bss段清0,隨后調(diào)用arch/x86/boot/main.c——main()函數(shù)
main()中使用BIOS中斷讀取一些硬件信息,如內(nèi)存信息等
最后調(diào)用arch/x86/boot/pm.c——go_to_protected_mode()函數(shù)
go_to_protected_mode()設(shè)置段描述符,隨后調(diào)用arch/x86/boot/pmjump.S——protected_mode_jump()函數(shù)
protected_mode_jump()置cr0的PE位,開啟保護(hù)模式
最后跳轉(zhuǎn)到code32_start,對于bzImage即物理地址0x100000,grub復(fù)制的bzImage第2部分
5、0x100000
arch/x86/boot/compressed/head_32.S——startup_32
arch/x86/boot/compressed/misc.c——decompress_kernel()解壓內(nèi)核
解壓完成后跳轉(zhuǎn)到output
6、LOAD_PHYSICAL_ADDR
根據(jù)不同的配置,解壓后的代碼在物理內(nèi)存中的起始位置亦不同
arch/x86/kernel/head_32.S——startup_32
設(shè)置頁表,置cr0的PG位,開啟分頁
最后跳轉(zhuǎn)到arch/x86/kernel/head32.c——i386_start_kernel()函數(shù)
i386_start_kernel()中最后調(diào)用start_kernel()
7、start_kernel()
init/main.c——start_kernel()
進(jìn)入c代碼部分
總結(jié)
以上是生活随笔為你收集整理的加载不同linux内核,Linux内核加载过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql从服务器配置_mysql主从服
- 下一篇: linux 内核裁剪的具体过程和方法,L