前言
操作系統(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)建軟盤映像
- 使用WinImage創(chuàng)建軟盤映像,選擇1.44MB格式.
- 將其另存為IMA格式超营,命名為hos;
- 將編譯好的"hos.bin"文件寫入"hos.IMA"映像的第0扇區(qū),即文件偏移0x0000 -0x01FF處焰手;
3. 創(chuàng)建一個(gè)專屬虛擬機(jī)系統(tǒng);
因?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. 添加軟盤映像米诉;
5. 運(yùn)行;
附注
- 在VirtualBox和VMware中,引導(dǎo)扇區(qū)以0xaa55和0x55aa結(jié)束似乎都是可以的篷帅。
- NASM編譯輸出的文件可以是任意類型史侣,例如"MYOS.bin"、"HOS.os"魏身、"OS.abc"等惊橱,因?yàn)椴还苁鞘裁搭愋偷奈募?指令)數(shù)據(jù)(在二進(jìn)制編輯器中查看)都是一樣的箭昵。我們并不需要根據(jù)類型來解析此文件税朴,而僅是將其原樣復(fù)制到映像文件的第一個(gè)扇區(qū)。
- 軟盤映像也可以另存為img格式,直接輸入”hos.img”正林,然后保存即可泡一。
- 寫一個(gè)復(fù)制引導(dǎo)扇區(qū)的程序!