30天自制操作系统日志第3天
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验主要内容
1、制作真正的IPL,即启动程序加载器,用来加载程序。
添加的代码关键部分如下:
MOV AX,0x0820
MOV ES,AX
MOV CH,0 ;柱面0
MOV DH,0 ;磁头0
MOV CL,2
MOV AH,0x02 ;AH=0x02:读盘
MOV AL,1 ;执行1个扇区
MOV BX,0
MOV DL,0x00 ; A驱动器(现在都只有一个驱动器了)
INT 0x13 ;调用磁盘BIOS
JC error
这里有JC指令,是一些特定指令中的一种,后面知识点收录有。JC就是jump if carry,如果进位标志位1的话,就跳转。就是成功调用0x13就会跳转到error处。
INT 0x13又是一个中断,这里AH是0x02的时候是读盘的意思,就是要把磁盘的内容写入到内存中。今天实验用到了4个软中断,都记在知识点里了。
至于CH\DH\CL\AL三个寄存器呢,就分别是柱面号、磁头号、扇区号、执行的扇区数。那么含有IPL的启动区位于:C0-H0-S1 (Cylinder, magnetic Head, Sector)
然后ES\BX和缓冲地址有关。
2、缓冲区地址0x0820
MOV AL,[ES:BX] ; ES*16+BX -> AL
说是原来16位的BX只能表示0~65535,后来就引入了一个段寄存器,用MOV AL,[ES:BX] ;
ES*16+BX -> AL这样的方法就可以表示更大的地址,就够当时用了,可以指定1M内存地址了。那么这里我们就是将0X0820赋值给ES,BX为0,这样ES*16后就访问0X8200的地址,那么就是讲软盘数据转载到0X8200到0X83ff的地方。
3、试错以及读满10个柱面
MOV AX,0x0820
MOV ES,AX
MOV CH,0
MOV DH,0
MOV CL,2
readloop:
MOV SI,0 ; 记录失败的次数,SI达到5就停止
retry:
MOV AH,0x02
MOV AL,1
MOV BX,0
MOV DL,0x00
INT 0x13
JNC next ; 没出错就跳到next
ADD SI,1 ; SI加一
CMP SI,5 ; SI和5比较
JAE error ; SI >= 5 时跳转到error
MOV AH,0x00
MOV DL,0x00
INT 0x13 ; 重置驱动器,看上面AH变为0X00和0X02功能不同
JMP retry
next:
MOV AX,ES
ADD AX,0x0020
MOV ES,AX
ADD CL,1
CMP CL,18
JBE readloop
MOV CL,1
ADD DH,1
CMP DH,2
JB readloop
MOV DH,0
ADD CH,1
CMP CH,CYLS
JB readloop
这里很明显,从CL\DH\CH依次循环计数,就是读取完一个磁头的扇区后换一个磁头,到这个柱面都结束了就换一个柱面,一直读完10个柱面。
4、到正菜了,主程序操作系统
完成了启动区的制作,下一步开始编写操作系统代码。
最简单的操作系统:
Fin:
HLT
Jmp fin
我们需要将操作系统本身的内容写到名为文件中,再把他保存到磁盘映像里,然后我们从启动区执行这个就行了。老作者用一个简单的例子告诉我们当我们向一张空软盘保存文件时,1)文件名会写在0x002600以后的地方;2)文件的内容会写在0x004200以后的地方。由于目前的启动区程序是从启动区后面开始(不包括启动区)加载到内存地址0x8200处的,所以磁盘0x4200的内容就会被加载到内存地址0xc200处,其中0xc200 = 0x8200 + 0x4200 - 512(启动区大小),现在我们就可从0xc200处加载我们自己写的程序用于执行了。需要在头加入org 0xc200,在启动区最后添加代码jmp 0xc200。如此在装载完os后,即会跳到地址0xc200执行操作系统程序。
5、让他显示图形模式
这里是中断调用显卡函数,设置显示模式,320*200*8位彩色模式,有256种颜色可以使用。
画面一片漆黑,大概是因为显存没有设置吧,下面的预存地址VRAM就是为显存留的,Video RAM,显卡内存,他的地址对应着屏幕上的像素。修改这个应该可以改颜色,黑色大概是默认老贼(把坑的作者叫老贼)也不说,唉,还要查。
6、进入32位模式及保存画面模式
32位固然好,但是CPU32位模式不能调用BIOS功能。设定完画面模式后就要得到键盘状态。这里就是把画面的像素数、颜色数、键盘信息都保存了起来。和CYLS一样,都保存在了0X0FF0附近。
7、C语言正式出场!小场面,戏份不足
这C关键部分真的是没讲嘛!老贼!下节的内容。
8、文件的转换生成
流程图果然一目了然,但是真的难画,用网上的:
9、一些知识点
A、汇编指令
JC指令
JC,是“jump if carry”的缩写,意思是如果进位标志是1的话,就跳转。
JNC指令
JNC,是“jump if not carry”的缩写,意思是如果进位标志是0的话,就跳转。
JAE指令
JAE,是“jump if above or equal”的缩写,意思是大于或者等于时,跳转。
JBE指令
JBE,是“jump if below or equal”的缩写,意思是小于或者等于时,跳转。