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

本文详细介绍了如何在Linux内核中开发第一个块设备模块,包括创建步骤、编译加载、模块注册、设备文件创建以及模块管理和卸载。通过实际操作演示,为初学者提供了一个实践Linux内核开发的基础教程。
摘要由CSDN通过智能技术生成
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 

  • 29
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值