第一章--最小的“操作系统”
一、最簡單的“操作系統(tǒng)”
最最簡單的“操作系統(tǒng)”就是一個最最簡單的引導(dǎo)扇區(qū)(Boot Sector)。雖然它不具有任何功能,但是它卻能夠直接在裸機上運行,不依賴其他軟件。一個引導(dǎo)扇區(qū)是512個字節(jié),并且以0xAA55為結(jié)束標(biāo)識的扇區(qū)。下面就是那個最最簡單的引導(dǎo)扇區(qū)。
[cpp] view plaincopy
org偽指令: org + 數(shù)值表達式
其中,org是操作碼,不可省略。數(shù)值表達式給出偏移地址值,即org語句后的指令或數(shù)據(jù)以數(shù)值表達式給出的值作為起始的偏移地址。數(shù)值表達式必須是一個可計算得到的正整數(shù),數(shù)值范圍在0~65535之間。
org偽指令用來指出其后的程序段或數(shù)據(jù)塊存放的起始地址的偏移量。匯編程序匯編時把語句中表達式的值作為起始地址,連續(xù)存放org語句之后的程序和數(shù)據(jù),直到出現(xiàn)一個新的org指令。若省略org語句,則從本段起始地址開始連續(xù)存放。
在大多數(shù)情況下,不需要用org語句設(shè)置位置指針。由于段定義語句是段的起點,它的偏移地址為0000H,以后每分配一個字節(jié),位置指針自動加1,所以每條指令都有確定的偏移地址。只有程序要求改變這個位置指針時,才需要安排org語句。通常org語句可以出現(xiàn)在程序中任何位置上。 ??
org示例:
在數(shù)據(jù)段中依次定義以下變量,由于此時沒有使用org語句,則變量word1的偏移地址為0。
word1 DW ?1234h
byte1 ?DB ? 56h
word2 DW ?abcdh
其在數(shù)據(jù)段中word1,byte1,word2的存儲位置如下圖所示(采用小端存儲,按單字節(jié)對齊)。
在數(shù)據(jù)段中依次定義以下變量,由于此時使用org語句,則變量word1的偏移地址為1。
org 0001h
word1 DW ?1234h
byte1 ?DB ? 56h
word2 DW ?abcdh
其在數(shù)據(jù)段中word1,byte1,word2的存儲位置如下圖所示(采用小端存儲,按單字節(jié)對齊)。
我們知道編譯器本身在匯編時對指令的地址計算是相對地址,而對于引導(dǎo)扇區(qū),是按絕對地址執(zhí)行,那么對于用相對地址編譯的執(zhí)行碼就要換算成絕對地址。一般而言,“真實開始執(zhí)行的引導(dǎo)扇區(qū)”都會固定裝載到07C00h處。
由于編譯器在編譯時的地址是從第一行開始用0000h開始相對計算的,而且我們要寫的是“引導(dǎo)扇區(qū)”程序,所以我們要將下面的代碼加載到地址07C00h處,所以我們需要org 07C00h,通過該偽指令,將代碼和數(shù)據(jù)加載到07C00h地址。
2、jmp $
$被稱為當(dāng)前位置計數(shù)器
在匯編程序?qū)υ闯绦蜻M行匯編的過程中,使用地址計數(shù)器來保證當(dāng)前正在匯編的指令地址。地址計數(shù)器值可用“$”來表示,匯編語言也允許用戶直接用“$”來引用地址計數(shù)器的當(dāng)前值,因此,org $+5可表示從當(dāng)前地址開始跳過5個字節(jié)存儲單元,在指令和偽指令中,也可直接用“$”表示地址計數(shù)器的當(dāng)前值。故jmp $進入了一個無限循環(huán)。
3、int ?10h
int ?10H號中斷
int 10H 是由BIOS 對屏幕及顯示器所提供的服務(wù)程序。使用int 10H 中斷服務(wù)程序時,先指定 AH 寄存器為下表編號其中之一,該編號表示欲調(diào)用的功用,而其他寄存器的詳細說明,參考表后文字,當(dāng)一切設(shè)定好之后再調(diào)用 int 10H。
在這里我們只詳細講解本程序中的10號中斷。由于ah=13,故調(diào)用編號為13的功能:即顯示字符串。其中ES:BP=串地址,CX=串長度 ,AH=13,當(dāng)AL=01h時,光標(biāo)會跟隨顯示移動。BH為頁號,BH=0表示頁號為0,BL=0CH,表示屬性,即黑底紅字高亮。因此在調(diào)用10號中斷之前,無非就是對各個寄存器進行初始化。
關(guān)于10號中斷的其他信息,請參考 http://blog.csdn.net/yes_life/article/details/6778834
4、times 510-($-$$) ?db ?0
times:重復(fù)指令或數(shù)據(jù)
times前綴引起指令被匯編多次。其中
表示是該程序的初始代碼段的地址,故該指令將會被執(zhí)行510?($? )次。也就是用0來填充剩下的空間,達到510字節(jié)。二、如何運行該“操作系統(tǒng)”
1、環(huán)境準備
(1)計算機操作系統(tǒng)(Windows)
(2)虛擬機(VMware)
(3)匯編編譯器(NASM)
(3)軟盤(虛擬軟盤RamDiskNT)
(4)rawrite.exe/本書光盤自帶OS/Tools/FloppyWriter,負責(zé)將程序?qū)懭氲杰洷P。
2、編譯boot.asm
將上述代碼文件命名為boot.asm,然后使用nasm命令編譯該文件。
nasm boot.asm –o boot.bin
3、虛擬軟盤A
點擊Start之后,查看“我的電腦”里是否有虛擬軟盤A,如果沒有,重啟。
4、將boot.bin寫入到軟盤A
點擊Enter。(注意boot.bin與Rawrite.ext在同一文件目錄下)。
5、創(chuàng)建虛擬機
安裝VMware,在VMware創(chuàng)建一個虛擬機,命名為Tinix,并設(shè)置系統(tǒng)引導(dǎo)盤為軟盤A。
啟動該系統(tǒng),得出結(jié)果圖為:
三、本操作系統(tǒng)啟動流程
打開計算機電源;加電自檢(POST);尋找啟動盤,該系統(tǒng)設(shè)置從軟盤啟動,計算機檢查軟盤的0面0磁道1扇區(qū),如果發(fā)現(xiàn)它以0xAA55結(jié)束,則BIOS會認為它是一個引導(dǎo)扇區(qū);BIOS將該512字節(jié)扇區(qū)內(nèi)容加載到內(nèi)存地址0000:7c00;跳轉(zhuǎn)到0000:7C00出將控制權(quán)交給這段引導(dǎo)代碼。到此為止,計算機不再由BIOS中固有的程序來控制,而變成由操作系統(tǒng)的一部分來控制。
總結(jié)
以上是生活随笔為你收集整理的第一章--最小的“操作系统”的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过调用门进行有特权级变换的转移,详细注
- 下一篇: “实模式--保护模式--实模式”转换过程