[Make MyOS] Hello MyOS!
这是30天的第一天内容,也不知道自己能坚持到几天,有几天就几天了,活这么久了,半途而废的事情还少吗?
首先需要准备几个工具
1 qemu
不可能真去买个软盘什么的,所以我们需要一个虚拟计算机的东西——QEMU
1 | # qemu编译可能要用到的东西 |
遇到的问题,当安装apt遇到下列错误时
1 | E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable) |
建议直接
1 | sudo rm /var/lib/apt/lists/lock |
2 nasm
写操作系统嘛,总不可能真的就用01来干,那得累死,所以需要用汇编,书中用的是nask,nask和nasm同为汇编编译器。nasm支持win、linux和MacOS,mask仅支持win。这两个差别不大,由于我们是在Ubuntu18下进行试验,所以必然选择nasm了,差距就是
nask代码 | nasm代码 |
---|---|
JMP entry | JMP SHORT entry |
RESB <填充字节数> | TIMES <填充字节数> DB <填充数据> |
RESB 0x7dfe-$ | TIMES 0x1fe-($-$) DB 0 |
ALIGNB 16 | ALIGN 16, DB 0 |
我觉得这个就没必要再通过二进制包安装了,直接sudo apt install nasm
就好了,然后用nasm --version
检测一下是否安装好就ok了
3 hex editor
不说用01去写代码吧,看看01代码还是有必要的,所以还是需要一个趁手的十六进制编辑器的,这玩意我就随意百度了俩
1 | sudo apt-get install wxhexeditor # 这玩意好久没更新了 官网都没了 但是挺好用的 |
我觉得还是wxHexEditor比较强大,因为16进制能转成汇编..
4 helloos0
这个时候可以尝试实验了,直接把光盘中的projects/01_day/helloos0/helloos.img
拷到我们自己的目录下,然后执行
1 | sidney@ubuntu:~/Work/MyOS/day01$ qemu-system-i386 helloos.img |
虽然有warning,但是至少系统跑起来了,而想让这段警告消失,也很简单,将命令改为qemu-system-i386 -drive file=helloos.img,format=raw,if=floppy
就ok了
按照书上说的,使用十六进制编写OS,神经病..我才不抄,浪费时间
1 | 0000000: EB4E 9048 454C 4C4F 4950 4C00 0201 0100 |
剩下的内容全为0,文件大小为
5 helloos1
按照书上第二步,稍微高级一点的东西,涉及到汇编,直接vim myos.asm
1 | DB 0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f |
通过命令nasm myos.asm -o myos.img
得到我们编译出的操作系统,依旧是执行qemu-system-i386 -drive file=myos.img,format=raw,if=floppy
,运行我们的操作系统,出现个hello world。不过这玩意还是不大能看懂什么意思
6 helloos2
再按书中的汇编,写个能看懂的操作系统
1 | ; hello-os |
DB: define byte,往文件里直接写入1字节的指令
DW: define word,16位
DD: define double-word,32位
$ : 代表一个变量,表示当前行的偏移地址
$$: 代表一个变量,表示当前段(汇编的section,数据段,代码段..)的起始偏移地址
TIMES: 重复定义数据或指令
RESB:reserve byte的缩写,RESB 10这一指令的含义是:从现在的地址开始空出10个字节,且nask(编译器)会自动在空出的部分填充上0x00,这就极大的节省了输入大量0x00的时间。
启动区(boot sector): 软盘第一个扇区称为启动区。计算机读写软盘时,是以512字节为一个单位进行读写的,因此软盘的512字节就称为一个扇区。一张软盘共有1440KB,也就是1474560字节,除以512得2880,也就是一张软盘有2880个扇区。计算机从最初一个扇区开始读软盘,然后去检查这个扇区最后2个字节的内容。如果最后2个字节不是55AA,计算机就认为这张盘上没有所需要启动的程序,就会报一个不能启动的错误。如果是55AA,那它就认为这个扇区的开头是启动程序,并开始执行这个程序。55AA没啥特殊含义..人家发明的时候定的
IPL(initial program loader): 启动程序加载器。启动区只有512字节,正常的操作系统不可能这么小,所以几乎所有的操作系统都是把加载操作系统本身的程序放在启动区里的。启动区的名字必须是8字节,不够得用空格补
感觉有上一篇的操作系统启动流程扫盲,有很多知识点还是比较清晰的..但是还是有几个疑惑点没去尝试,软盘能改成hdd?FAT12给整成FAT32?