4-内核开发-第一个块设备模块开发案例

news2024/11/6 9:57:53
4-内核开发-第一个块设备模块开发案例

目录

4-内核开发-第一个块设备模块开发案例

1.开发原则创建步骤

2. 编译并加载模块

​3.安装模块

4.检查模块是否加载成功

5.通过设备名称查看

6. 创建一个块设备文件

7. 查看块设备

8.模块卸载

9.总结


课程简介:
Linux内核开发入门是一门旨在帮助学习者从最基本的知识开始学习Linux内核开发的入门课程。该课程旨在为对Linux内核开发感兴趣的初学者提供一个扎实的基础,让他们能够理解和参与到Linux内核的开发过程中。

课程特点:
1. 入门级别:该课程专注于为初学者提供Linux内核开发的入门知识。无论你是否具有编程或操作系统的背景,该课程都将从最基本的概念和技术开始,逐步引导学习者深入了解Linux内核开发的核心原理。

2. 系统化学习:课程内容经过系统化的安排,涵盖了Linux内核的基础知识、内核模块编程、设备驱动程序开发等关键主题。学习者将逐步了解Linux内核的结构、功能和工作原理,并学习如何编写和调试内核模块和设备驱动程序。

3. 实践导向:该课程强调实践,通过丰富的实例和编程练习,帮助学习者将理论知识应用到实际的Linux内核开发中。学习者将有机会编写简单的内核模块和设备驱动程序,并通过实际的测试和调试来加深对Linux内核开发的理解。

4. 配套资源:为了帮助学习者更好地掌握课程内容,该课程提供了丰富的配套资源,包括教学文档、示例代码、实验指导和参考资料等。学习者可以根据自己的学习进度和需求,灵活地利用这些资源进行学习和实践。

无论你是计算机科学专业的学生、软件工程师还是对Linux内核开发感兴趣的爱好者,Linux内核开发入门课程都将为你提供一个扎实的学习平台,帮助你掌握Linux内核开发的基础知识,为进一步深入研究和应用Linux内核打下坚实的基础。

这一讲主要讲述如何开发第一个Linux块设备程序模块,动手开发代码,运行加载卸载模块,由于块设备比字符设备来说,复杂不少。

1.开发原则创建步骤

要开发一个块设备,需要遵循以下步骤:

1. 创建块设备结构。块设备结构包含有关块设备的信息,例如其大小、扇区大小和操作函数。
2. 注册块设备。使用 `register_blkdev` 函数注册块设备。这将使内核能够识别该设备。
3. 实现块设备操作函数。块设备操作函数用于执行各种操作,例如读写数据、获取设备状态以及处理请求。
4. 创建块设备文件。块设备文件是一个特殊文件,允许用户空间程序访问块设备。

块设备驱动程序,比起字符设备模块来说比较复杂。目前能运行的程序,可以参考:https://github.com/CodeImp/sblkdev
来进行学习。这个项目在我的环境


peach@peach-VirtualBox:~/BlockWorld$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.6 LTS
Release:        20.04
Codename:       focal
peach@peach-VirtualBox:~/BlockWorld$ uname -r
5.15.0-105-generic

中可以编译通过,最后生成 sblkdev 块设备模块。代码支持 Linux 5.10~Linux 6.0 版本内核,是一个不错的学习资料。网络上其他资源都是基于老版本的内核,由于内核更新变化块,老的版本很难编译通过。


2. 编译并加载模块
cd /home/peach/BlockWorld
sh mk.sh build

3.安装模块
sudo insmod sblkdev.ko

4.检查模块是否加载成功
peach@peach-VirtualBox:~/BlockWorld$ lsmod |grep sblk
sblkdev                20480  0
5.通过设备名称查看
peach@peach-VirtualBox:~/BlockWorld$ cat /proc/devices |grep sblkde
252 sblkdev
6. 创建一个块设备文件
mkdir -p /lib/modules/$(uname -r)/kernel/drivers/block
cp sblkdev.ko /lib/modules/$(uname -r)/kernel/drivers/block
depmod 

depmod 是一个重要的实用程序,可帮助内核管理模块依赖性。它确保在加载特定模块时加载必要的模块,并确保按正确的顺序加载模块

7. 查看块设备
peach@peach-VirtualBox:~/BlockWorld$ lsblk
NAME     MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0      7:0    0     4K  1 loop /snap/bare/5
loop1      7:1    0  63.3M  1 loop /snap/core20/1828
loop2      7:2    0  63.9M  1 loop /snap/core20/2105
loop3      7:3    0  74.1M  1 loop /snap/core22/1033
loop4      7:4    0 346.3M  1 loop /snap/gnome-3-38-2004/119
loop5      7:5    0  74.2M  1 loop /snap/core22/1122
loop6      7:6    0 349.7M  1 loop /snap/gnome-3-38-2004/143
loop7      7:7    0   497M  1 loop /snap/gnome-42-2204/141
loop8      7:8    0  91.7M  1 loop /snap/gtk-common-themes/1535
loop9      7:9    0    46M  1 loop /snap/snap-store/638
loop10     7:10   0  12.3M  1 loop /snap/snap-store/959
loop11     7:11   0  40.4M  1 loop /snap/snapd/20671
loop12     7:12   0  49.9M  1 loop /snap/snapd/18357
sda        8:0    0    25G  0 disk
├─sda1     8:1    0   512M  0 part /boot/efi
├─sda2     8:2    0     1K  0 part
└─sda5     8:5    0  24.5G  0 part /
sr0       11:0    1  1024M  0 rom
sblkdev1 252:0    0     1M  0 disk
sblkdev2 252:1    0     2M  0 disk

发现最后两个sblkdev1, sblkdev2块设备就是我们刚才测试安装的。

8.模块卸载
$ sudo modprobe -r sblkdev

再次查看模块是否存在,发现后面两个设备卸载掉了


peach@peach-VirtualBox:~/BlockWorld$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0    7:0    0     4K  1 loop /snap/bare/5
loop1    7:1    0  63.3M  1 loop /snap/core20/1828
loop2    7:2    0  63.9M  1 loop /snap/core20/2105
loop3    7:3    0  74.1M  1 loop /snap/core22/1033
loop4    7:4    0 346.3M  1 loop /snap/gnome-3-38-2004/119
loop5    7:5    0  74.2M  1 loop /snap/core22/1122
loop6    7:6    0 349.7M  1 loop /snap/gnome-3-38-2004/143
loop7    7:7    0   497M  1 loop /snap/gnome-42-2204/141
loop8    7:8    0  91.7M  1 loop /snap/gtk-common-themes/1535
loop9    7:9    0    46M  1 loop /snap/snap-store/638
loop10   7:10   0  12.3M  1 loop /snap/snap-store/959
loop11   7:11   0  40.4M  1 loop /snap/snapd/20671
loop12   7:12   0  49.9M  1 loop /snap/snapd/18357
sda      8:0    0    25G  0 disk
├─sda1   8:1    0   512M  0 part /boot/efi
├─sda2   8:2    0     1K  0 part
└─sda5   8:5    0  24.5G  0 part /
sr0     11:0    1  1024M  0 rom
9.总结

当前块设备已经创建好,后面进行深入分析及实验。当前linux 内核变化更新块,很有可能此代码在未来的内核版本模块里面就会编译失败,如果你遇到编译失败,可以尝试使用本文里面的Linux版本。

10.参考

Linux block device driver – Oleg Kutkov personal blog

https://github.com/CodeImp/sblkdev 

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

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

相关文章

Qt-饼图示范

1.效果图 2.代码如下 2.1 .h文件 #ifndef PIECHARTWIDGET_H #define PIECHARTWIDGET_H#include <QWidget> #include <QChartView> #include <QPieSeries>#include<QVBoxLayout> #include<QMessageBox> #include <QtCharts>struct PieDat…

电子印章盖骑缝章

电子印章盖骑缝章是指在电子文档&#xff08;如PDF文件&#xff09;中&#xff0c;使用电子印章技术&#xff0c;为文档添加一个跨越多页、连续显示的电子印章图像&#xff0c;以模拟传统纸质文档上的骑缝章效果。以下是实现电子印章盖骑缝章的步骤&#xff1a; 一. 准备电子印…

linux休眠唤醒流程,及示例分析

休眠流程 应用层通过echo mem > /sys/power/state写入休眠状态&#xff0c;给一张大概流程图 这个操作对应在kernel/power/main.c的state这个attr的store操作 static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,const char *buf, size_t n) …

Linux - Docker 安装 Nacos

拉取 Nacos 镜像 使用以下命令从 Docker Hub 拉取最新版本的 Nacos 镜像&#xff1a; docker pull nacos/nacos-server启动 Nacos 容器 使用以下命令启动 Nacos 容器&#xff1a; docker run -d \--name nacos \--privileged \--cgroupns host \--env JVM_XMX256m \--env M…

【Harmony3.1/4.0】笔记三

概念 网格布局是由“行”和“列”分割的单元格所组成&#xff0c;通过指定“项目”所在的单元格做出各种各样的布局。网格布局具有较强的页面均分能力&#xff0c;子组件占比控制能力&#xff0c;是一种重要自适应布局&#xff0c;其使用场景有九宫格图片展示、日历、计算器等…

Vue2 —— 学习(十)

一、vue-resource 库 了解即可 在之前的 vue 版本中经常使用 这个库发送 ajax 请求 现在建议使用 axios 我们可以通过使用 vue-resource 库 来实现发送 ajax 请求 它是 vue 的一个插件库 Vue.use() 就能使用我们的插件了 我们引入后去 我们的实例对象 vc 中查看 发现出现…

设计模式之访问者模式(下)

3&#xff09;访问者模式与组合模式联用 1.概述 在访问者模式中&#xff0c;包含一个用于存储元素对象集合的对象结构&#xff0c;可以使用迭代器来遍历对象结构&#xff0c;同时具体元素之间可以存在整体与部分关系&#xff0c;有些元素作为容器对象&#xff0c;有些元素作为…

2024年小程序视频下载教程

现在已经是2024年&#xff0c;还是有很多人不知道如何下载小程序视频&#xff0c;这里就教大家如何下载小程序视频&#xff0c;一共有3种方法 1.录屏 2.利用抓包工具(Fiddler&Charles) 3.利用专门的下载资源工具(下载高手) 我介绍其中的第3种方法 工具我已经打包好了 …

【Linux学习】Linux调试器-gdb使用

这里写目录标题 &#x1f302;背景&#x1f302;gdb使用&#x1f302;指令总结&#xff1a; &#x1f302;背景 程序的发布方式有两种&#xff0c;debug模式和 release模式 其中&#xff0c;debug模式是可以被调试的&#xff0c;到那时release模式是不能被调试的&#xff1b; …

股东减持,营收“四连降”,三只松鼠用什么撑起“百亿”野心?

近日&#xff0c;国内零食品牌三只松鼠&#xff08;SZ:300783&#xff09;发布了2023年业绩报告。从规模效益的层面出发&#xff0c;三只松鼠在高端化和高性价比逻辑下对门店进行了集中优化&#xff0c;虽然营收略有下降&#xff0c;但利润端却实现了强势回暖。 不过&#xff…

表达式求值(后缀表达式)(数据结构)

一、概念 算术表达式是由操作数&#xff08;运算数&#xff09;、运算符&#xff08;操作符&#xff09;、和界线符&#xff08;括号&#xff09;三部分组成&#xff0c;在计算机中进行算术表达式的计算是通过堆栈来实现的。 二后缀表达式的逻辑和实现方式&#xff08;逆波兰…

4*5的矩阵(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i 0;int j 0;int result 0;//嵌套循环输出&#xff1b;for (i 1; i < 4; i){//列…

冯喜运:4.22黄金蒋继续“消化超买“,原油回落,通胀担忧缓解?

【 黄金消息面解析】&#xff1a;上周五(4月19日)伊朗媒体似乎淡化了以色列袭击的影响&#xff0c;表明地缘政治风险降低&#xff0c;导致避险资产需求放缓&#xff0c;金价回吐涨幅。上周现货黄金价格上涨超2%。美国黄金期货收盘上涨0.7%&#xff0c;至2413.8美元。从长期来看…

前端开发攻略---合并表格单元格,表格内嵌套表格实现手风琴效果。

1、演示 2、思路 1、用传统的 <table></table> 表格标签来实现比较麻烦。因此通过模拟 表格标签 的写法用<div></div>来实现 2、表头和表格列数是相同的&#xff0c;因此可以确定代码结构 <div class"table"><div class"head…

【Linux 进程间通信】管道(三)

文章目录 1.管道的五种特征2.管道的四种情况 1.管道的五种特征 ①&#x1f34e;匿名管道只能用于有血缘关系的进程之间进行通信&#xff08;爷孙进程之间可以进行通信&#xff09;&#xff0c;常用于父子之间进行通信&#xff1b; ②&#x1f34e;管道内部&#xff0c;自带进…

Mysql的【存储引擎】之【InnoDB】与【MyISAM】的区别

目录 1.存储引擎在 MyISAM 和 InnoDB 有什么区别 2.Mysql 5.7 默认的存储引擎是什么 3.一个简单例子&#xff08;如果非要使用【MyISAM】存储引擎 &#xff09; 4.2009年写的留言板程序的数据&#xff08;存储引擎是&#xff1a;【MyISAM】&#xff09; 5.mysql 8.0 可以使…

【简单讲解下如何用爬虫玩转石墨文档】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

UV胶水能够粘接丙烯腈-丁二烯-苯乙烯共聚物ABS吗?

UV胶水能够粘接丙烯腈-丁二烯-苯乙烯共聚物ABS吗&#xff1f; UV胶水通常能够用于粘接丙烯腈-丁二烯-苯乙烯共聚物&#xff08;ABS&#xff09;。UV胶水的优势之一是其适用于多种材料的粘接&#xff0c;包括ABS。然而&#xff0c;成功的粘接还取决于一些因素&#xff0c;包括表…

ActiveMQ 如果数据处理出现异常会怎么样

我们有一个 Spring 的客户端&#xff0c;在处理消息的时候因为程序的原因出现消息处理异常。 对这种情况&#xff0c;ActiveMQ 会把出现异常的消息放在 DLQ 队列中进行持久化。 因此&#xff0c;在 ActiveMQ 消息处理队列中需要持续关注 DLQ 队列&#xff0c; DLQ 的队列都是无…

记录好用的python包

记录好用的python包 PipxCentos 安装pipx确保 Pip 被安装更新 Pip安装 Pipx添加 Pipx 到 PATH临时添加到 PATH:永久添加到 PATH: 验证 Pipx 安装 Hatch安装特性 Poetry安装准备工作创建虚拟环境激活虚拟环境安装包追踪 & 更新包常用配置pycharm 远程连接poetry创建的虚拟环…