您的位置:首页 > 其它

LDD3读书笔记(第12章 块设备驱动程序)

2012-09-12 22:22 435 查看
#include <linux/fs.h>

int register_blkdev(unsigned int major,counst char *name);

int unregister_blkdev(unsigned int major,const char *name);

register_blkdev用来向内核注册一个块设备驱动程序,还可以获得主设备号。一个驱动程序可以使用unregister_blkdev函数注销。

struct block_device_operations

用来保存块设备驱动程序大多数方法的数据结构。

#include <linux/genhd.d>

struct gendisk;

用来描述内核中单个块设备的结构。

struct gendisk *alloc_disk(int minors);

void add_disk(struct gendisk *gd);

用来分配gendisk结构并将其返回给系统的函数。

void set_capacity(struct gendisk *gd,sector_t sectors);

在gendisk结构中保存设备容量(用512字节扇区单位)。

void add_disk(struct gendisk *gd);

向内核添加一个磁盘。一旦调用了该函数,内核就能调用磁盘方法了。

int check_disk_change(struct block_device *bdev);

用来对指定磁盘驱动器进行介质变化检查的内核函数,当介质改变被侦测到后,采取必要的清除动作。

#include <linux/blkdev.h>

request_queue_t blk_init_queue(request_fn_proc *request,spinlock_t *lock);

void blk_cleanup_queue(request_queue_t *);

用来创建和删除块设备请求队列的函数。

struct request *elv_next_request(request_queue_t *queue);

void end_request(struct request *req,int success);

elv_next_quest获得请求队列中的下一个请求;end_request用在简单的驱动程序中,以完成(或部分完成)一个请求。

void blkdev_dequeue_request(struct request *req);

void elv_requeue_request(request_queue_t *queue,struct request *req);

从队列中删除一个请求的函数,如果需要,还可以吧该请求放回队列。

void blk_stop_queue(request_queue_t *queue);

void blk_start_queue(request_queue_t *queue);

如果不想让自己的请求函数调用,blk_stop_queue可以做到这点。为了能使请求函数被调用,必须调用blk_start_queue的函数。

void blk_queue_bounce_limit(request_queue_t *queue,u64 dma_addr);

void blk_queue_max_sectors(request_queue_t *queue,unsigned short max);

void blk_queue_max_phys_segments(request_queue_t *queue,unsigned short max);

void blk_queue_max_hw_segments(request_queue_t *queue,unsigend short max);

void blk_queue_max_segment_size(request_queue_t *queue,unsigned int max);

blk_queue_segment_boundary(request_queue_t *queue,unsigned long mask);

void blk_queue_dma_alignment(request_queue_t *queue,int mask);

void blk_queue_hardsect_size(request_queue *queue,unsigned short max);

用来设置队列参数的函数。这些参数控制了对一个特定设备请求的创建。参数的具体解释在“队列控制函数”一节。

#include <linux/bio.h>

struct bio;

表示部分块设备I/O请求的底层结构。

bio_sectors(struct bio *bio);

bio_data_dir(struct bio *bio);

这两个宏用来获得bio结构描述的大小和传输方向。

bio_for_each_segment(bvec,bio,segno);

用来遍历组成bio结构的段的伪控制结构。

char *__bio_kmap_atomic(struct bio *bio,int i,enum km_type type);

void __bio_kunmap_atomic(char *buffer,enum km_type type);

__bio_kmap_atomic用来为bio结构中指定的段创建内核虚拟地址。取消该映射必须使用__bio_kunmap_atomic。

struct page *bio_page(struct bio *bio);

int bio_offset(struct bio *bio);

int bio_cur_sectors(struct bio *bio);

char *bio_data(struct bio *bio);

char *bio_kmap_irq(struct bio *bio,unsigned long *flags);

void bio_kunmap_irq(char *buffer,unsigned long *flags);

这是一组访问宏,用来访问bio结构中的“当前”段。

void blk_queue_ordered(request_queue_t *queue,int flag);

int blk_barrier_rq(struct request *req);

如果驱动程序实现了屏障请求,则调用blk_queue_ordered。如果当前请求是一个屏障请求,则宏blk_barrier_rq返回非零值。

int blk_noretry_request(struct request *req);

该宏返回非零值表示指定的请求因错误不能再次被执行。

int end_that_request_first(struct request *irq,int success,int count);

void end_that_request_last(struct request *req);

使用end_that_request_first表示完成一个块设备I/O请求的过程。如果该函数返回0,则表示请求已经完成,应该被传递给end_that_request_last。

rq_for_each_bio(bio,request)

另外一个以宏的形式实现的控制结构,它将遍历请求中的每个bio结构。

int blk_rq_map_sg(request_queue_t *queue,struct request *req,struct scatterlist *list);

为DMA传输,需要将缓冲区映射到指定的request中,使用这些信息填充分散表。

typedef int(make_request_fn)(request_queue_t *q,struct bio *bio);

make_request函数的原型。

void bio_endio(struct bio *bio,unsigend int bytes,int error);

指定的bio结构的信号完成函数。只有当驱动程序通过make_request函数直接从块设备层获得bio结构时,才能用该函数。

request_queue_t *blk_alloc_queue(int flags);

void blk_queue_make_request(request_queue_t *queue,make_request_fn *func);

使用blk_alloc_queue来分配一个请求队列,以便为用户定义的make_request函数所使用。该函数要用blk_queue_make_request设置。

typedef int (prep_rq_fn)(request_queue_t *queue,struct request *req);

void blk_queue_prep_rq(request_queue_t *queue,prep_rq_fn *func);

命令预处理函数的原型和设置,它可以在请求传递到请求处理函数前,为硬件准备需要的命令。

int blk_queue_inti_tags(request_queue_t *queue,int depth,struct blk_queue_tag *tags);

int blk_queue_resize_tags(request_queue_t *queue,int new_depth);

int blk_queue_start_tag(request_queue_t *queue,struct request *req);

void blk_queue_end_tag(request_queue_t *queue,struct request *req);

struct request *blk_queue_find_tag(request_queue_t *qeue,int tag);

void blk_queue_invalidate_tags(request_queue_t *queue);

为了让驱动程序使用标记命令队列而提供的支持函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: