30天自制作業系統-merk11的第一天
自制作業系統是因為學校老師留的實驗作業,也是為了加深自己對作業系統的細節理解。
在google上千辛萬苦找到了一些適合於新手開發簡單作業系統的教程
用的環境是windows,虛擬環境是QEMU
書籍:
《30天自制作業系統》出版社:人民郵電出版社
github中文磁碟原始碼對照:
https://github.com/yourtion/30dayMakeOS
https://github.com/chenganglist/30dayMakeOS
書籍pdf線上:
http://file.qijin.tech/ebooks/30天自制作業系統_compressed.pdf
衷心感謝以上資源的提供者,為初出茅廬的大學牲提供了幫助???
筆記:
環境配置: 二進位制編輯器(十六進位制編輯器)
VScode,Winhex ,NotePad++ 或者其他自己用得熟的編輯器都可以
彙編指令學習:
DB: 是“define byte”的縮寫,也就是往檔案裡直接寫入1個位元組的指令。可以直接用它寫字串
DB "hello,world"
RESB:是“reserve byte”的略寫,如果想要從現在的地址開始空出10個位元組來,就可以 寫成RESB 10,意思是我們預約了這10個位元組(大家可以想象成在對號入座的火車裡,預訂了10 個連號座位的情形)。
DW:和DB類似,一次讀取2個位元組
DD:和DB類似,一次讀取4個位元組
美元符號:這裡是個變數,可以告訴我們這一行現在的位元組數
RESB 0x1fe-$
主要原始碼(可以自己嘗試寫的部分):
; hello-os
; TAB=4
; 標準FAT12格式軟盤專用的程式碼 Stand FAT12 format floppy code
DB 0xeb, 0x4e, 0x90
DB "MERK11" ; 啟動扇區名稱(8位元組)
DW 512 ; 每個扇區(sector)大小(必須512位元組)
DB 1 ; 簇(cluster)大小(必須為1個扇區)
DW 1 ; FAT起始位置(一般為第一個扇區)
DB 2 ; FAT個數(必須為2)
DW 224 ; 根目錄大小(一般為224項)
DW 2880 ; 該磁碟大小(必須為2880扇區1440*1024/512)
DB 0xf0 ; 磁碟型別(必須為0xf0)
DW 9 ; FAT的長度(必須是9扇區)
DW 18 ; 一個磁軌(track)有幾個扇區(必須為18)
DW 2 ; 磁頭數(必須是2)
DD 0 ; 不使用分割槽,必須是0
DD 2880 ; 重寫一次磁碟大小
DB 0,0,0x29 ; 意義不明(固定)
DD 0xffffffff ; (可能是)卷標號碼
DB "MERK-OS " ; 磁碟的名稱(必須為11位元組,不足填空格)
DB "FAT12 " ; 磁碟格式名稱(必須是8位元組,不足填空格)
RESB 18 ; 先空出18位元組
; 程式主體
DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
DB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
DB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
DB 0xee, 0xf4, 0xeb, 0xfd
; 資訊顯示部分
DB 0x0a, 0x0a ; 換行兩次
DB "It is impossible to manufacture or imitate love."
DB 0x0a ; 換行
DB 0
RESB 0x1fe-$ ; 填寫0x00直到0x001fe
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