從上圖能夠獲得一個問題,爲何不能從boot直接加載kernnel,並跳轉運行?
該設計的思路
1.boot必須小於512字節,沒法完成過多功能
2.kernel須要運行於32位保護模式(彙編+c語言)
3.使用loader中轉:獲取必要硬件信息,進入保護模式
進行的重構方案以下所示
文件功能的定義
common.asm--常量定義,宏定義
blfunc.asm--實模式下的文件加載功能定義
boot.asm--加載loader並跳轉[引導扇區]
loader.asm--在這裏須要進行的操做是必要硬件初始化,加載kernel,進入保護模式,跳轉到kernel執行ide
須要進行的修改
1.將以前定義的inc.asm修改爲common.asm,並在makefile中的連接關係將其相關的名字進行修改
2.在loader.asm中相關的頭文件進行修改
3.函數重構的實現--將其實現不一樣的接口[將以前的代碼進行改寫,細分模塊
blfunc.asm注意事項
1.%include "blfunc.asm"必須是第一條"包含"語句
2.%include "blfunc.asm"強制從BLMain標籤處開始執行
3.Buffer爲必要的內存緩衝區必須在代碼末尾定義函數
內核雛形構造
經過上圖可知,kernel.out加載進內存後不能直接被x86處理器運行,產生的緣由有三種
1.kernel.out是Linux系統中的可執行程序
2.Linux中的可執行程序爲elf格式的文件-固定數據格式
3.處理器只認代碼和數據,沒法正確執行elf可執行程序
改進方法
1.提取elf文件中的代碼段與數據段-刪除elf文件格式信息
2.重定位提取後的代碼和數據段,獲得內核文件
3.加載內核文到內存-起始地址可自定義
4.跳轉到內核入口地址處執行工具
在這裏介紹一個工具,會有三種數據處理格式-以下圖所示
所需的實驗文件連接https://down.51cto.com/data/2468702
小結
1.實驗nasm和gcc編譯獲得的是elf目標文件
2.ld將elf目標文件裝配成爲elf可執行程序
3.實驗elf2kobj將可執行程序轉換爲內核文件
4.在實模式下加載轉換獲得的內核文件
5.進入保護模式後執行跳轉內核起始位置處執行操作系統