LDD3讀書筆記(第12章 塊設備驅動程序)

#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);
    爲了讓驅動程序使用標記命令隊列而提供的支持函數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章