在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

編寫一個可以用GRUB來引導的簡單x86內核

C語言專家集中營 ? 2018-01-21 09:12 ? 次閱讀

在這篇文章中,我們將從零開始,動手編寫一個可以用GRUB來引導的簡單x86內核,該內核會在屏幕上打印一條信息,然后——掛起!

one-does-not-kernel

一個人寫一個內核是一件簡單的事情

X86機器是怎樣啟動的?

在我們思考怎樣寫一個內核之前,讓我們先看一下x86機器從啟動到把控制權交給內核的過程是怎樣的:

x86CPU在機器啟動之后就會從地址[0xFFFFFFF0]處開始執行,這個地址就是在32位尋址空間中的最后16個字節處,這里存放了一條跳轉指令,會跳轉到內存中BIOS代碼起始處。

接著,cpu就開始開始執行BIOS代碼塊了,BIOS首先會在我們配置好的啟動設備序列中,通過檢查一個特定的魔數,找到第一個可以引導的設備。

一旦BIOS找到一個可以引導的設備后,它就會把該設備第一個扇區的代碼復制到物理內存的[0x7c00]的位置,然后跳轉到這個地址開始執行這一段代碼,我們習慣把這一段代碼叫作bootloader。

Bootloader會將內核代碼加載到物理內存[0x100000]的位置,[0x100000]這個地址是所有x86機器宏內核代碼的起始地址。

我們需要哪一些工具?

* 一個x86構架的計算機

*Linux

*NASM匯編

*GCC

*LD(GNU連接器)

*GRUB

源碼

源代碼可以在我的Github上找到:Githubrepository-mkernel

用匯編代碼來編寫內核入口

我們喜歡用c來做所有的事情,但是我們無可避免地需要用到一點兒匯編,我們將會寫一小段x86的匯編代碼來作為內核入口,這一段匯編代碼會在調用我們的c代碼后停止整個程序流程。

我們怎樣確認匯編代碼會作為內核的起始點呢?

我們將用一個連接器腳本將這些目標文件鏈接成我們最終的內核程序(稍后解釋更多),在連接器腳本里,我們指定了這段二進制代碼會被加載到內存[0x100000]處。這個地址就是我之前說過的,內核所希望的起始地址。

匯編代碼如下:

1. ;;kernel.asm2. bits 32 ;nasm directive -32 bit3. section .text4.5. global start6. extern kmain ;kmain isdefinedin the c file7.8. start:9. cli ;block interrupts10. call kmain11. hlt ;halt the CPU

第一行指令bit32不是x86匯編指令,它是一條NASM指令,指定nasm匯編器產生32位的程序,這條語句并不是必不可少的,但加上它是一個好的編程習慣。

第二行是text段(代碼段)的開始,在這里存放著我們的代碼塊。

global是另外一個NASM指令,用將一個符號設置為全局符號。這樣做連接器才會知道符號start在哪兒開始,start是我們程序的入口地址。

kmain是我們定義在kernel.c文件中的函數,extern關鍵字聲明了該函數定義在別的文件中。

到這里,我們的函數start調用kmian函數之后就會使用hlt指令將CPU掛起,中斷會cpu從hlt指令中喚醒,我們要在掛起之前用cli指令來關閉系統的中斷響應,cli指令是清除中斷(clear-interrupts)的縮寫。

用C實現的內核

在kernle.asm中,我們調用了kmain()函數,所以我們的c代碼將會在kmain()中開始運行:

1. /*2.* kernel.c3.*/4.void kmain(void)5.{6. char*str ="my first kernel";7. char*vidptr =(char*)0xb8000; //video mem begins here.8. unsignedint i =0;9. unsignedint j =0;10. //clear all11. while(j <80*25*2){12.??????? //blank character13.???????????????? ????????????vidptr[j]=' ';14.??//attribute-byte: light grey on black screen???????15.???????????????? ??????????????vidptr[j+1]=0x07; ?????? ???????????16.???????????????? ??????????????? j = j +2;17.???????????????? ???? }18.???????????????? ???? j =0;19.?????????????? ? while(str[j]!='

主站蜘蛛池模板: 午夜福利国产一级毛片 | 狂野欧美激情性xxxx | 欧美a色| 理论毛片 | 欧美满足你的丝袜高跟ol | 色丁香久久 | 成人在线播放av | 国产国产人免费人成成免视频 | 性免费网站 | 九色九色九色在线综合888 | 国产精品美女在线 | 日本在线视频一区二区 | 九九热在线免费观看 | 五月天婷婷在线观看 | 日本一区二区三区在线观看视频 | 人人免费人人专区 | 日本一区二区三区四区视频 | 亚洲视频一区在线 | 91免费网站在线看入口黄 | 亚洲三级成人 | 视频一区二区三区在线观看 | 欧美黄一片 | 黄色视屏在线免费观看 | 国产精品视频你懂的 | 国语自产免费精品视频一区二区 | 日韩免费视频一区 | www.狠狠艹| 色噜噜亚洲 | 久久视频精品36线视频在线观看 | 婷婷六月久久综合丁香一二 | 国产欧美日韩va | 黄在线网站 | 天天干天天操天天插 | 欧美屁屁影院 | 久久久免费观看 | 最近最新中文字幕在线第一页 | 夜夜澡人人爽人人喊_欧美 夜夜综合网 | 国产一级特黄毛片 | 久久永久免费视频 | 亚洲五月婷婷 | 三级在线播放 |