Linux內(nèi)核啟動(dòng)-內(nèi)核解壓縮
這得從vmliux.bin的產(chǎn)生過(guò)程說(shuō)起。
本文引用地址:http://2s4d.com/article/148792.htm從內(nèi)核的生成過(guò)程來(lái)看內(nèi)核的鏈接主要有三步:
第一步是把內(nèi)核的源代碼編譯成.o文件,然后鏈接,這一步,鏈接的是arch/i386/kernel/head.S,生成的是vmlinux。注意的是這里的所有變量地址都是32位頁(yè)尋址方式的保護(hù)模式下的虛擬地址。通常在3G以上。
第二步,將vmlinux objcopy 成arch/i386/boot/compressed/vmlinux.bin,之后加以壓縮,最后作為數(shù)據(jù)編譯成piggy.o。這時(shí)候,在編譯器看來(lái),piggy.o里根本不存在什么STartup_32。
第三步,把head.o,misc.o和piggy.o鏈接生成arch/i386/boot/compressed/vmlinux,這一步,鏈接的是arch/i386/boot/compressed/head.S。這時(shí)arch/i386/kernel/head.S中的startup_32被壓縮,作為一段普通的數(shù)據(jù),而被編譯器忽視了。注意這里的地址都是32位段尋址方式的保護(hù)模式下的線性地址。
自然,在這過(guò)程中,不可能會(huì)出現(xiàn)startup_32重定義的問(wèn)題。
你可能會(huì)說(shuō):太BT了,平時(shí)誰(shuí)會(huì)采用這種方式編譯程序?
是啊,然而在內(nèi)核還沒(méi)啟動(dòng)的情況下,要高效地實(shí)現(xiàn)自解壓,還有更好的方式么?
所以前面的問(wèn)題就迎刃而解。setup執(zhí)行完畢,跳轉(zhuǎn)到vmlinux.bin中的startup_32()是arch/i386/boot/compressed/head.S中的startup_32()
這是一段自解壓程序,過(guò)程和內(nèi)核生成的過(guò)程正好相反。這時(shí),CPU處在32位段尋址方式的保護(hù)模式下,尋址范圍從1M擴(kuò)大到4G。只是沒(méi)有頁(yè)表。
我們對(duì)具體的解壓過(guò)程不感興趣。
內(nèi)核解壓完畢。位于0x100000即1M處
最后,執(zhí)行一條跳轉(zhuǎn)指令,執(zhí)行0x100000處的代碼,即startup_32(),這回是arch/i386/kernel/head.S中的startup_32()代碼
ljmp $(__BOOT_CS), $__PHYSICAL_START
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)linux相關(guān)文章:linux教程
評(píng)論