一篇文章帶你使用C語言編寫內(nèi)核
gcc 命令
- 使用 gcc 編譯 c語言
-c 編譯、匯編到目標代碼,不進行鏈接,也就是直接生成目標文件
-o 將輸出的文件以指定文件名來儲存,有同名文件存在時直接覆蓋
gcc -c -o kernel/main.o kernel/main.c
編譯:編譯號之后只是個目標文件,也稱為待重定位文件,重定位指的是文件里面所用的符號還沒有安排地址,這些符號的地址需要將來與其他目標文件“組成”一個可執(zhí)行文件時再重新定位(編排地址〉,這里的符號就是指該目標文件中所調(diào)用的函數(shù)或使用的變量,而這里的“組成”就是指鏈接。需要在所有目標文件都到齊了,將它們鏈接到 起時再重新定位(編排地址)
- 使用 gcc 鏈接
-Ttext指定虛擬地址
-e 用來指定程序的起始地址(默認為_start)
gcc kernel/main.o -Ttext 0xc0001500 -e main -o kernel/kernel.bin
- 編譯鏈接
生成的test.bin不再是目標文件,而是可執(zhí)行文件
gcc -o ./kernel/test.bin ./kernel/main.c
- main 函數(shù)不是第一個執(zhí)行的代碼,它一定是被其它代碼調(diào)用的,main函數(shù)在運行庫代碼初始化完環(huán)境后才被調(diào)用
文件頭
二進制文件的運行方法
- 在文件頭中寫入和程序?qū)傩杂嘘P(guān)的信息
- 將這種具有程序頭格式的程序文件從外存讀入到內(nèi)存后,從該程序文件的程序頭中讀出入口地址, 要直接跳進入口地址執(zhí)行,跨過程序頭才行。

- header.S
編譯后生成的文件是 header.bin:nams -o header.bin header.S

- 調(diào)用方的執(zhí)行過程


- 在實際中,程序頭和程序體相分離的文件叫 elf 格式
將內(nèi)核載入內(nèi)存
將內(nèi)核寫入磁盤
dd if=./test/kernel/kernel.bin of=hd60M.img bs=512 count=200 seek=9 conv=notrunc
可以將編譯、鏈接、寫入硬盤寫成一個腳本
gcc -c -o test/kernel/main.o test/kernel/main.c && gcc test/kernel/main.o -Ttext 0xc0001500 -e main -o test/kernel/kernel.bin && dd if=./test/kernel/kernel.bin of=hd60M.img bs=512 count=200 seek=9 conv=notrunc
修改 loader.S
加載內(nèi)核:需要把內(nèi)核文件加載到內(nèi)存緩沖區(qū)。
初始化內(nèi)核:需要在分頁后,將加載進來的 elf 內(nèi)核文件安置到相應(yīng)的虛擬內(nèi)存地址,然后跳過去執(zhí)行,從此 loader 的工作結(jié)束。
把內(nèi)核文件從硬盤上加載到內(nèi)存中
mov eax, KERNEL_START_SECTOR ; kernel.bin所在的扇區(qū)號 mov ebx, KERNEL_BIN_BASE_ADDR ; 從磁盤讀出后,寫入到ebx指定的地址。加載到的內(nèi)存地址 mov ecx, 200 ; 讀入的扇區(qū)數(shù) call rd_disk_m_32 ; 創(chuàng)建頁目錄及頁表并初始化頁內(nèi)存位圖 call setup_page
初始化內(nèi)核:初始化內(nèi)核就是根據(jù) elf 規(guī)范將內(nèi)核文件中的段( segment )展開到(復(fù)制到)內(nèi)存中的相應(yīng)位置
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C++面向?qū)ο笳Z言自制多級菜單功能實現(xiàn)代碼
菜單類主要負責菜單的創(chuàng)建、修改、刪除,是包含菜單結(jié)構(gòu)組織和響應(yīng)函數(shù)的模型,用戶擁有充分的自主性,可根據(jù)需要自定義菜單顯示和響應(yīng)函數(shù),這篇文章主要介紹了C++面向?qū)ο笳Z言自制多級菜單,需要的朋友可以參考下2024-06-06
C++ LeetCode1775通過最少操作次數(shù)使數(shù)組和相等
這篇文章主要為大家介紹了C++ LeetCode1775通過最少操作次數(shù)使數(shù)組和相等,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
C語言數(shù)據(jù)結(jié)構(gòu)創(chuàng)建及遍歷十字鏈表
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)十字鏈表的創(chuàng)建及遍歷,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2021-10-10
解析bitmap處理海量數(shù)據(jù)及其實現(xiàn)方法分析
本篇文章是對bitmap處理海量數(shù)據(jù)及其實現(xiàn)的方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05
C語言實現(xiàn)簡易學(xué)生成績管理系統(tǒng)
這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡易學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-12-12

