块设备驱动实现--模拟一个块设备

1、前言

        存储层在收到I/O请求后进行数据处理,再给上层应答,本文实现一个实际的块设备驱动。使用Linux5.4为基础,进行框架搭建和功能实现。

2、ko模块与编译

        首先定义一个init和exit函数,去注册自己的驱动函数模块。

#include <linux/module.h>
#include <linux/init.h>static int __init init_myblk(void)
{int ret;printk("start lsmod my blk_dev");my_disk_queue = blk_mq_init_sq_queue( &tag_set, &my_blk_mq_ops, 16, BLK_MQ_F_SHOULD_MERGE);if (!my_disk_queue) {ret = -ENOMEM;goto err_init_queue;}my_disk = alloc_disk(1);if (!my_disk) {ret = -ENOMEM;goto err_alloc_disk;}strcpy(my_disk->disk_name, MY_BLKDEV_DISKNAME);//设备名称my_disk->major = MY_BLKDEV_DEVICEMAJOR;//块设备的主设备号my_disk->first_minor = 0;my_disk->fops = &myblk_fops;//操作结构体my_disk->queue = my_disk_queue;//块设备驱动的请求队列set_capacity(my_disk, MY_BLKDEV_BYTES>>9);add_disk(my_disk);return 0;
err_init_queue:printk("init blk_queue error");return ret;err_alloc_disk:printk("alloc blk error");return ret;
}module_init(init_myblk);
module_exit(exit_myblk);
MODULE_LICENSE("GPL");

这里还要在要Makefile里记得拉上自己的文件路径,在.config中加上编译的宏,并且写一个kconfig去配置这个宏。

其中,my_disk_queue = blk_mq_init_sq_queue(&tag_set, &my_blk_mq_ops, 16, BLK_MQ_F_SHOULD_MERGE);    在5.4中块设备全面改成了blk_mq(多任务队列),所以相关的API都是和blk_mq有关系的,这个地方卡了好久好久,最终还是从z2ram.c中了解到的,后边io处理的队列也是参考z2ram.c来写的。

所以接下来就是这个my_blk_queue_rq()的内容:

static const struct blk_mq_ops my_blk_mq_ops = {.queue_rq   = my_blk_queue_rq,
};static blk_status_t my_blk_queue_rq(struct blk_mq_hw_ctx *hctx,const struct blk_mq_queue_data *bd)
{struct request *req = bd->rq;unsigned long start = blk_rq_pos(req) << 9;unsigned long len  = blk_rq_cur_bytes(req);void *buffer;blk_mq_start_request(req);if (start + len > MY_BLKDEV_BYTES) {printk(KERN_ERR MY_BLKDEV_DISKNAME": bad request: block=%llu, count=%u\n",(unsigned long long)blk_rq_pos(req),blk_rq_cur_sectors(req));blk_mq_end_request(req, BLK_STS_OK);}spin_lock_irq(&myblk_lock);buffer = bio_data(req->bio);if (rq_data_dir(req) == READ)memcpy(buffer,my_blkdev_data + start,blk_rq_cur_sectors(req) << 9);else if(rq_data_dir(req) == WRITE)memcpy(buffer,my_blkdev_data + start,blk_rq_cur_sectors(req) << 9);spin_unlock_irq(&myblk_lock);blk_mq_end_request(req, BLK_STS_OK);return BLK_STS_OK;
}

        实际上就是memcpy相关的字符串到块设备的存储空间内。然后各种编译。且要把blk_mq_init_sq_queue加入白名单(while list)。

3、编译与使用

        在Android开发环境中,选择bootimage编译,修改Makefile和Kconfig后,会自动加载该模块。 使用lsmod可以发现这时候还没被使用,首先进行文件系统挂载:

ir:/ # mkfs.ext4 dev/block/my_blkdev                                                                                                                                                                       
mke2fs 1.45.4 (23-Sep-2019)
Creating filesystem with 16384 1k blocks and 4096 inodes
Filesystem UUID: 200b5fcd-e9ea-4634-9c98-94a8bc58d1f2
Superblock backups stored on blocks:8193Allocating group tables: done                           
Writing inode tables: done                           
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: doneir:/ # mount dev/block/my_blkdev mnt/tmp1/                                                                                                                                                               
mount: 'dev/block/my_blkdev'->'mnt/tmp1/': I/O error

        但是,这里有个问题,将ko整机刷入后,会面临io调度导致的挂载失败问题, 需要进行修改。

参考:[原创] 写一个块设备驱动 - 内核源码-Chinaunix

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/45980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Open-TeleVision——通过VR沉浸式感受人形机器人视野:兼备远程控制和深度感知能力

前言 7.3日&#xff0c;我司七月在线(集AI大模型职教、应用开发、机器人解决方案为一体的科技公司)的「大模型机器人(具身智能)线下营」群里的一学员发了《Open-TeleVision: Teleoperation with Immersive Active Visual Feedback》这篇论文的链接&#xff0c;我当时快速看了一…

shell脚本之if/case语句

一、条件测试 1、1 返回码 $? $? :返回码&#xff0c;用来判断命令或者脚本是否执行成功。 0 &#xff1a;表示true &#xff0c;成功&#xff1b;非0 则表示flase &#xff0c;失败。 1、2 test命令 可以进行条件测试&#xff0c;然后根据返回值来判断条件是否成立 -e…

周末总结(2024/07/13)

工作 人际关系核心实践&#xff1a; 要学会随时回应别人的善意&#xff0c;执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己&#xff0c;抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内 工作上的要点 现状&#xff08;接受破烂现状&#xff0c;改变…

RISC-V异常处理流程概述(2):异常处理机制

RISC-V异常处理流程概述(2):异常处理机制 一、异常处理流程和异常委托1.1 异常处理流程1.2 异常委托二、RISC-V异常处理中软件相关内容2.1 异常处理准备工作2.2 异常处理函数2.3 Opensbi系统调用的注册一、异常处理流程和异常委托 1.1 异常处理流程 发生异常时,首先需要执…

Linux重要知识点

1. 命令行操作 Linux大多数操作都是通过命令行进行的。熟悉常用命令和脚本是使用Linux的基础。 基本命令&#xff1a;如 ls, cd, cp, mv, rm&#xff0c;这些命令用于文件和目录的管理。文件权限和管理&#xff1a;了解如何使用 chmod, chown, chgrp 等命令来管理文件权限和所…

MySQL数据库相关知识

1、常用知识点 binlog日志&#xff1f; 在MySQL中&#xff0c;术语“schema”和“database”通常是同义词&#xff0c;它们指的是存储数据表、视图、存储过程等数据库对象的逻辑容器。? 2、优化 3、原理

C++:右值引用

右值与左值 在讲解右值引用之前&#xff0c;我们就需要先辨析一下左值与右值的区别。 左值 左值是一个表示数据的表达式&#xff0c;我们可以获取它的地址并且对其赋值&#xff0c;左值可以出现在赋值操作符的左边&#xff0c;但是右值不能。 int i 0; int* p &i; do…

编程题-栈,链栈

概念 栈&#xff08;Stack&#xff09;&#xff1a;是只允许在一端进行插入或删除的线性表。首先栈是一种线性表&#xff0c;但限定这种线性表只能在某一端进行插入和删除操作。 栈顶&#xff08;Top&#xff09;&#xff1a;线性表允许进行插入删除的那一端。 栈底&#xff0…

4、linux相关基础知识

1、gcc编译过程 .c通过编译生成.o文件&#xff0c;.out目标文件进过链接生成.so库文件。 2、在C中可以使用system(("mkdir -p "path).c_str())创建目录。c_str()把string转化为c字符串&#xff0c;便于system命令识别&#xff0c;system命令会新启动一个进程来创建文…

移动硬盘有盘符打不开:深度解析与高效恢复指南

在数字化信息爆炸的今天&#xff0c;移动硬盘作为便捷的数据存储与传输工具&#xff0c;其重要性不言而喻。然而&#xff0c;当您遇到移动硬盘有盘符却无法正常打开的情况时&#xff0c;无疑会给您的工作和生活带来不小的困扰。本文将深入探讨移动硬盘有盘符打不开的原因&#…

东软“引战”国家队 通用技术“补链”大国重器

向来低调温和的东软创始人刘积仁&#xff0c;这一次抛出了“王炸”级的资产交易。 7月3日&#xff0c;《多肽链》获得一则足以引爆国内医疗设备行业的投资信息&#xff1a;被东软集团视为核心资产、掌上明珠的东软医疗&#xff0c;成功引入通用技术集团资本有限公司与中国国有…

BI佐罗,居然抄袭洗稿我的文章

必须曝光此博主不当行径。 4月2日这天发表的原创文章&#xff1a;BI报表系统建设10大坑&#xff0c;因为都是切身的实际项目经验总结&#xff0c;获得了很多人的关注。 我觉得写文章要写的是亲身、真的做过的专业的项目经验&#xff0c;而不是信口开河随口忽悠。 如果有些博…

Fancybox: 号称世界上最流行的灯箱脚本!这款“花盒“为什么与众不同?

今天要分享的是一个灯箱脚本库&#xff1a;Fancybox。最近了不起刚好用到它。这里就和大家分享下。 简介 Fancybox 是终极的 JavaScript 灯箱替代品&#xff0c;为多媒体显示中的优质用户体验设定了标准。支持图像、视频、地图、内联内容、iframe 和任何其他 HTML 内容。 此…

reverse函数讲解

reverse&#xff1a; 在C中&#xff0c;reverse 是一个标准库函数&#xff0c;用于反转指定范围内的元素顺序。该函数定义在头文件 <algorithm> 中。它的基本用法如下&#xff1a; #include <algorithm> // 包含reverse函数 #include <vector> // 使用v…

如何在SpringCloud中使用Kafka Streams实现实时数据处理

使用Kafka Streams在Spring Cloud中实现实时数据处理可以帮助我们构建可扩展、高性能的实时数据处理应用。Kafka Streams是一个基于Kafka的流处理库&#xff0c;它可以用来处理流式数据&#xff0c;进行流式计算和转换操作。 下面将介绍如何在Spring Cloud中使用Kafka Streams实…

Pytorch中nn.Sequential()函数创建网络的几种方法

1. 创作灵感 在创建大型网络的时候&#xff0c;如果使用nn.Sequential&#xff08;&#xff09;将几个有紧密联系的运算组成一个序列&#xff0c;可以使网络的结构更加清晰。 2.应用举例 为了记录nn.Sequential&#xff08;&#xff09;的用法&#xff0c;搭建以下测试网络&…

UDP怎么实现可靠传输

UDP它不属于连接型协议&#xff0c;因而具有资源消耗小&#xff0c;处理速度快的优点&#xff0c;所以通常音频、视频和普通数据在传送时使用UDP较多&#xff0c;因为它们即使偶尔丢失一两个数据包&#xff0c;也不会对接收结果产生太大影响。传输层无法保证数据的可靠传输&…

简谈设计模式之工厂模式

工厂模式是一种创建型设计模式, 旨在将对象的创建过程和使用过程分离. 这样可以在不改变客户端代码的前提下, 灵活创建不同类型的对象 工厂模式实现 简单工厂模式 简单工厂模式使用一个工厂类根据传入的参数决定创建哪种具体产品类的实例. 它不属于设计模式的23种, 但它为理…

数字电路-建立时间和保持时间详解

对于数字系统而言&#xff0c;建立时间&#xff08;setup time&#xff09;和保持时间&#xff08;hold time&#xff09;是数字电路时序的基础。数字电路系统的稳定性&#xff0c;基本取决于时序是否满足建立时间和保持时间。我自己在初学时一度很难理解清楚他们的概念&#x…

云端典藏:iCloud中个人收藏品目录的智能存储方案

云端典藏&#xff1a;iCloud中个人收藏品目录的智能存储方案 在数字化生活不断推进的今天&#xff0c;个人收藏品的管理也趋向于电子化和云端化。iCloud作为苹果公司提供的云服务&#xff0c;为个人收藏品目录的存储和管理提供了一个安全、便捷、跨设备的解决方案。本文将详细…