内核模块编程之入门(二)—必备知识

article/2025/9/24 5:59:07

模块编程属于内核编程,因此,除了对内核相关知识有所了解外,还需要了解与模块相关的知识。

1.应用程序与内核模块的比较

为了加深对内核模块的了解,表一给出应用程序与内核模块程序的比较。
表一 应用程序与内核模块程序的比较
在这里插入图片描述

从表一我们可以看出,内核模块程序不能调用libc库中的函数,它运行在内核空间,且只有超级用户可以对其运行。另外,模块程序必须通过module_init()和module-exit()函数来告诉内核“我来了”和“我走了”。

2.内核符号表

如之前所述,Linux内核是一个整体结构,像一个圆球,而模块是插入到内核中的插件。尽管内核不是一个可安装模块,但为了方便起见,Linux把内核也看作 一个“母”模块。
那么模块与模块之间如何进行交互呢?

一种常用的方法就是共享变量和函数

但并不是模块中的每个变量和函数都能被共享,内核只把各个模块中 主要的变量和函数放在一个特定的区段,这些变量和函数就统称为符号。到底哪些符号可以被共享? Linux内核有自己的规定。对于内核这个特殊的母模块,在kernel/ksyms.c中定义了从中可以“移出”的符号,例如进程管理子系统可以“移出”的符号定义如下:
/* 进程管理 */
EXPORT_SYMBOL(do_mmap_pgoff);
EXPORT_SYMBOL(do_munmap);
EXPORT_SYMBOL(do_brk);
EXPORT_SYMBOL(exit_mm);

EXPORT_SYMBOL(schedule);
EXPORT_SYMBOL(jiffies);
EXPORT_SYMBOL(xtime);


你可能对这些变量和函数已经很熟悉。其中宏定义EXPORT_SYMBOL()本身的含义是“移出符号”。为什么说是“移出”呢?因为这些符号本来是内核内部的符号,通过这个宏放在一个公开的地方,使得装入到内核中的其他模块可以引用它们。
实际上,仅仅知道这些符号的名字是不够的,还得知道它们在内核地址空间中的地址才有意义。因此,内核中定义了如下结构来描述模块的符号:
struct module_symbol
{
unsigned long value; /符号在内核地址空间中的地址/
const char *name; /符号名/
};
我们可以从/proc/ksyms文件中读取所有内核模块“移出”的符号,这所有符号就形成内核符号表,其格式如下:
内存地址 符号名 [所属模块]
在模块编程中,可以根据符号名从这个文件中检索出其对应的地址,然后直接访问该地址从而获得内核数据。第三列“所属模块”指符号所在的模块名,对于从内核这一母模块移出的符号,这一列为空。
模块加载后,2.4内核下可通过 /proc/ksyms、 2.6 内核下可通过/proc/kallsyms查看模块输出的内核符号

3.模块依赖

如前所述,内核符号表记录了所有模块可以访问的符号及相应的地址

当一个新的模块被装入内核后,它所声明的某些符号就会被登记到这个表(内核符号表)中,而这些符号可能被其他模块所引用,这就引出了模块依赖这个问题。

一个模块A引用另一个模块B所移出的符号,我们就说模块B被模块A引用,或者说模块A依赖模块B。如果要链接模块A,必须先链接模块B。这种模块间相互依赖的关系就叫模块依赖。

4.模块引用计数器

为了确保模块安全地卸载,每个模块都有一个引用计数器。

当执行模块所涉及操作时就递增计数器,在操作结束时就递减这个计数器;另外,当模块B被模块A引用时,模块B的引用计数就递增引用结束,计数器递减
什么时候可以卸载这个模块?当然只有这个计数器值为0的时候
例如,当一个文件系统还被安装在系统上 时就不能将其卸载,当这个文件系统不再被使用时,引用计数器就为0,于是可以卸载。

5 .模块编译

Linux 中最重要的软件开发工具是 GCC。
GCC 是 GNU 的 C 和 C++ 编译器。但是,在大型的开发项目中,通常有几十到上百个的源文件,如果每次均手工键入 gcc 命令进行编译的话,则会非常不方便。因此,人们通常利用make 工具来自动完成编译工作。利用这种自动编译可大大简化开发工作,避免不必要的重新编译。这些工作包括:如果仅修改了某几个源文件,则只重新编译这几个源文件;如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。
编译工具make
实际上,make 工具通过一个称为 Makefile 的文件来完成并自动维护编译工作。Makefile 需要按照某种语法进行编写,其中说明了如何编译各个源文件并连接生成可执行文件,并定义了源文件之间的依赖关系。下面给出2.6 内核模块的Makefile模板(请参看Makefile的写法)

Makefile2.6

obj-m += hellomod.o # 产生hellomod 模块的目标文件
CURRENT_PATH := $(shell pwd) #模块所在的当前路径
LINUX_KERNEL := KaTeX parse error: Expected 'EOF', got '#' at position 21: …l uname -r) #̲Linux内核源代码的当前版本…(LINUX_KERNEL) #Linux内核源代码的绝对路径
all:
make -C ( L I N U X K E R N E L P A T H ) M = (LINUX_KERNEL_PATH) M= (LINUXKERNELPATH)M=(CURRENT_PATH) modules #编译模块了
clean:
make -C ( L I N U X K E R N E L P A T H ) M = (LINUX_KERNEL_PATH) M= (LINUXKERNELPATH)M=(CURRENT_PATH) clean #清理
注意: 在每个命令前(例如make命令前)要键入一个制表符(按TAB键产生),在这里编者要啰嗦一句,一般第一次写的makefile会有一车的错误,下面贴上一篇总结了常见的错误的文章,希望能帮助到你。http://blog.csdn.net/sium__/article/details/48594871
有了Makefile,执行make命令,会自动形成相关的后缀为.o和.ko文件。
到此,模块编译好了,该把它插入到内核了:
如:$insmod hellomod.ko
当然,要以系统员的身份才能把模块插入。
成功插入后,可以通过dmesg命令查看,屏幕最后几行的输出就是你程序中输出的内容:Hello,World! from the kernel space…

当模块不再需要时,可以通过rmmod命令移去,例如
$rmmod hellomod


http://chatgpt.dhexx.cn/article/NVsf8Yud.shtml

相关文章

操作系统实验:Linux内核模块编程

实验内容 (1)设计一个模块,要求列出系统中所有内核线程的程序名、PID、进程状态、进程优先级、父进程的PID。 (2)设计一个带参数的模块,其参数为某个进程的PID号,模块的功能是列出该进程的家族…

HC12微控制器上的闪存内核编程

HC12微控制器上的闪存内核编程 作者 Sven Deckardt 限制 草案文件 摘要 本应用笔记的目的是解释如何为HC12实现CCP闪存内核以及如何为闪存编程配置CANape Graph。 目录 1.0概述... 1 闪存内核的一般用法... 1 2.0 Flash内核... 3 2.1结构... 3 2.2 …

Linux内核模块编程入门( 最简单的内核模块编程)

第1章简介 什么是内核模块? 所以,你想编写一个内核模块。 你知道C,你已经编写了一些正常的程序作为进程运行,现在你想要到达实际操作的位置,一个狂野指针可以消灭你的文件系统,核心转储意味着重启。 什么…

Linux内核模块编程

Linux内核模块编程 (作者:Baron_wu 禁止转载) 首先,创建一个内核模块并插入Linux内核中。这是实验第一部分 首先查看当前内核模块使用情概况:lsmod Module:模块名 Size:模块大小 Used by:这些模块在哪被使…

Linux内核网络编程

netfilter 内核网络编程 网络协议数据结构inet_protosw 在Linux-2.6.26.3/net/ipv4/af_inet.c文件中有一个名为inet_init()的函数对协议进行了初始化。inet_init()函数使用proto_register()函数来注册每个内嵌协议。 软中断CPU报文队列及其处理 Linux内核网络协议层的层间…

Linux学习之内核模块编程

前言 之前成功编译了内核,这次学习如何修改增加删除内核模块,为了保证内核的纯净,我特意重新编译安装了一个新的5.11.8的内核,其他内核同理。 本文原创,创作不易,转载请注明!!&…

MATLAB脚本调用simulink仿真文件及simulink模块参数修改-load_system函数-sim函数-set_param函数

文章目录 1. load_system2. sim3. set_param4. get_param5. 应用 1. load_system 加载系统,添加所需要加载的simulink仿真模型所在的路径和名称。 load_system(pathname\filename);必须加载系统之后才可以完成后续的运行simulink仿真模型和获取仿真模型参数和设置…

Matlab学习笔记3——str2num

Matlab学习笔记3——str2num Convert character array or string to numeric array 将字符数组或字符串转换为数字数组 语法 X str2num(chr) [X,tf] str2num(chr) 输出 X — 输出数组 数字矩阵 输出数组,以数字矩阵形式返回。 tf — 真或假 1 |0 真或假结果…

strlen,strcpy,strcat,strcmp函数

1.strlen函数 strlen函数的作用是计算给定字符串的长度,从内存的某个位置开始,遇到第一个\0结束。 使用样例: int main() {const char *ar "abcdef";printf("%d\n", strlen(ar)); } 返回字符串"abcdef"的…

MATLAB str char cell num格式互相转换

简介 关于如何str char cell num格式互相转换的例子很多,但是都很单一,有时候使用的时候需要查找很久才可以解决问题。这里就对这几种方法进行一个汇总。 之所以会涉及使用cell,是因为涉及字符串、数字在同一个“矩阵”中,这时候…

C++ std::string::substr()

substr()函数返回一个新建的 初始化为string对象的子串的拷贝string对象。 子串是,在字符位置_Off开始,跨越_Count个字符(或直到字符串的结尾)对象的部分 void main() {//std::string::substr(_Off 0, _Count 4294967295U)&am…

matlab中 str2num 函数与 str2double 函数的区别

str2num 函数与 str2double 函数的相同点与不同点 1. 相同点: 当str为一个含数字的字符串时, str2num 函数与 str2double 函数一样。 如: 2. 不同点:当str为多个字符串构成的数组时, str2num 函数与 str2double 函数有…

可逆计算:下一代软件构造理论

可逆计算:下一代软件构造理论 众所周知,计算机科学得以存在的基石是两个基本理论:图灵于1936年提出的图灵机理论和丘奇同年早期发表的Lambda演算理论。这两个理论奠定了所谓通用计算(Universal Computation)的概念基础…

android 微积分计算器,不到1M的良心之作 连微积分都能算的计算器APP

计算器可谓是被手机取代的一大电子产品了,不过手机上的APP是否真的有传统的计算器好用?也并不一定。 一来,手机上的计算器APP功能普遍偏弱,特别是手机ROM自带的计算器;二来,计算器APP也算得上是流氓软件的重…

matlab对信号积分,对信号求积分 - Simulink - MathWorks 中国

说明 Integrator 模块输出其输入信号相对于时间的积分值。 Simulink 将 Integrator 模块作为具有一种状态的动态系统进行处理。模块动态由以下方程指定: {x˙(t)=u(t)y(t)=x(t)x(t0)=x0 ,其中: u 是模块输入。 y 是模块输出。 x 是模块状态。 x0 是 x 的初始条件。 虽然这些…

清华大学计算机学复变函数吗,清华大学计算机系课程 - osc_vq6lx46c的个人空间 - OSCHINA - 中文开源技术交流社区...

这么NB的大学,这么NB的课程,我们还有何理由不努力,同是大学生,人家在学校学的本身就比我们多,还需要更加努力才能跟上步伐,加油。 补充: 清华大学计算机系的课程分为六类课程: (一)公…

Chapter2.4:复数和复变函数运算

该系列博客主要讲述Matlab软件在自动控制方面的应用,如无自动控制理论基础,请先学习自动控制系列博文,该系列博客不再详细讲解自动控制理论知识。 自动控制理论基础相关链接:https://blog.csdn.net/qq_39032096/category_10287468…

信号与系统分析中的复变函数

动态图片来自于: ShutterStock 网站 . 01 教程规划 1.1 背景介绍 针对于信号与系统分析 课程学习的同学,由于之前没有先修过课程复变函数 ,则会在后面信号与系统理论学习中缺少复变函数相关理论支持。为了帮助这部分同学及时补充上复变函数相…

matlab复变函数应用,matlab在复变函数中的一些应用修改后的.doc

matlab在复变函数中的一些应用修改后的.doc MATLAB语言课程论文MATLAB在复变函数中的一些应用姓名刘乐学号12013241953专业通信工程班级2013级通信2班指导老师朱瑜红学院物理电气性息学院完成日期2013年11月9日MATLAB在复变函数中的一些应用刘乐120132419532013级通信2班【摘要…