《精通Linux设备驱动程序开发》——1.8 可加载的模块

简介: 内核模块减小了内核的大小,并缩短了开发——编译——测试的周期。为了让一次修改生效,你仅仅需要重新编译特定的模块并重新加载它。在第21章中,我们将学习模块调试技术。

本节书摘来自异步社区《精通Linux设备驱动程序开发》一书中的第1章,第1.8节,作者:【印】Sreekrishnan Venkateswaran(斯里克里斯汉 温卡特斯瓦兰)著,更多章节内容可以访问云栖社区“异步社区”公众号查看
###1.8 可加载的模块
由于Linux可运行于各种各样的体系架构中,并且支持无数的I/O设备,把所有要支持的设备都直接编译进内核并不合适。发行版通常包含一个最小的内核映像,而以内核模块的形式提供其他的功能。在运行的时候,可以动态地按需加载模块。 为了生成模块,进入内核源码树根目录并运行:

bash> cd /usr/src/linux-X.Y.Z/
bash> make modules

运行如下命令安装编译生成的模块:

bash> make modules_install
此命令将在/lib/modules/X.Y.Z/kernel/目录下构造一个内核源代码目录结构,并将可加载的模块放入其中。它也将激活depmod实用程序,以便生成模块依赖文件/lib/modules/X.Y.Z/modules.dep。

如下工具可用于操纵模块:insmod、rmmod、lsmod、modprobe、modinfo和depmod。前两个工具用于加载和移除模块,lsmod用于列出目前已经加载的模块,modprobe是insmod的一个更智能的版本,它先分析/lib/modules/X.Y.Z/modules.dep文件再加载它所依赖的模块。例如,假定你需要挂载一个USB笔式驱动器上的VFAT(Virtual File Allocation Table,虚拟文件分配表)分区,可使用modprobe加载VFAT文件系统驱动程序[4]:

bash> modprobe vfat
bash> lsmod
Module    Size   Used by
vfat     14208  0
fat     49052  1 vfat
nls_base   9728   2 vfat, fat

从lsmod命令的输出可以看出,modprobe加载了3个而不仅仅是1个模块。modprobe首先发现它不得不加载/lib/modules/X.Y.Z/kernel/fs/vfat/vfat.ko,当查看/lib/modules/X.Y.Z/modules.dep模块依赖文件的时候,它发现了如下代码并由此意识到自己必须首先加载另外2个模块:

/lib/modules/X.Y.Z/kernel/fs/vfat/vfat.ko:
/lib/modules/X.Y.Z/kernel/fs/fat/fat.ko
/lib/modules/X.Y.Z/kernel/fs/nls/nls_base.ko

于是它首先加载了fat.ko和nls_base.ko这2个模块,之后加载vfat.ko,这样,所有挂载VFAT分区时所需要的模块都被自动加载了。

使用modinfo程序可以提取刚加载的模块的详细信息:

bash> modinfo vfat
filename:   /lib/modules/X.Y.Z/kernel/fs/vfat/vfat.ko
license:    GPL
description:  VFAT filesystem support
...
depends:    fat, nls_base

为了将内核驱动程序编译为模块,在配置内核的时候,请将相应的菜单选择按钮置为。本书中的大部分设备驱动程序例子都以内核模块的形式实现。为了从mymodule.c源文件构造mymodule.o模块,可以创建一个一行的Makefile文件,并且以如下方式执行它:

bash> cd /path/to/module-source/
bash> echo "obj-m += mymodule.ko" > Makefile
bash> make –C /path/to/kernel-sources/ M=`pwd` modules
make: Entering directory '/path/to/kernel-sources'
 Building modules, stage 2.
 MODPOST
 CC /path/to/module-sources/mymodule.mod.o
 LD [M] /path/to/module-sources/mymodule.ko
make: Leaving directory '/path/to/kernel-sources'
bash> insmod ./mymodule.ko

内核模块减小了内核的大小,并缩短了开发——编译——测试的周期。为了让一次修改生效,你仅仅需要重新编译特定的模块并重新加载它。在第21章中,我们将学习模块调试技术。

将驱动程序设计为内核模块也有一些缺陷。与内建的驱动程序不同,模块无法在系统启动时预留资源,因为首要的是必须保证启动成功。

相关文章
|
7月前
|
Ubuntu 搜索推荐 Linux
详解Ubuntu的strings与grep命令:Linux开发的实用工具。
这就是Ubuntu中的strings和grep命令,透明且强大。我希望你喜欢这个神奇的世界,并能在你的Linux开发旅程上,通过它们找到你的方向。记住,你的电脑是你的舞台,在上面你可以做任何你想做的事,只要你敢于尝试。
378 32
|
9月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
2088 77
|
11月前
|
缓存 安全 Linux
Linux系统查看操作系统版本信息、CPU信息、模块信息
在Linux系统中,常用命令可帮助用户查看操作系统版本、CPU信息和模块信息
2051 23
|
11月前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
573 15
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
451 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
325 1
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
Unix Linux 网络安全
python中连接linux好用的模块paramiko(附带案例)
该文章详细介绍了如何使用Python的Paramiko模块来连接Linux服务器,包括安装配置及通过密码或密钥进行身份验证的示例。
742 1
|
Java Linux API
Linux设备驱动开发详解2
Linux设备驱动开发详解
231 6
|
消息中间件 算法 Unix
Linux设备驱动开发详解1
Linux设备驱动开发详解
264 5
|
存储 Linux 开发工具
如何进行Linux内核开发【ChatGPT】
如何进行Linux内核开发【ChatGPT】