微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式Linux设备驱动开发之:块设备驱动编程

嵌入式Linux设备驱动开发之:块设备驱动编程

时间:08-13 来源:3721RD 点击:

它负责执行块设备的读、写请求。参数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
(request_fn_proc *rfn, spinlock_t *lock)

分配并初始化请求队列

struct request *blk_get_request
(request_queue_t *q, int rw, int gfp_mask)

从队列中获取一个请求

void blk_requeue_request(request_queue_t *q, struct request *rq)

将请求再次加入队列

void blk_queue_max_sectors
(request_queue_t *q, unsigned short max_sectors)

设置最大访问扇区数

void blk_queue_max_phys_segments
(request_queue_t *q, unsigned short max_segments)

设置最大物理段数

void end_request(struct request *req, int uptodate)

结束本次请求处理

void blk_queue_hardsect_size
(request_queue_t *q, unsigned short size)

设置物理扇区大小

以上简单地介绍了块设备驱动编程的最基本的概念和流程。更深入的内容不是本书的重点,有兴趣的读者可以参考其他书籍。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top