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

来源:互联网 发布:美颜视频电脑软件 编辑:程序博客网 时间:2024/05/10 01:07
#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);
    为了让驱动程序使用标记命令队列而提供的支持函数。
原创粉丝点击