30天自制作業系統:第二天

30天自制作業系統:第二天

慢慢更新不著急哦,會越來越難,更新也會越來越慢滴。

30天自制作業系統:第二天

1。將扇區載入到指定記憶體中。

在第一天的基礎上進行程式碼的加工,第二天給程式中加入將引導扇區讀入指定記憶體地址:0x7c00處,並使用軟中斷顯示字元。

出現了一個問題,發現0扇區內出現莫名其妙的資料,經過分析,是編譯器自己寫入的啟動資料。

最佳化後的程式碼為:

; hello-os; TAB=4 ORG 0x7c00 ; このプログラムがどこに読み込まれるのか JMP entryentry: MOV AX,0 ; 初始化暫存器 MOV SS,AX MOV SP,0x7c00 MOV DS,AX MOV ES,AX MOV SI,msgputloop: MOV AL,[SI] ADD SI,1 CMP AL,0 JE fin MOV AH,0x0e ; ?示一個文字 MOV BX,15 ; 指定字元?色,不知道???色沒?, 有知道的大?告?我下。 INT 0x10 ; ?用??bios,可以理解??用了一個介面。 JMP putloopfin: HLT ; ?cpu停止防止cpu空?,等待指令,只要外部?生?化,比如按下??,移?鼠?,cpu就會醒?來???行。 JMP fin ; 死循?。msg: DB 0x0a, 0x0a ; 改行を2つ DB “hello, uos1” DB 0x0a ; 改行 DB 0 RESB 0x7dfe-$ DB 0x55, 0xaa; 以下はブートセクタ以外の部分の記述 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 4600 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 1469432

經過下面命令編譯後,生成helloos。img開啟後如圖所示,出現了一些程式碼中未實現的資料。

。。\z_tools\nask。exe helloos。nas helloos。img

30天自制作業系統:第二天

後來經過遮蔽程式碼,顯示如圖。

去掉jmp後面的程式碼也是可以啟動起來的,證明是編譯器寫入的初始資料。

30天自制作業系統:第二天

30天自制作業系統:第二天

費了好長時間再調這個問題,請大佬們不要鄙視。

為什麼是0x7c00處呢,這是bios規定的。0x00007c00-0x00007dff為啟動區內容的裝載地址

執行結果如圖:

30天自制作業系統:第二天

2。完善工程架構

去掉helloos。nas中55aa後邊佔字元的所有程式碼,只留下引導扇區內容。

; hello-os; TAB=4 ORG 0x7c00 ; このプログラムがどこに読み込まれるのか; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述 JMP entry DB 0x90 DB “HELLOIPL” ; ブートセクタの名前を自由に書いてよい(8バイト) DW 512 ; 1セクタの大きさ(512にしなければいけない) DB 1 ; クラスタの大きさ(1セクタにしなければいけない) DW 1 ; FATがどこから始まるか(普通は1セクタ目からにする) DB 2 ; FATの個數(2にしなければいけない) DW 224 ; ルートディレクトリ領域の大きさ(普通は224エントリにする) DW 2880 ; このドライブの大きさ(2880セクタにしなければいけない) DB 0xf0 ; メディアのタイプ(0xf0にしなければいけない) DW 9 ; FAT領域の長さ(9セクタにしなければいけない) DW 18 ; 1トラックにいくつのセクタがあるか(18にしなければいけない) DW 2 ; ヘッドの數(2にしなければいけない) DD 0 ; パーティションを使ってないのでここは必ず0 DD 2880 ; このドライブ大きさをもう一度書く DB 0,0,0x29 ; よくわからないけどこの値にしておくといいらしい DD 0xffffffff ; たぶんボリュームシリアル番號 DB “HELLO-OS ” ; ディスクの名前(11バイト) DB “FAT12 ” ; フォーマットの名前(8バイト) RESB 18 entry: MOV AX,0 MOV SS,AX MOV SP,0x7c00 MOV DS,AX MOV ES,AX MOV SI,msgputloop: MOV AL,[SI] ADD SI,1 ; SIに1を足す CMP AL,0 JE fin MOV AH,0x0e ; 一文字表示ファンクション MOV BX,15 ; カラーコード INT 0x10 ; ビデオBIOS呼び出し JMP putloopfin: HLT ; 何かあるまでCPUを停止させる JMP fin ; 無限ループmsg: DB 0x0a, 0x0a ; 改行を2つ DB “hello, uos ” DB 0x0a ; 改行 DB 0 RESB 0x7dfe-$ ; 0x7dfeまでを0x00で埋める命令 DB 0x55, 0xaa

將檔名改為ipl。nas,因為要將程式逐漸修改成一個ipl(Initial program loader)

加入makefile檔案,和makefile的執行批處理檔案。

Makefile: makefile的編寫規則,自己學習,這是基礎就不講了。

# 預設行為default : 。。/z_tools/make。exe img# 檔案生成規則ipl。bin : ipl。nas Makefile 。。/z_tools/nask。exe ipl。nas ipl。bin ipl。lsthelloos。img : ipl。bin Makefile 。。/z_tools/edimg。exe imgin:。。/z_tools/fdimg0at。tek \ wbinimg src:ipl。bin len:512 from:0 to:0 imgout:helloos。img# 命令asm : 。。/z_tools/make。exe -r ipl。binimg : 。。/z_tools/make。exe -r helloos。imgrun : 。。/z_tools/make。exe img copy helloos。img 。。\z_tools\qemu\fdimage0。bin 。。/z_tools/make。exe -C 。。/z_tools/qemuinstall : 。。/z_tools/make。exe img 。。/z_tools/imgtol。com w a: helloos。imgclean : -del ipl。bin -del ipl。lstsrc_only : 。。/z_tools/make。exe clean -del helloos。img

make。bat: 這是批處理檔案的編寫規則,和linux下的shell類似,不講了,自己學習。

。。\z_tools\make。exe %1 %2 %3 %4 %5 %6 %7 %8 %9

使用make run編譯程式碼,生成ipl。bin二進位制檔案,並生成空img,然後將ipl。bin寫入空img中,最後執行。

其實只用ipl。bin放入qemu中啟動也是可以的。ipl。bin只是一個啟動扇區。

結果如下圖所示:

30天自制作業系統:第二天

遺留問題:jmp開始直接跳過那段程式碼,為啥還不能刪除?

實驗證明可以刪除,只是會影響他自己寫的這個程式生成img檔案而已。不影響。

30天自制作業系統:第二天