<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > Linux內(nèi)核啟動-內(nèi)核解壓縮

          Linux內(nèi)核啟動-內(nèi)核解壓縮

          作者: 時間:2012-07-10 來源:網(wǎng)絡(luò) 收藏

          這得從vmliux.bin的產(chǎn)生過程說起。

          本文引用地址:http://www.ex-cimer.com/article/148792.htm

          的生成過程來看的鏈接主要有三步:

          第一步是把的源代碼編譯成.o文件,然后鏈接,這一步,鏈接的是arch/i386/kernel/head.S,生成的是vmlinux。注意的是這里的所有變量地址都是32位頁尋址方式的保護(hù)模式下的虛擬地址。通常在3G以上。

          第二步,將vmlinux objcopy 成arch/i386/boot/compressed/vmlinux.bin,之后加以,最后作為數(shù)據(jù)編譯成piggy.o。這時候,在編譯器看來,piggy.o里根本不存在什么STartup_32。

          第三步,把head.o,misc.o和piggy.o鏈接生成arch/i386/boot/compressed/vmlinux,這一步,鏈接的是arch/i386/boot/compressed/head.S。這時arch/i386/kernel/head.S中的startup_32被,作為一段普通的數(shù)據(jù),而被編譯器忽視了。注意這里的地址都是32位段尋址方式的保護(hù)模式下的線性地址。

          自然,在這過程中,不可能會出現(xiàn)startup_32重定義的問題。

          你可能會說:太BT了,平時誰會采用這種方式編譯程序?

          是啊,然而在內(nèi)核還沒的情況下,要高效地實現(xiàn)自解壓,還有更好的方式么?

          所以前面的問題就迎刃而解。setup執(zhí)行完畢,跳轉(zhuǎn)到vmlinux.bin中的startup_32()是arch/i386/boot/compressed/head.S中的startup_32()

          這是一段自解壓程序,過程和內(nèi)核生成的過程正好相反。這時,CPU處在32位段尋址方式的保護(hù)模式下,尋址范圍從1M擴(kuò)大到4G。只是沒有頁表。

          我們對具體的解壓過程不感興趣。

          內(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教程




          關(guān)鍵詞: 內(nèi)核 壓縮 啟動 Linux

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();