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