Xv6内核分析(九)

gewenbin
gewenbin
gewenbin
188
文章
15
评论
2020年12月20日17:37:29 评论 526

ide硬盘驱动分析

1. 磁盘驱动程序

磁盘驱动程序用结构体 buf(称为缓冲区)来表示一个磁盘扇区。每一个缓冲区表示磁盘设备上的一个扇区。域 dev 和 sector 给出了设备号和扇区号,域 data 是该磁盘扇区数据的内存中的拷贝。

域 flags 记录了内存和磁盘的联系:B_VALID 位代表数据已经被读入,B_DIRTY 位代表数据需要被写出。B_BUSY 位是一个锁;它代表某个进程正在使用这个缓冲区,其他进程必须等待。当一个缓冲区的 B_BUSY 位被设置,我们称这个缓冲区被锁住。

2. ideinit函数

Xv6内核分析(九)

2.1使能磁盘中断

调用ioapicenable使能硬盘中断,通过调用此函数使能了IDE硬盘的中断,并使用最后一个cpu来处理IDE硬盘的中断,比如有4个核的话,就用第四个核来处理IDE硬盘中断。

2.2 等待磁盘空闲

调用idewait等待硬盘空闲:

Xv6内核分析(九)

通过检测状态寄存器来判断硬盘是在忙状态还是空闲状态。

2.3 检测第二个磁盘

接着检测是否存在第二个硬盘:

Xv6内核分析(九)

0x1f6端口描述如下:

Xv6内核分析(九)

0x1f7端口描述如下:

Xv6内核分析(九)

  • 首先向DEV bit域写1,表示操作的是第二个硬盘。
  • 然后轮询检测状态寄存器,如果DRDY为1,表示第二个盘存在,否则不存在。

最后再切换为第1个硬盘。

3. 磁盘缓冲

ideinit 之后,就只能通过块高速缓冲(buffer cache)调用 iderw,iderw 根据标志位更新一个锁住的缓冲区。如果 B_DIRTY 被设置,iderw 将缓冲区的内容写到磁盘;如果 B_VALID 没有被设置,iderw 从磁盘中读出数据到缓冲区。

iderw 维护一个等待中的磁盘请求队列,然后用中断来指明哪一个请求已经完成。虽然 iderw 维护了一个请求的队列,简单的 IDE 磁盘控制器每次只能处理一个操作。磁盘驱动程序的原则是:它已将队首的缓冲区送至磁盘硬件;其他的只是在等待他们被处理。

Xv6内核分析(九)

3.1 磁盘请求队列

磁盘请求队列如下:

Xv6内核分析(九)

如果当前队列中有未完成的磁盘请求,则新来的磁盘请求会被加入到磁盘请求队列队尾。在xv6中实现此操作的代码如下:

Xv6内核分析(九)

3.2 处理请求

如果当前队列中只有一个磁盘请求,则开始处理请求:

Xv6内核分析(九)

来看看磁盘请求处理函数idestart:

Xv6内核分析(九)

  • buf结构中记录的是磁盘块号,首先将块号转换成扇区号,如果块大小和扇区大小相同,那么扇区号就等于块号
  • 操作0x3f6寄存器使能磁盘中断:

Xv6内核分析(九)

  • 操作0x1f2记录要操作的扇区数
  • 操作0x1f3~0x1f6记录要操作的逻辑扇区号
  • 通过检测B_DIRTY标志来判断是要读磁盘还是要写磁盘,如果是要写磁盘,则首先向0x1f7写入0x30写磁盘命令:

Xv6内核分析(九)

然后通过outsl函数向0x1f0数据寄存器写入一个扇区的数据,因为每次只能写4自己,所以总共要写BSIZE/4次。

  • 如果要读磁盘的话,直接向0x1f7中写入0x20读硬盘命令即可。

当写磁盘完成的话,会产生一个中断;同样,当磁盘准备好数据可供cpu读取时,也会产生一个中断。

3.3 检查请求

检查磁盘请求操作是否完成:

Xv6内核分析(九)

当磁盘读写操作完成时,B_VALID标志位会被置位。如果磁盘操作没有完成,则将当前进程睡眠。之后在中断中唤醒。

4. 磁盘中断处理程序

Xv6内核分析(九)

  • 从磁盘处理队列中取出第一个请求进行处理。
  • 如果是读请求,则通过insl函数从磁盘读取一个扇区的数据。
  • 更新buf标志位。主要是设置B_VALID位,清除B_DIRTY位。
  • 激活阻塞在此buf上的进程。
  • 如果处理队列中还有请求,则继续处理请求。

gewenbin
  • 本文由 发表于 2020年12月20日17:37:29
  • 转载请务必保留本文链接:http://www.databusworld.cn/9448.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: