30天自制操作系统(Mac版)读书笔记(day3)

进入32位模式并导入C语言

真正的IPL(读取软盘)

  1. IPL initial program loader,本质上是一个loader,之前的代码其实是调用显示的中断去显示,现在需要他直接去load银盘上的真实程序了。
  2. 修改之前的现实字符串的代码为以下代码,一个典型的int13的中断调用,这里AH的数值表示int13的子方法。比如 AH=0x02的时候,则是读扇区。AH=0x03的时候,是写扇区。
MOV		AX,0x0820
MOV		ES,AX
MOV		CH,0
MOV		DH,0
MOV		CL,2

MOV		AH,0x02	
MOV		AL,1
MOV		BX,0
MOV		DL,0x00	
INT		0x13
JC		error
  1. 百度一下INT13,找到另外一篇文章,这里又提出了,柱面,磁头,扇区的概念,这个书上说的很清楚。

(3)、功能02H
功能描述:读扇区
入口参数:AH=02H
AL=扇区数
CH=柱面
CL=扇区
DH=磁头
DL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘
ES:BX=缓冲区的地址
出口参数:CF=0——操作成功,AH=00H,AL=传输的扇区数,否则,AH=状态代码,参见功能号01H中的说明

  1. 添加注释
MOV		AX,0x0820 //为什么是0820,其实也没什么特别的,主要是这里没啥内容
MOV		ES,AX //设置缓冲区地址
MOV		CH,0 //设置柱面
MOV		DH,0 //设置磁头
MOV		CL,2 //设置扇区

MOV		AH,0x02	//设置功能
MOV		AL,1 //读取的扇区数量
MOV		BX,0 //缓冲区偏移
MOV		DL,0x00	//设置驱动器
INT		0x13
JC		error
  1. int13可以理解为 C与语言中的函数,这里有输入,有输出,输入的值存在寄存器中,输出的值有两个,一个是操作的成功与否,还有一个就是输出的结果存在哪里,结果在哪里,对应的ES:BX对应的内存地址。

读取磁盘上的程序

  1. 书上线是加了错误处理,后来又开始读区多个扇区的,我觉得实在是有点麻烦,现在的程序代码也不是很多,花时间在这上面没必要,我们简单点,只读一个扇区就行了。
  2. 书上自带的代码中,又一个程序是专门程序去写入扇区,参考GitHub上的linux平台下的代码,原理是用mount命令来挂载磁盘,mac上mount命令有问题,我们用hdiutil 命令来代替。
  3. 重点来了,hdiutil挂载以后,把文件写入Fat12的文件系统,直接写入的文件在哪,这里其实没查到什么文档,但是我们可以用hexedit来查看文件在镜像中的偏移量。这里我查到实在0x4600的位置,除以512,是35号扇区,但是18个扇区就是一个磁头,两个磁头一个柱面。所以应该是CH0,DH1,CL18。
  4. 所以,我们的程序需要改一下,ES设置为0x0,bx设置为 0x8000,这样文件就会加载到内存的0x8000的位置,CH=0,DH=1,CL=18。

实际程序的代码

运行的结果就是一个屏幕全黑。这里用到了一个 INT10的中断。也是一个显示中断。这一段还是挺难的,这一天哪能搞得定。而且书上还不是读一个扇区,还读了十好几个扇区。读多个扇区的事情,等以后有空了再说吧。

org   0x8000

		MOV		AL,0x13	
		MOV		AH,0x00
		INT		0x10
fin:
		HLT
		JMP		fin

导入C语言

好麻烦,重新开一篇文章吧。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值