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

第0天

在银行干了这么多年本身到底决定要辞职了。为了辞职那个事情更加学习了银行的客户老董离职管理方法。

那么些管理情势确定:辞职要起码提前一个月交给辞职报告,然后再走一定的辞职流程。我觉着这么些月应该会很轻松,我会做好自己的联网工作之余是或不是相应再找点其他业务呢?

正在为进步工作生活品质烦恼的时候猛然意识书架上一本30天自制操作系统。那本书是在二零一三年买的,竟然平素不曾迈出。那都是上天注定的哟,三年前买了那本书就是为着这几个月。

那么自己那三十天写操作系统的生活起来了。

第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语言编写画面显示程序喽。