30天自制操作系统日志第3天

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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、到正菜了,主程序操作系统

完成了启动区的制作,下一步开始编写操作系统代码。

最简单的操作系统haribote.nas:

Fin:

HLT

Jmp fin

我们需要将操作系统本身的内容写到名为haribote.sys文件中,再把他保存到磁盘映像里,然后我们从启动区执行这个haribote.sys就行了。老作者用一个简单的例子告诉我们当我们向一张空软盘保存文件时,1)文件名会写在0x002600以后的地方;2)文件的内容会写在0x004200以后的地方。由于目前的启动区程序是从启动区后面开始(不包括启动区)加载到内存地址0x8200处的,所以磁盘0x4200的内容就会被加载到内存地址0xc200处,其中0xc200 = 0x8200 + 0x4200 - 512(启动区大小),现在我们就可从0xc200处

加载我们自己写的程序用于执行了。需要在haribote.nas头加入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”的缩写,意思是小于或者等于时,跳转。

相关文档
最新文档