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

一、实验主要内容

1、内容1:制作真正的IPL
因为磁盘最初的512字节是启动区,但操作系统的大小远超过512字节,因此要装载操作系统后面的内容,于是在IPL.nas文件中添加以下指令用于装载下一个512字节的内容:
在这里插入图片描述

其中JC为jump if carry”意思是如果进位标志(carry flag)是1的话,就跳转而CF的值表示装载是否成功,成功CF赋值为0,失败为1同时将错误号码赋值给AH(这里相当于提供一个失败原因)。INT 0x13表示调用BIOS的0x13号函数。在此函数下对于AH寄存器进行不同的赋值有不同的功能,具体功能可查看此网站:https://blog.csdn.net/ludylu/article/details/6593707
这里使用的功能是AH=0x02;(读盘)在此功能下相应的参数含义如下
AL=处理对象的扇区数;(只能同时处理连续的扇区,但连续处理时可能出错)
CH=柱面号 & 0xff;
CL=扇区号(0-5位)|(柱面号&0x300)>>2;
DH=磁头号;
DL=驱动器号;
ES:BX=缓冲地址;(校验及寻道时不使用)其代表着ES16+BX的内存地址。因为BX能表示的数据量太小,所以增加一个寄存器ES用于扩大范围。
所以这里操作的具体含义如下:
MOV CH,0
MOV DH,0
MOV CL,2//代表柱面0磁头0扇区2,这里意义是指定要读取的扇区
MOV AH,0x02//代表着读盘功能。
MOV AL,1//代表处理1个扇区。
MOV DL,0x00//代表着调用0号软盘驱动器,因为现在的计算机一般只有一个软盘所以这里一般都是0号。
INT 0x13//代表着调用磁盘BIOS的0x13号函数。
MOV AX,0x0820
MOV ES,AX//因为不能对ES直接赋值(上次实验中发现的不能直接使用MOV对ES寄存器赋常数),所以这里只能先通过AX再赋给ES。
而0x0820表示的是(后面BX赋值的是0)0x0820
16+0=0x8020,所以这里表示的是0x8020号内存地址。这里意义是作为装载程序的内存起始地址。
选则0x8200是因为0x8000-0x81ff的512字节是留给启动区的,且0x8000以后的内存区域没有人使用,因此便将程序装载到该处。
这里软盘中含有IPL的启动区位于C0-H0-S1(即柱面0,磁头0,扇区1)也就是第一扇区,下一个扇区是C0-H0-S2,也就是我们这里程序所装载的扇区。
2、内容2:建立容错机制:
软盘有时候会偶尔发生不能读数据的状况,但这时候只需让其重读即可,软盘不一定真的损坏了。但是若是磁盘真的损坏,程序便会进入死循环。因此,我们可以给程序一定的容错的次数,失败后让软盘重读一次,如果重读次数超过一定次数,那我们就认为软盘真的损坏了。在该程序中,设置的读数据失败次数为5次,此时将程序更改为:

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值