30天自制作業系統-merk11的第一天

merk11發表於2021-11-05

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

相關文章