为什么要从块设备开始呢?因为之前没接触过块设备,块设备神秘新颖!
块设备驱动程序的引入
1. 字符设备如何从app到硬件架构读取数据
app: open read write /dev
驱动:drv_open drv_read drv_write 操作硬件
2. 编写字符设备的主要工作
- 指定驱动主设备号major
- 实现file_operations
file_operations = {
.open = ...;
.read = ...;
.write = ...;
....
};
- register_chrdev(major, name, file_operations);
- 入口函数
- 出口函数
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—————– 扇区的读写
块设备驱动层
- 把”读写”放入队列
- 调用队列的处理函数(优化/调顺序/合并) 块设备驱动程序
——————————————— 软硬件分层
硬件: 硬盘,flash
文件系统转化为块设备的读写会调用ll_rw_block()函数
5. 如何编写块设备驱动程序?
- 分配gendisk结构体: alloc_disk
- 设置
2.1 分配/设置队列: request_queue_t, request_queue_t提供读写能力
2.2 设置gendisk其他信息,如容量属性等 - 注册: add_disk