三十天自制操作系统(1)

第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。

从这里已经用到了很多汇编的跳转指令了,这里总结一下

  1. je, jump if equal, 如果相等就跳转
  2. jnc, jump if not carry, 进位标志是0就跳转
  3. jae, jump if above or equal, 大于等于时跳转
  4. 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语言编写画面显示程序喽。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272

推荐阅读更多精彩内容