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