Linux内核——块设备总结

大神们有没有人讲详细点的,我想分析下,Linux内核——块设备总结
最新回答
胡一菲闪舌头

2024-04-23 08:06:10

深入探索Linux内核世界:块设备详解


在Linux系统中,设备驱动是其核心组成部分,而块设备与字符设备的区别尤为关键。块设备,如硬盘,以数据块为基本操作单元,与字符设备(如串口)以字节为单位的特性形成了鲜明对比。Linux巧妙地通过文件系统缓存优化块设备性能,使其与字符设备的交互更加高效。


核心机制


Linux为两种设备提供了独特的处理方式:字符设备直接映射,而块设备则通过文件系统层处理。具体流程包括:



  • 用户通过open()接口打开设备,通过blkdev_open()与file_operations结构关联,再通过bd_acquire()和gendisk-fops-open进行初始化。

  • 读写操作时,generic_file_read和blkdev_file_write扮演关键角色。非direct I/O时,数据会先读取缓存,然后通过bio机制发送到设备。

  • 写操作可能涉及buffered write,写入缓存后,pdflush daemon负责后续处理。


设备操作的核心在于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】,获取专属的学习资源。内核学习的全面路径、视频教程和代码资料,尽在【内核资料直通车】,涵盖内核源码、内存调优和文件系统等深入内容。