当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > 如何编写块设备驱动

如何编写块设备驱动 时间:2018-09-28      来源:未知

首先参考内核代码中的z2ram.c   

用内存模拟一个块设备驱动 

具体的块设备驱动流程:

1、向内核注册块设备

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

参数1:major写0表示自动获取主设备号

参数2:注册的名称

返回值:当参数1写0时 返回申请的主设备号

2、分配disk个数

struct gendisk *alloc_disk(int minors)

返回值: 通用的块设备数据结构指针 

3、初始化alloc_disk返回的gendisk指针成员

1) major  主设备号的初始化

2) first_minor 第一个次设备号的初始化 一般为0

3) struct block_device_operations *fops;

向上提供的接口

4) disk_name 名称的初始化

5) 设置disk容量 

static inline void set_capacity(struct gendisk *disk, sector_t size)

6) struct request_queue *queue;

请求队列的初始化

使用如下函数进行初始化:

struct request_queue *blk_init_queue(request_fn_proc *rfn, spinlock_t *lock)

参数1:回调函数  

参数2:用于解决竞态的 

回调函数 request_fn_proc *rfn

1.获取请示 req = blk_fetch_request(q);

2.根据请求判断读和写操作 进行相应的memcpy

blk_init_queue

---->blk_init_queue_node

----> blk_init_allocated_queue

---> blk_queue_make_request(q, blk_queue_bio);

--->blk_queue_bio 电梯优化算法

4、将已初始化好的gendisk指针添加到内核 

add_disk(struct gendisk *)

5、  blk_register_region 在dev目录下创建设备结点 名称为disk_name

6、 反向操作

blk_unregister_region 销毁设备结点

unregister_blkdev 注销块设备

del_gendisk(z2ram_gendisk); 删除gendisk

put_disk(z2ram_gendisk); 释放disk

blk_cleanup_queue(z2_queue); 释放请求队列

测试方法:

1、mkdosfs /dev/fs_blk0

2、mount /dev/fs_blk0 /mnt

3、cd /mnt 

touch 1.c 2.c 3.c

4、cd ..

umount /mnt

ls查看/mnt下内容 

5、再次挂载查看mnt下内容 有1.c 2.c 3.c

上一篇:对进程的理解

下一篇:Linux进程的睡眠和唤醒简析

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部