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