块设备简介

本文深入探讨了操作系统中块设备的读写机制,详细解释了ll_rw_blk.c的作用及其实现原理,包括中断处理、逻辑块与扇区转换、缓冲区管理、电梯移动算法的应用,以及请求项操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设备分为块设备和字符设备
ll_rw_blk.c是其他程序调用设备所用到的程序。
对硬盘和软盘设备上数据的读写是通过中断处理程序进行
内核每次读写的数据量是逻辑块(1024字节),而设备的存储是扇区(512字节)

当程序读取设备数据时,首先向缓冲区管理程序提出申请,程序的进程进入睡眠状态,
缓冲区管理程序首先在缓冲区中寻找以前是否已经读取过这块数据,如果缓冲区有,就直接将对应的
缓冲区的头指针返回给程序并且唤醒程序。如果缓冲区不存在所要求的数据块,则缓冲区管理程序会调用
低级块读写函数ll_rw_block(),向相应的块设备驱动程序发出读写操作请求。ll_rw_block()函数会创建一个请求项,
并把该项插入到请求队列中,插入请求项使用了电梯移动算法。

内核使用一张设备表blk_dev[]来进行管理,每种设备在设备表中占一项。
设备项结构
struct blk_dev_struct{
    void (*request_fn)(void);//函数指针,用于操作相应设备的请求项
    struct request *current_request;//请求项结构指针,指明本块设备正在处理的请求项
};
系统发出写命令(hd_out())后等待给予允许向控制器写数据的响应,即请求服务标志DRQ置位,一旦DRQ置位,
系统就可以向控制器缓冲区发送一个扇区的数据,控制器发数据写入驱动器后,还会产生中断请求信号,中断过程
中执行前面预设置的write_intr(),该函数会查询是否还有数据要写,系统再把一个扇区的数据传给控制器缓冲区中,
一直这样重复执行,直到把所有数据写入驱动器,该函数执行本次写盘的结束后的处理工作,唤醒请求项的相关进程,
唤醒等待请求项进程,释放请求项并从链表删除该请求项以及释放相关缓冲区,最后再调用请求项操作函数执行下一个请求项。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jena_wy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值