`
mmdev
  • 浏览: 12921427 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

LDD3学习笔记(19):块驱动

 
阅读更多

#include<linux/fs.h>

intregister_blkdev(unsignedintmajor,constchar*name);

intunregister_blkdev(unsignedintmajor,constchar*name);

register_blkdev注册一个块驱动到内核,并且,可选地,获得一个主编号.一个驱动可被注销,使

unregister_blkdev.

structblock_device_operations

持有大部分块驱动的方法的结构.

#include<linux/genhd.h>

structgendisk;

描述内核中单个块设备的结构.

structgendisk*alloc_disk(intminors);

voidadd_disk(structgendisk*gd);

分配gendisk结构的函数,并且返回它们到系统.

voidset_capacity(structgendisk*gd,sector_tsectors);

存储设备能力(512-字节)gendisk结构中.

voidadd_disk(structgendisk*gd);

添加一个磁盘到内核.一旦调用这个函数,你的磁盘的方法可被内核调用.

intcheck_disk_change(structblock_device*bdev);

一个内核函数,检查在给定磁盘驱动器中的介质改变,并且采取要求的清理动作当检测到这样一个改变.

#include<linux/blkdev.h>

request_queue_tblk_init_queue(request_fn_proc*request,spinlock_t*lock);

voidblk_cleanup_queue(request_queue_t*);

处理块请求队列的创建和删除的函数.

structrequest*elv_next_request(request_queue_t*queue);

voidend_request(structrequest*req,intsuccess);

elv_next_request从一个请求队列中获得下一个请求;end_request可用在每个简单驱动器中来

标识一个(或部分)请求完成.

voidblkdev_dequeue_request(structrequest*req);

voidelv_requeue_request(request_queue_t*queue,structrequest*req);

从队列中除去一个请求,并且放回它的函数如果需要.

voidblk_stop_queue(request_queue_t*queue);

voidblk_start_queue(request_queue_t*queue);

如果你需要阻止对你的请求函数的进一步调用,调用blk_stop_queue来完成.调用

blk_start_queue来使你的请求方法被再次调用.

voidblk_queue_bounce_limit(request_queue_t*queue,u64dma_addr);

voidblk_queue_max_sectors(request_queue_t*queue,unsignedshortmax);

voidblk_queue_max_phys_segments(request_queue_t*queue,unsignedshortmax);

voidblk_queue_max_hw_segments(request_queue_t*queue,unsignedshortmax);

voidblk_queue_max_segment_size(request_queue_t*queue,unsignedintmax);

blk_queue_segment_boundary(request_queue_t*queue,unsignedlongmask);

voidblk_queue_dma_alignment(request_queue_t*queue,intmask);

voidblk_queue_hardsect_size(request_queue_t*queue,unsignedshortmax);

设置各种队列参数的函数,来控制请求如何被创建给一个特殊设备;这些参数在"队列控制函数"一节中描述.

#include<linux/bio.h>

structbio;

低级函数,表示一个块I/O请求的一部分.

bio_sectors(structbio*bio);

bio_data_dir(structbio*bio);

2个宏定义,表示一个由bio结构描述的传送的大小和方向.

bio_for_each_segment(bvec,bio,segno);

一个伪控制结构,用来循环组成一个bio结构的各个段.

char*__bio_kmap_atomic(structbio*bio,inti,enumkm_typetype);

void__bio_kunmap_atomic(char*buffer,enumkm_typetype);

__bio_kmap_atomic可用来创建一个内核虚拟地址给一个在bio结构中的给定的段.映射必须使用__bio_kunmap_atomic来恢复.

structpage*bio_page(structbio*bio);

intbio_offset(structbio*bio);

intbio_cur_sectors(structbio*bio);

char*bio_data(structbio*bio);

char*bio_kmap_irq(structbio*bio,unsignedlong*flags);

voidbio_kunmap_irq(char*buffer,unsignedlong*flags);

一组存取者宏定义,提供对一个bio结构中的"当前"段的存取.

voidblk_queue_ordered(request_queue_t*queue,intflag);

intblk_barrier_rq(structrequest*req);

如果你的驱动实现屏障请求,调用blk_queue_ordered--如同它应当做的.blk_barrier_rq返回一个非零值如果当前请求是一个屏障请求.

intblk_noretry_request(structrequest*req);

这个宏返回一个非零值,如果给定的请求不应当在出错时重新尝试.

intend_that_request_first(structrequest*req,intsuccess,intcount);

voidend_that_request_last(structrequest*req);

使用end_that_request_firest来指示一个块I/O请求的一部分完成.当那个函数返回0,请求完成并且应当被传递给end_that_request_last.

rq_for_each_bio(bio,request)

另一个用宏定义来实现的控制结构;它步入构成一个请求的每个bio.

intblk_rq_map_sg(request_queue_t*queue,structrequest*req,structscatterlist*list);

为一次DMA传送填充给定的散布表,用需要来映射给定请求中的缓冲的信息

typedefint(make_request_fn)(request_queue_t*q,structbio*bio);

make_request函数的原型.

voidbio_endio(structbio*bio,unsignedintbytes,interror);

指示一个给定bio的完成.这个函数应当只用在你的驱动直接获取bio,通过make_request

数从块层.

request_queue_t*blk_alloc_queue(intflags);

voidblk_queue_make_request(request_queue_t*queue,make_request_fn*func);

使用blk_alloc_queue来分配由定制的make_request函数使用的请求队列,.那个函数应当使

blk_queue_make_request来设置.

typedefint(prep_rq_fn)(request_queue_t*queue,structrequest*req);

voidblk_queue_prep_rq(request_queue_t*queue,prep_rq_fn*func);

一个命令准备函数的原型和设置函数,它可用来准备必要的硬件命令,在请求被传递给你的

请求函数之前.

intblk_queue_init_tags(request_queue_t*queue,intdepth,structblk_queue_tag*tags);

intblk_queue_resize_tags(request_queue_t*queue,intnew_depth);

intblk_queue_start_tag(request_queue_t*queue,structrequest*req);

voidblk_queue_end_tag(request_queue_t*queue,structrequest*req);

structrequest*blk_queue_find_tag(request_queue_t*qeue,inttag);

voidblk_queue_invalidate_tags(request_queue_t*queue);

驱动使用被标记的命令队列的支持函数.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics