Linux块设备驱动程序

时间:2021-06-10 23:37:34

为什么要从块设备开始呢?因为之前没接触过块设备,块设备神秘新颖!

块设备驱动程序的引入

1. 字符设备如何从app到硬件架构读取数据

app: open read write /dev
驱动:drv_open drv_read drv_write 操作硬件

2. 编写字符设备的主要工作

  1. 指定驱动主设备号major
  2. 实现file_operations
file_operations = {
    .open   = ...;
    .read   = ...;
    .write  = ...;
    ....
};
  1. register_chrdev(major, name, file_operations);
  2. 入口函数
  3. 出口函数

3. 块设备与字符设备的不同地方

块设备对于读写操作并不立即执行,而是使用队列存放读取请求,优化读写顺序后再执行。比如有三个读写操作要执行,1.对磁盘0a区进行读操作;2.对磁盘1a区进行写操作,3.对磁盘0b区进行读操作,块设备将使用

4. 块设备的框架

app对文件的读写时,将通过vfat, ext2, ext3, ntfs等等文件系统,实现对扇区的读写,从而实现文件读写->扇区读写

app:open,read,write “1.txt”
——————————————— 文件的读写
文件系统: vfat, ext2, ext3, yaffs2, jffs2 (把文件的读写转换为扇区的读写)
—————–ll_rw_block—————– 扇区的读写
块设备驱动层

  1. 把”读写”放入队列
  2. 调用队列的处理函数(优化/调顺序/合并) 块设备驱动程序

——————————————— 软硬件分层
硬件: 硬盘,flash

文件系统转化为块设备的读写会调用ll_rw_block()函数

5. 如何编写块设备驱动程序?

  1. 分配gendisk结构体: alloc_disk
  2. 设置
    2.1 分配/设置队列: request_queue_t, request_queue_t提供读写能力
    2.2 设置gendisk其他信息,如容量属性等
  3. 注册: add_disk