1. 操作系統(tǒng)內(nèi)核實(shí)驗(yàn)之運(yùn)行環(huán)境

前言

操作系統(tǒng)的實(shí)現(xiàn)非常復(fù)雜,我們通過自己動(dòng)手完成一個(gè)操作系統(tǒng)內(nèi)核赞咙,以此加深對(duì)軟件運(yùn)行原理的理解怜森。

平臺(tái)&工具

操作系統(tǒng):Windows 10
虛擬機(jī):Virtual Box
編譯工具:nasm
軟盤映像工具:WinImage

引導(dǎo)扇區(qū)

計(jì)算機(jī)上電之后,會(huì)進(jìn)行一系列的硬件初始化和檢測娩嚼,待自檢完成魏宽,BIOS開始查找可引導(dǎo)設(shè)備腐泻,一旦查找到正確的引導(dǎo)設(shè)備决乎,BIOS即將該設(shè)備的引導(dǎo)扇區(qū)加載至內(nèi)存地址為7c00h的位置队询,然后跳轉(zhuǎn)至該地址處派桩,并開始執(zhí)行引導(dǎo)程序。

扇區(qū)
軟盤的每個(gè)面由若干條磁道組成蚌斩,磁道是面上的同心圓環(huán)铆惑;每條磁道又被劃分為若干個(gè)區(qū)域,這些區(qū)域即稱為扇區(qū)送膳,通常一個(gè)扇區(qū)的大小是512字節(jié)(bytes)员魏。

引導(dǎo)扇區(qū)
引導(dǎo)扇區(qū)就是由BIOS加載,用于引導(dǎo)(加載叠聋、執(zhí)行跳轉(zhuǎn))操作系統(tǒng)內(nèi)核的扇區(qū)撕阎。如果對(duì)所有扇區(qū)按順序從0開始進(jìn)行編號(hào)的話,那么引導(dǎo)扇區(qū)是第0個(gè)扇區(qū)碌补。

以下為一段顯示字符串的代碼:

;文件名 hos.asm
org 7C00h

jmp START

message     db  "Hello, my os world!", 0

; 輸出字符
; al    字符
printChar:
    mov ah, 0eh                 ; 設(shè)置功能號(hào)
    mov cx, 1
    int 10h                     ; 第10h號(hào)中斷調(diào)用
    ret

START:      
    lea si, [message]           ; 將字符串首地址賦給寄存器si
    jmp LBE_ISNULL
LBE_PRINTC:
    call printChar              ; 調(diào)用PrintChar函數(shù)輸出字符
    inc si
LBE_ISNULL:
    mov al, [si]                ; 將si所指內(nèi)存的值賦給al
    test al, al                 ; 檢查al是否為0
    jnz LBE_PRINTC
    hlt

    times 510 - ($ - $$) db 0   ; 將當(dāng)前位置至510之間的字節(jié)都初始化為0
    dw 0xaa55                   ; 將第一扇區(qū)的最后兩個(gè)字節(jié)初始化為0xaa55
  • org 7c00h
    org指令指定了程序的偏移地址虏束。因?yàn)锽IOS會(huì)將引導(dǎo)扇區(qū)加載至內(nèi)存地址為7c00h的位置,如果不通過該指令設(shè)置程序的起始地址厦章,那么在運(yùn)行時(shí)以“段地址:偏移”的方式來尋址就會(huì)得到:

    ds * 10h + 文件偏移 = 0 * 10h + 文件偏移
    

    顯然镇匀,這是錯(cuò)誤的。而在使用org指令指定偏移地址后袜啃,得到正確的地址應(yīng)該是:

    ds * 10h + (文件偏移 + 7c00h)
    
  • int 10h
    int即interrupt(中斷)的簡寫汗侵,int 10h就是第10h號(hào)中斷調(diào)用。雖然語法不同群发,但它的作用就和其它高級(jí)語言的函數(shù)(Function)或者方法(Method)一樣晰韵,由BIOS進(jìn)行設(shè)置,系統(tǒng)開發(fā)者調(diào)用以實(shí)現(xiàn)各種功能熟妓。而第10h號(hào)中斷則提供了非常有用的視頻輸出服務(wù)宫屠,包括視頻模式設(shè)置、圖形輸出滑蚯、文本輸出等浪蹂。 參考 INT 10H(維基百科)

  • times
    times前綴不屬于x86指令集,類似的還有db告材、dw坤次、resb、resw等斥赋。對(duì)于這類指令缰猴,NASM中有一個(gè)專業(yè)的術(shù)語 —— 偽指令(Pseudo Instructions)。times的作用是重復(fù)執(zhí)行某個(gè)操作疤剑,例如:

    times 512 db 0  ; 將 db 0 重復(fù)執(zhí)行512次滑绒,也就是將512個(gè)字節(jié)初始化為0
    
  • $和$$
    $符號(hào)指示當(dāng)前行首在代碼中的位置闷堡,$$指示當(dāng)前節(jié)區(qū)(SECTION)頭在代碼中的位置,$ - $$ 則表示當(dāng)前行至節(jié)區(qū)頭的偏移疑故。

  • 0xaa55
    引導(dǎo)扇區(qū)標(biāo)識(shí)杠览,BIOS根據(jù)此標(biāo)識(shí)來確定該扇區(qū)是否為引導(dǎo)扇區(qū)。

節(jié)區(qū)(SECTION)也稱為(SEGMENT)


運(yùn)行環(huán)境

1. 使用NASM編譯
nasm hos.asm -o hos.bin
-o 參數(shù)指定輸出的文件名

數(shù)據(jù)和指令
在計(jì)算機(jī)中存儲(chǔ)的一切都是數(shù)據(jù)纵势,.mp3文件內(nèi)容是數(shù)據(jù)踱阿、.txt文件是數(shù)據(jù)、.exe文件也是數(shù)據(jù)钦铁,在磁盤中是數(shù)據(jù)软舌、在內(nèi)存中也是數(shù)據(jù)。只有當(dāng)數(shù)據(jù)用于執(zhí)行時(shí)牛曹,才將其稱之為指令佛点。

2. 創(chuàng)建軟盤映像
  1. 使用WinImage創(chuàng)建軟盤映像,選擇1.44MB格式.
1_1 新建軟盤鏡像.png
  1. 將其另存為IMA格式超营,命名為hos;
  2. 將編譯好的"hos.bin"文件寫入"hos.IMA"映像的第0扇區(qū),即文件偏移0x0000 -0x01FF處焰手;
3. 創(chuàng)建一個(gè)專屬虛擬機(jī)系統(tǒng);
1_4 新建虛擬機(jī).png

因?yàn)槲覀兊摹安僮飨到y(tǒng)”目前還沒有人知道糟描,當(dāng)然,“VirtualBox”的工程師們也不會(huì)知道书妻,所以系統(tǒng)類型還是選擇“Other(其它)”吧船响!至此,虛擬機(jī)也已經(jīng)創(chuàng)建完成躲履。大家是不是都有點(diǎn)迫不及待的想看看運(yùn)行結(jié)果了呢见间?不過先等一下,我們還要把“操作系統(tǒng)”添加到虛擬機(jī)上才算是大功告成工猜。

4. 添加軟盤映像米诉;
1_5 添加軟盤映像.png
5. 運(yùn)行;
1_6 運(yùn)行.png

附注

  1. 在VirtualBox和VMware中,引導(dǎo)扇區(qū)以0xaa55和0x55aa結(jié)束似乎都是可以的篷帅。
  2. NASM編譯輸出的文件可以是任意類型史侣,例如"MYOS.bin"、"HOS.os"魏身、"OS.abc"等惊橱,因?yàn)椴还苁鞘裁搭愋偷奈募?指令)數(shù)據(jù)(在二進(jìn)制編輯器中查看)都是一樣的箭昵。我們并不需要根據(jù)類型來解析此文件税朴,而僅是將其原樣復(fù)制到映像文件的第一個(gè)扇區(qū)。
  3. 軟盤映像也可以另存為img格式,直接輸入”hos.img”正林,然后保存即可泡一。
  4. 寫一個(gè)復(fù)制引導(dǎo)扇區(qū)的程序!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末觅廓,一起剝皮案震驚了整個(gè)濱河市鼻忠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌哪亿,老刑警劉巖粥烁,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贤笆,死亡現(xiàn)場離奇詭異蝇棉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)芥永,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門篡殷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人埋涧,你說我怎么就攤上這事板辽。” “怎么了棘催?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵劲弦,是天一觀的道長。 經(jīng)常有香客問我醇坝,道長邑跪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任呼猪,我火速辦了婚禮画畅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宋距。我一直安慰自己轴踱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布谚赎。 她就那樣靜靜地躺著淫僻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪壶唤。 梳的紋絲不亂的頭發(fā)上雳灵,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音视粮,去河邊找鬼细办。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的笑撞。 我是一名探鬼主播岛啸,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼茴肥!你這毒婦竟也來了坚踩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤瓤狐,失蹤者是張志新(化名)和其女友劉穎瞬铸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體础锐,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嗓节,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了皆警。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拦宣。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖信姓,靈堂內(nèi)的尸體忽然破棺而出鸵隧,到底是詐尸還是另有隱情,我是刑警寧澤意推,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布豆瘫,位于F島的核電站,受9級(jí)特大地震影響菊值,放射性物質(zhì)發(fā)生泄漏外驱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一俊性、第九天 我趴在偏房一處隱蔽的房頂上張望略步。 院中可真熱鬧,春花似錦定页、人聲如沸趟薄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杭煎。三九已至,卻和暖如春卒落,著一層夾襖步出監(jiān)牢的瞬間羡铲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來泰國打工儡毕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留也切,地道東北人扑媚。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像雷恃,于是被迫代替她去往敵國和親疆股。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容