嵌入式Linux设备驱动开发之:块设备驱动编程
它负责执行块设备的读、写请求。参数lock为自旋锁,用于控制对所分配的队列的访问。
(3)初始化并注册gendisk结构。
内核提供的gendisk结构相关函数如表11-16所示。
表11-16 gendisk结构相关函数
函数格式 | 说明 |
struct gendisk *alloc_disk(int minors) | 动态分配gendisk结构,参数为次设备号的个数 |
void add_disk(struct gendisk *disk) | 向系统注册gendisk结构 |
void del_gendisk(struct gendisk *disk) | 从系统注销gendisk结构 |
首先使用alloc_disk()函数动态分配gendisk结构,接下来,对gendisk结构的主设备号(major)、次设备号相关成员(first_minor和minors)、块设备操作函数(fops)、请求队列(queue)、可包含的扇区数(capacity)以及设备名称(disk_name)等成员进行初始化。
在完成对gendisk的分配和初始化之后,调用add_disk()函数向系统注册块设备。在卸载gendisk结构的时候,要调用del_gendisk()函数。
4.块设备请求处理
块设备驱动中一般要实现一个请求队列处理函数来处理队列中的请求。从块设备的运行流程,可知请求处理是块设备的基本处理单位,也是最核心的部分。对块设备的读写操作被封装到了每一个请求中。
已经提过调用blk_init_queue()函数来申请并初始化请求队列。表11-17列出了一些与请求处理相关的函数。
表11-17 请求处理相关函数
函数格式 | 说明 |
request_queue_t *blk_alloc_queue(int gfp_mask) | 分配请求队列 |
request_queue_t *blk_init_queue | 分配并初始化请求队列 |
struct request *blk_get_request | 从队列中获取一个请求 |
void blk_requeue_request(request_queue_t *q, struct request *rq) | 将请求再次加入队列 |
void blk_queue_max_sectors | 设置最大访问扇区数 |
void blk_queue_max_phys_segments | 设置最大物理段数 |
void end_request(struct request *req, int uptodate) | 结束本次请求处理 |
void blk_queue_hardsect_size | 设置物理扇区大小 |
以上简单地介绍了块设备驱动编程的最基本的概念和流程。更深入的内容不是本书的重点,有兴趣的读者可以参考其他书籍。
- 嵌入式Linux技术在工业控制网络中的应用(10-30)
- 基于嵌入式Linux的组态软件实时数据库的设计(02-01)
- 基于ARM+DSP的嵌入式Linux数控系统设计(11-18)
- 基于嵌入式Linux的细胞特征提取算法设计(11-19)
- 基于S3C2410的嵌入式Linux系统构建(03-02)
- 嵌入式Linux网络编程之:网络基础编程(08-13)