Linux bootloader 編寫方法(轉)
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的地址。
對於移植 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/,如需轉載,請註明出處,否則將追究法律責任。
請登入後發表評論
登入
全部評論
|
相關文章
- Bootloader Linux啟動bootLinux
- Linux 指令碼編寫基礎(轉)Linux指令碼
- 為Linux 應用程式編寫 DLL(轉)Linux
- 編寫Linux實用程式的藝術(轉)Linux
- Linux網路驅動程式編寫(四)(轉)Linux
- Linux網路驅動程式編寫(三)(轉)Linux
- Linux網路驅動程式編寫(二)(轉)Linux
- Linux網路驅動程式編寫(一)(轉)Linux
- 在Delphi中編寫控制元件的基本方法 (轉)控制元件
- 小米5一鍵解鎖BootLoader的方法boot
- Linux系統核心模組和驅動的編寫(轉)Linux
- 在Delphi中編寫控制元件的基本方法(1) (轉)控制元件
- 編寫適用於模擬器的 Linux 程式碼(轉)Linux
- java安全編碼指南之:方法編寫指南Java
- C++編寫DLL的方法C++
- JavaScript 編寫和執行方法JavaScript
- 用Delphi編寫DelTree程式 (轉)
- 用Java編寫ASP元件 (轉)Java元件
- 用Excel編寫小遊戲 (轉)Excel遊戲
- 用C語言編寫Linux實用程式的藝術(轉)C語言Linux
- 入門文章:教你學會編寫Linux裝置驅動(轉)Linux
- 淺談 Linux 下 Makefile 編寫Linux
- Linux 指令碼編寫基礎Linux指令碼
- Linux指令碼編寫基礎Linux指令碼
- 動手寫一個STM8的輕量級bootloaderboot
- Linux核心重編譯常見故障及其解決方法(轉)Linux編譯
- (轉)Qt之qss檔案編寫QT
- 編寫網路尋呼機 (轉)
- 用VC++編寫CGI程式 (轉)C++
- 用VB編寫抽獎程式 (轉)
- 利用DELPHI編寫WINDOWS外殼 (轉)Windows
- 編寫易讀的程式碼 (轉)
- 動畫程式編寫——DirectDraw之旅(3)(轉)動畫
- 編寫高效的MySQL應用(轉)MySql
- Linux RN6752 驅動編寫Linux
- Linux指令碼編寫基礎(五)Linux指令碼
- Python呼叫C++編寫的方法PythonC++
- Linux批量編碼轉換Linux