想做乙個作業系統首先要了解電腦內部工作機制。
當按下主機上面的電源開關後,cpu
會首先執行主機板上
bios
晶元內的程式,之後是呼叫
bios 19h
號中斷,將設定的某個磁碟裝置的第乙個扇區內容複製到記憶體中0:
0x7c00h
開始的記憶體單元,然後檢查這個扇區最後的兩個位元組內容。如果是
0x55aa
就表示確實是可以引導的。然後跳轉到0:
0x7c00h
處開始執行引導程式。
因為現在記憶體中就乙個扇區的程式,cpu
執行到末尾時就會因沒有繼續執行的程式而出錯。所以在引導程式中要加入一段將整個作業系統所在扇區複製到記憶體的**。這樣要在第乙個扇區的程式末尾加入一句跳轉指令跳轉到作業系統所在的記憶體位址然後執行。
接下來開始編碼實踐:
引導程式**:ipl.nas
功能:將第第二個扇區的內容複製到0:0x7e00h
開始的地方。
org 0x7c00
jmp entry ;跳轉
db 0x90 ;佔位乙個位元組
db "helloipl" ;廠商名(格式化此磁碟的作業系統名)
dw 512 ;每扇區位元組數
db 1 ;每簇扇區數
dw 1 ;引導扇區占用扇區數
db 2 ;共有幾個fat表
dw 224 ;根目錄記錄數最大值
dw 2880 ;扇區總數
db 0xf0 ;介質描述,3.5寸高密碼軟盤
dw 9 ;每個fat表占用扇區數
dw 18 ;每個磁軌扇區數
dw 2 ;磁頭數
dd 0 ;隱藏扇區數
dd 2880 ;扇區總數
db 0 ;中斷0x13的驅動器號,第乙個軟盤驅動器設定為0
db 0
db 0x29 ;作業系統用它來識別引導資訊,值可以是28h或29h
dd 0xffffffff ;卷序列號,在格式化磁碟時所產生的乙個隨機序號,有助於區分磁碟,可以為0
db "hello-os ";磁碟卷的識別符號,再次設定的時候被儲存到根目錄中作為乙個特殊的檔案來儲存
db "fat12 " ;檔案系統型別
resb 18
entry:
mov ax,0 ;0x7c00h+512=0x7e00h
mov es,ax
mov ch,0 ;柱面
mov dh,0 ;磁頭
mov cl,2 ;扇區
mov ah,0x02;讀磁碟
mov al,1 ;讀乙個扇區
mov bx,0x7e00;es:bx 表示目標存放位址
mov dl,0x00;驅動器名a
int 13h;呼叫磁碟bios中斷
jmp 0x7e00
resb 0x7dfe-$;表示從0x1fe到上一行要寫多少個0x00
db 0x55,0xaa
作業系統**:os.nas
功能:在螢幕上顯示英文hello operation system
。然後執行
hlt。
org 0x7e00 ;因為下面有標號
mov ax,0 ;這裡很關鍵
mov ds,ax ;
mov si,msg
show:
mov al,[si] ;讀入字串
add si,1
cmp al,0 ;判斷是否字串結束
je fin
mov ah,0x0e ;顯示字元模式
mov bx,15 ;字元顏色
int 0x10 ;呼叫顯示卡bios
jmp show
fin:
hltjmp fin
msg:
db 0x0a ;換行
db "hello operation system!"
db 0x0a
db 0 ;結束標誌
**敲完後,用
nasm.exe
編譯成
bin檔案。
nasm ipl.nas ipl.bin
nasm os.nas os.bin
執行這兩條指令編譯,編譯成功後生成ipl.bin os.bin
這兩個檔案。
接著製作乙個軟盤映象檔案。這次用的是 edimg.exe
edimg imgin:fdimg0at.tek wbinimg src:ipl.bin len:512 from:0 to:0 imgout:ipl.img
執行這一條指令,把ipl.bin
放到映象檔案的第乙個扇區中。(當然也可以是用
u盤在做,具體方法也不難)。
from: 0 to: 0
表示ipl.bin
的前幾個位元組不寫入。例如
from: 1 to:1
表示ipl.bin
的第乙個位元組空著 剩下的照常寫入。
fdimg0at.tek
表示乙個空的軟盤檔案。
上面操作完成後,會產生乙個ipl.img
的映像檔案。
接下來把os.bin
的內容寫到映像檔案的第二個扇區中。
我用的bz
二進位制編輯軟體。開啟
ipl.img
然後開啟
os.bin
把os.bin
內容複製到
ipl.img
的第二個扇區中(也就是
0x55aa
後面)。
接下來設定qemu
虛擬機器從軟盤啟動。
做乙個批處理檔案名字是qemu.bat
,內容是:
@set sdl_videodriver=windib
@set qemu_audio_drv=none
@set qemu_audio_log_to_monitor=0
qemu.exe -l . -m 32 -localtime -std-vga -fda ipl.img
這樣,雙擊qemu.bat
就會顯示執行結果了。
執行結果:
除錯過程中遇到的問題:
1.開始在用edimg.exe 把ipl.bin 做成img 檔案時總是提示 bpb error!,直到後來在ipl.nas jmp entry 這一行**下面新增fat12檔案格式後才不提示錯誤。具體原因現在還不理解。
2.起初做成的ipl.img 在虛擬機器中執行不顯示 hello operation system!,最後發現是位址寫錯了。第一扇區複製到0x7c00 段位址是0,以前一直是想反了。
3.要顯示的內容最初是放到了可執行**的前面了,因為不是可以執行的**所以起初總出錯。應該放到最後面。
總結的經驗:
這部分的內容之前看過好多遍書,以為已經完全掌握和理解了,結果還是花了一整個寶貴的週末的下午,才算除錯成功。所以說:光看還不行,在實踐中才能真正的檢驗乙個只是是否掌握。
乙個小作業系統
1 1 chapter1 a boot.asm 乙個 作業系統 可以只有20行 把下面這段 用nasm編譯一下 nasm boot.asm o boot.bin org 07c00h 告訴編譯器程式載入到7c00處 mov ax,cs mov ds,ax mov es,ax call dispstr...
一 ,作業系統啟動引導
當pc的電源開啟後,cpu將自動進入實模式,並從位址0xffff0開始自動執行程式 這個位址通常是rom bios的位址,bios將執行某些系統檢測,並從實體地址0x00000載入中斷向量,此後啟動第乙個扇區 磁碟引導扇區,512位元組 讀入記憶體的絕對位址0x7c00 31kb 處,並跳轉到這裡b...
哈工大作業系統實驗一 作業系統的引導
哈工大作業系統實驗手冊 實驗資源與參考 不配環境懶人福利 實驗樓 參考閱讀 linux核心完全注釋 趙炯,作業系統原理 實現與實踐 李治軍,劉巨集偉 bootsect.s能完成setup.s的載入,並跳轉到setup.s開始位址執行。而setup.s向螢幕輸出一行 now we are in set...