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

简介:  #include int register_blkdev(unsigned int major, const char *name);int unregister_blkdev(unsigned int major, const char *...
 

#include <linux/fs.h>

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

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

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

用 unregister_blkdev.

struct block_device_operations 

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

#include <linux/genhd.h>

struct gendisk;

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

struct gendisk *alloc_disk(int minors);

void add_disk(struct gendisk *gd);

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

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

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

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_request 从一个请求队列中获得下一个请求; 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, unsigned 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_t *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 *req, int success, int count);

void end_that_request_last(struct request *req);

使用 end_that_request_firest 来指示一个块 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 传送填充给定的散布表用需要来映射给定请求中的缓冲的信息

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

make_request 函数的原型.

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

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

数从块层.

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_init_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);

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

目录
相关文章
|
2月前
|
Ubuntu Linux
编译替换内核_设备树_驱动_IMX6ULL
编译替换内核_设备树_驱动_IMX6ULL
编译替换内核_设备树_驱动_IMX6ULL
|
2月前
|
存储 Unix Linux
Linux:指令篇(深度解析+使用)
Linux:指令篇(深度解析+使用)
102 3
|
存储 缓存 固态存储
|
Windows
用模拟器加载基于ARM平台的WinCE6.0 内核(NK.bin)
虽然公司在一年以前就开始做基于WinCE4.2系统的触摸屏,但是作为侧重应用层面开发的我,对WinCE内核相关知识可以说是一知半解。
904 0
|
Linux 开发者 SoC
宋牧春: Linux设备树文件结构与解析深度分析(2) 【转】
转自:https://mp.weixin.qq.com/s/WPZSElF3OQPMGqdoldm07A             作者简介   宋牧春,linux内核爱好者,喜欢阅读各种开源代码(uboot、linux、ucos、rt-thread等),对于优秀的代码框架及其痴迷。
1589 0
|
Linux
linux-3.2.36内核启动2-setup_arch中的内存初始化1(arm平台 分析高端内存和初始化memblock)【转】
转自:http://blog.csdn.net/tommy_wxie/article/details/17093307 上一篇微博留下了这几个函数,现在我们来分析它们         sanity_check_meminfo();         arm_memblock_init(&memi...
1150 0
|
Linux 编译器 Shell
linux驱动开发--导出内核符号
<p>导出内核符号模板代码,验证小实例:</p> <p></p> <pre>/** *Copyright (c) 2013.TianYuan *All rights reserved. * *文件名称: Esdexp.c *文件标识: 导出内核符号,此文件中的函数模块被Esdimp.c调用 * *当前版本:1.0 *作者:wuyq * *取代版本:xxx *原作者:xxx *完成日期
1444 0
|
Unix
想知道nm命令的实现原理吗---分析AIX平台下ELF文件的符号表
在AIX及其他unix/linux平台上,我们可以使用nm, objdump和readelf来分析ELF文件的符号表。具体使用方式是:nm objfile objdump -x objfile (或其他选项)readelf -a objfile但我们有时候需要在程序中来分析某个ELF文件(比如当前进程)的符号表,进行处理。
1946 0
|
缓存 Linux 存储
LDD3学习笔记(20):网络驱动
  #include  定义 struct net_device 和 struct net_device_stats 的头文件, 包含了几个其他网络驱动需要的头 文件.
982 0

热门文章

最新文章