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