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