2024-04-23 08:06:10
深入探索Linux内核世界:块设备详解
在Linux系统中,设备驱动是其核心组成部分,而块设备与字符设备的区别尤为关键。块设备,如硬盘,以数据块为基本操作单元,与字符设备(如串口)以字节为单位的特性形成了鲜明对比。Linux巧妙地通过文件系统缓存优化块设备性能,使其与字符设备的交互更加高效。
核心机制
Linux为两种设备提供了独特的处理方式:字符设备直接映射,而块设备则通过文件系统层处理。具体流程包括:
设备操作的核心在于file_operations方法,每个设备类型都有其特有的自定义操作,如def_chr_fops和def_blk_fops。
设备访问的统一接口
Linux采用address_space_operations来实现设备访问的标准化,字符设备无需此操作,仅需简单替换file_operations。读写操作通过submit_bio发起,构建bio后,提交给块设备,如scsi disk /dev/sda。__make_request函数在此过程中起着调度请求的重要作用。
scsi_request_fn的角色
请求队列的scsi_request_fn负责设备间通信,它扫描队列,通过scsi_prep_fn处理请求,然后发送到scsi host,通过queuedata确定目标。这一过程涉及scsi_dispatch_cmd和中断回调,确保读写操作的完整执行。
初始化与注册
创建block_device_operations接口,涉及请求队列的分配、处理函数注册和参数设置。文件系统读写操作结束后,设备需要通过register_blkdev注册到系统,而unregister_blkdev则用于设备卸载时的清理工作。
深入接口与实践
关键的make_request接口允许有实际请求队列的设备调用Linux的__make_request,某些用户驱动可能还需进一步处理bio并返回1以进行数据转发,如在MD RAID中。
以上内容摘自嵌入式技术专家embededgood的文章,欲了解更多内核学习资料,可加入技术交流群【977878001】,获取专属的学习资源。内核学习的全面路径、视频教程和代码资料,尽在【内核资料直通车】,涵盖内核源码、内存调优和文件系统等深入内容。