Linux bootloader 編寫方法(轉)

ba發表於2007-08-15
Linux bootloader 編寫方法(轉)[@more@]  作者 範曉炬

對於移植 linux 到其它開發板的人來說,編寫 boot loader 是一個不可避免的過程。對於學習 linux的人來講,編寫 bootloader 也是一個很有挑戰性的工作。本文透過對 linux引導協議進行分析,詳細闡述瞭如何編寫一個可以在 i386 機器上引導 2.4.20核心的基本的bootloader。

  1.概述

  linux執行在保護模式下,但是當機器啟動復位的時候卻處於真實模式下。所以寫bootloader做的工作也是在真實模式之下的。

  linux 的核心有多種格式,老式的zImage和新型的bzImage。它們之間最大的差別是對於核心體積大小的限制。由於zImage核心需要放在真實模式1MB 的記憶體之內,所以其體積受到了限制。目前採用的核心格式大多為bzImage,這種格式沒有1MB記憶體限制。本文以下部分主要以bzImage為例進行分析。

  2.bzImage格式核心的結構

  bzImage核心從前向後分為3個部分,前512位元組被稱為 bootsect,這就是軟盤引導linux時用到的bootloader,如果不從軟盤引導,這部分就沒有用,其中儲存了一些編譯時生成的核心啟動選項的預設值。從512個位元組開始的512*n個位元組稱為setup部分,這是linux核心的真實模式部分,這部分在真實模式下執行,主要功能是為保護模式的 linux核心啟動準備環境。這個部分最後會切換進入保護模式,跳轉到保護模式的核心執行。最後的部分就是保護模式的核心,也就是真正意義上的linux 核心。其中n的大小可以從bootsect後半部得到,詳細地址可以參閱linux boot protocol。

  3.引導過程概述

  第一步,開啟冰箱門;第二步把大象放到冰箱裡……不要笑,過程就是這麼簡單。首先需要把linux核心的setup部分複製到9020H:0開始的地址,然後把保護模式核心複製到1MB開始的地址,然後根據Linux Boot Protocol 2.03的內容設定引數區的內容,基地址就是9000H: 0,最後使用一條ljmp $0x9020,$0跳轉到setup段,剩下的事情就是linux自己的了^_^,果然簡單吧!

  4.THE LINUX/I386 BOOT PROTOCOL

  這個就是我們引導linux所使用的協議,它的位置在:Documetation/i386/boot.txt中。裡面詳細的寫了引導linux所需要知道的一切知識,對於其它體系結構的CPU,也一定存在著類似的東東,仿照本文的方法就可以了。

  5.細節一:基本引導引數

  當然我們不指定任何引數linux核心也可以啟動,但是這樣有可能啟動進入一個我們不支援的framebuffer模式,導致沒有任何螢幕顯示;也可能 mount了錯誤的根分割槽失敗,導致No Init Found的kernel panic。所以我們必須要指定一些東西。

  如果你像我一樣是一個懶人,那麼可以直接把bootsect拷到9000H:0的位置,使用軟盤引導時它會把自己複製到這個地方的,這裡面有些預設的設定,詳情請見boot.txt。

  首先是root的位置,這裡bootsect_pos指向的是9000H:0的地址。
CODE:
bootsect_pos[0x1fc] = root_minor;
bootsect_pos[0x1fd] = root_major;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-959558/,如需轉載,請註明出處,否則將追究法律責任。

Linux bootloader 編寫方法(轉)
請登入後發表評論 登入
全部評論

相關文章