參考書籍:
《一個操作系統的實現》
《x86彙編語言 從實模式到保護模式》
隨便說說:在一開始粗略瀏覽了《一個操作系統的實現》前2章之後,發現怎麼無論在哪個環境下(windows和linux)都需要用到linux,而我現在基本都是用windows,無論裝雙系統還是虛擬機來運行linux都有點麻煩(不太熟悉linux)。。。後面在看完《x86彙編語言~》之後,發現在windows下即可完成所有工作。
環境:
操作系統:windows7
彙編編譯器:nasm
虛擬硬盤或虛擬軟盤製造工具:bochs/virtual box/win7(win7自身可以製造虛擬硬盤)
P.S.《一個操作系統的實現》書中用的是(虛擬)軟盤啓動,實則用虛擬硬盤也可以,個人感覺更方便。。。
硬盤(軟盤)讀寫工具:winhex
P.S.虛擬/物理的均可讀寫。。。
查看二進制的工具:binary viewer
P.S.也可以用winhex查看
系統運行工具:virtual box
系統調試工具:bochs
最小”操作系統“
其實說與其這個是最小“操作系統”,還不如說它就是個類似hello world的小程序,只不過這個小程序使用匯編小的,並且不是通過操作系統打開的。。。
代碼:
mov ax,0xb872 ;顯示緩衝區
mov es,ax
mov di,0
mov ax,0 ;字符串
mov ds,ax
mov si,str + 0x7c00 ;偏移地址
mov bh,7
@l1:
mov ah,[ds:si]
cmp ah,'#'
je @end
mov [es:di],ah
inc si
inc di
mov [es:di],bh
inc di
jmp @l1
@end: jmp $ ;無限循環
str: db 'hello,welcome to the OS-World!!#'
times 510 - ($ - $$) db 0
dw 0xaa55
操作系統的啓動
計算機啓動後,執行BIOS系統,BIOS系統執行完後會把引導扇區加載到內存地址0000:7c00處,並跳轉到該地址執行。
引導扇區:
引導扇區是啓動介質的第一個扇區(0面0磁道1扇區),軟盤、硬盤都是如此。(每個扇區大小爲512字節)
而一個有效的引導扇區唯一的證明就是最後兩個字節必須爲0x55,0xaa(第511個字節:0x55,第512個字節:0xaa)
有了上面的信息,我們就知道只要把我們的“操作系統”放在引導扇區,便可以執行。
P.S.但其中要注意的是由於不是通過操作系統打開,因此沒有地址重定位,調用代碼中的地址/標誌(偏移地址)時,必須加上該代碼在內存中的加載地址,才的到實際地址,例如上面代碼中str:
mov si,str + 0x7c00 ;偏移地址
str內存中實際地址 = str相對改代碼開頭的地址 + 該代碼在內存中實際地址(0x7c00)
最後在virtual box下運行結果爲: