操作系统真相还原——编写硬盘驱动


我们已经有了个虚拟硬盘hd60M.img,它只充当启动盘的作用,仅用来存储内核。我们需要将文件系统装在另外一个虚拟硬盘上。

磁盘分区简析

磁盘分区表简称DPT,是由多个分区元信息汇成的表,表中每个表项对应一个分区,主要记录各分区的起始扇区地址,大小界限等。
最初的硬盘分区表位于MBR引导扇区中,我们回顾一下这512字节大小的结构:
(1)主引导分区,0~0x1BD的空间,包括硬盘参数及部分指令
(2)硬盘分区表DPT,0x1BE~0x1FD的空间,最大支持4个分区
(3)结束魔数,最后两字节

扩展分区

扩展分区表采用链式结构,将所有子扩展分区的分区表串在 起,形成可容纳无限个分区表的单向链表。链表是要有结点的,这里的每个分区表就是结点,一般的链表结点除了包括数据外,还必须要包括下一个结点的地址,分区表也采用了这种结构,其表项就分为两部分,一部分是描述逻辑分区的信息,另一部分是描述下一个子扩展分区的地址。

扩展引导记录(EBR)

EBR 中分区表的第一分区表项用来描述所包含的逻辑分区的元信息,第二分区表项用来描述下一个子扩展分区的地址,第三、四表项未用到。位于 EBR 中的分区表相当于链表中的结点,第一个分区表项存的是分区数据,指向逻辑分区的起始扇区(OBR),第二个分区表项存的是后继分区的指针,下一个子扩展分区的EBR引导扇区起始地址。
分区表项信息
在这里插入图片描述

OBR

如果活动分区标记为0x80,代表着该分区的引导扇区有可执行程序,该程序通常为操作系统内核加载器,即OBR。

编写硬盘驱动程序

硬盘初始化

第 ata 通道接在 8259A 从片的 IRQ15 上,该 ata 通道上可支持两个硬盘 来自 8259A从片的中断是由 8259A 主片帮忙向处理器传达的,8259A 从片是级联在 8259A 主片的 IRQ2 接口的,因此为了让处理器也响应来自 8259A 从片的中断,屏蔽中断寄存器必须也把 IRQ2 打开。
其初始化内容为:
(1)获取硬盘数量
在这里插入图片描述
(2)处理每个通道上的硬盘
(a)为每个ide通道上初始化端口基址及中断向量
(b)初始化锁,信号量

实现thread_yield和idle线程

thread_yield,主动让出CPU,时间片不会增加
(1)先将当前任务重新加入到就绪队列(队尾)
(2)然后将当前任务的 status置为 TASK_READY
(3)最后调用 schedule 重新调度新任务
idle函数
在函数体中执行“thread_block(TASK _BLOCKED)”阻塞自己,在其被唤醒后,通过内联汇编执行 hit 指令,使系统挂起,达到真正的“空闲”。但就绪队列为空的时候,idle_thread会被使用。

选择硬盘

重点在于DEV位,从盘时DEV应该为1,读写硬盘操作,和之前读写硬盘差不多。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值