第0天
在银行干了这么多年我终于决定要辞职了。为了辞职这个事情特地学习了银行的客户经理离职管理办法。
这个管理办法规定:辞职要至少提前一个月提交辞职报告,然后再走固定的辞职流程。我觉得这一个月应该会很轻松,我会做好自己的交接工作之余是不是应该再找点其他事情呢?
正在为提高业务生活质量烦恼的时候突然发现书架上一本30天自制操作系统。这本书是在2013年买的,竟然从来没有翻过。这都是上天注定的啊,三年前买了这本书就是为了这一个月。
那么我这三十天写操作系统的生活开始了。
第1天
计算机开机的时候如果从软盘启动是如何识别这是不是一个启动盘呢?这是学习计算机的第一个问题。从看过两本学习操作系统的书都是从软盘讲起的,其实现在的主流是从U盘启动,不过原理肯定都差不多。
如果软盘的第一个柱面,第一个盘头,第一个扇区的最后两个字节是0x55AA,那个BIOS的启动程序会自动打这个扇区的512个字节写入内存中的0x7c00-0x7dff这512个字节的内存中。
第2天
一个软盘一共有80个柱面,编号分别从0-79;每个柱面有18个扇区,编号从1-18,软盘还有2个面,每次计算机从软盘读的最小单位不是字节,而是扇区,所以每次都会一次性读512个字节。软盘的大小也可以计算出来,80*2*18*512 = 1440KB。
调用BIOS显示一个字符,这里使用第16号中BIOS中断,也就是 int 0x10
:
ah = 0x0e;
al = 要显示字符ASCII;
bh = 0;
bl = color code;基本设置为0x0f
第3天
计算机自动读入0x7c00的512个字节对于操作系统来说是远远不够的,我们还要在这512个字节中加入读取软盘的指令。
调用BIOS读取软盘的指令,这里使用的是第19号中断,也就是int 0x13
:
ah = 0x02(读盘) | 0x03(写盘)| 0x04(校验) | 0x0c(寻道)
al = 处理对象的扇区数 为了兼容基本为 1
ch = 柱面号(0-79)
cl = 扇区号(1-18)
dh = 磁头号(0-1)
dl = 驱动器号,基本为0
es : bx = 缓冲区地址
flags.cf == 0 : 没有错误
flags.cf == 1 : 有错误,错误码放在ah中
通过循环把10个软盘中10个柱面的数据读入内存中。
10个柱面的数据大小(正反两面):10 * 2 * 18 * 512 = 184320个字节,也就是180KB。启动区的程序是从0x8200开始装载的,装载了360个扇区,其中第1个扇区是BIOS自动装载到0x7c00中。因此写的启动区程序运行完毕之后占满的内存空间实际上是从0x8200~0x34fff。
从这里已经用到了很多汇编的跳转指令了,这里总结一下
- je, jump if equal, 如果相等就跳转
- jnc, jump if not carry, 进位标志是0就跳转
- jae, jump if above or equal, 大于等于时跳转
- jb, jump if below, 如果小于的话,就跳转
试验:往空软盘里存入一个文件,发现文件内容总是保存到0x4200这个位置。
结论:接下来可以写两个汇编文件,第一个就是之前一直写的启动区程序(ipl),第二个才是操作系统直正的功能程序(haribote)。启动区程序的功能就是把软盘里的10个柱面读入内存,然后跳到磁盘0x4200位置所在的内存。接下来就是计算磁盘0x4200的数据被读入到哪个内存地址中。
计算过程:磁盘中的第二个扇区复制到0x8200中,为了计算方便假设第一扇区存入到0x8000中(实际上被BIOS复制到0x7c00中)。那么0x8000 + 0x4200 = 0xc200。只要在启动区程序复制完10个扇区之后,执行jmp 0xc200
指令,就可以开始执行操作系统的功能。
调用BIOS中切换显示模式的中断程序,设置显卡模式int 0x10
:
ah = 0x00;
al = 模式:
0x03:16色字符模式,80*25
0x12:VGA图形模式,640*480*4位彩色模式,独特的4面存储模式
0x13:VGA图形模式,320*200*8位彩色模式,调色板模式
0x6a:扩展VGA模式,800*600*4位彩色模式,独特的4面存诸模式
启动区程序已经完成,接下来开始写操作系统程序,操作系统程序要CPU进入32位模式,那么BIOS中断就不能用了,所在要在进入32位模式之前,把想要用BIOS程序做的事情要先给做完。
调用BIOS中断程序,取得键盘各种LED指示灯的状态,int 16
:
ah = 0x02
在进入32位之前,haribote汇编程序中把读取的柱面数(10),横向分辨率(320),纵向分辨率(200),还有图像缓冲区起始地址(0xa0000)写到内存的0xff0~0xffc中。
这本书的作都在haribote汇编程序文件中加入了100多行汇编程序,直接从CPU16位模式跳入到32位模式,而且增加了使用C语言的部份,接下来就可以使用C语言编写程序了。
C语言源文件经过C语言编译器,翻译成汇编语言,然后从汇编语言经过汇编号翻译成机器语言,这个机器语言文件就是目标文件,基本上用.obj作为后缀。但是这个机器语言还不能直接执行,在各个操作系统中还是链接成各个操作系统认可的可执行文件。目前为止这里的链接,只是把目标文件和haribote文件复制在一起,作成一个完整的机器语言文件。但是具体作了什么操作,这本书的作者应该会下接下来的学习中讲。
用汇编语言编写函数供C语言调用:用汇编写了函数之后,还要与主函数链接,输出的目标文件设置成WCOFF格式,设置成32位。函数名加下划线。
第4天将使用C语言编写画面显示程序喽。