2 内核模块传参与符号共享

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
* @Author: Fanxiaominghang 2309200691@qq.com
* @Date: 2025-02-06 16:11:36
* @LastEditors: Fanxiaominghang 2309200691@qq.com
* @LastEditTime: 2025-02-06 22:37:29
* @FilePath: /nose/study/hello.c
* @Description:
*/
#include<linux/module.h>
#include<linux/moduleparam.h>

#define CNT 1
static int cnt=CNT;
static char *fff="hi,fmh\n";
static int arr[]={1,2,3,4,5,6};
static int nums=sizeof(arr)/sizeof(int);
/*变量传参数
直接变量=要改的值
sudo insmod hello.ko cnt=3 fff=fuck arr=444,4,5
在sys/module/hello下会有一个parameters文件夹
*/
module_param(cnt,int,S_IRUGO);
module_param(fff,charp,S_IRUGO);
module_param_array(arr,int,&nums,S_IRUGO);

/*符号导出
分着插入
有导出时候,会生成一个Module.symvers文件,可以查看导出符号
也可以在/proc/kallsyms下查看内核符号,但需要过滤
在sys/module/hello下会有一个holders文件夹
*/
EXPORT_SYMBOL(fff);

static int __init hello_init(void){
//printk(KERN_INFO "\n");
printk(KERN_INFO "HELLO\n");
printk(KERN_INFO "%s",fff);
int i;
for ( i = 0; i < cnt; i++)
{
printk(KERN_INFO "%d:%s",i,fff);
}
for ( i = 0; i < 6; i++)
{
printk(KERN_INFO "%d",arr[i]);
}
printk(KERN_INFO "nums:%d\n",nums);
return 0;
}
static void __exit hello_exit(void){
printk(KERN_INFO "BYE\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("fff");
MODULE_DESCRIPTION("A simple Linux module");
MODULE_VERSION("0.1");

/*
安装头文件
fxh@fxh-virtual-machine:~/drive/nose/study$ uname -a
Linux fxh-virtual-machine 5.15.0-130-generic #140~20.04.1-Ubuntu SMP Wed Dec 18 21:35:34 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

fxh@fxh-virtual-machine:~/drive/nose/study$ sudo apt-get install linux-headers-5.15.0-130
[sudo] fxh 的密码:
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
注意,根据正则表达式 'linux-headers-5.15.0-130' 选中了 'linux-headers-5.15.0-130-generic'
linux-headers-5.15.0-130-generic 已经是最新版 (5.15.0-130.140~20.04.1)。
linux-headers-5.15.0-130-generic 已设置为手动安装。
升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 186 个软件包未被升级。
*/

/*
insmod 加载模块
lsmod 查看模块,名字为makefile中的
dmesg 查看内核打印
rmmod 移除模块
*/

/*
由于Linux下皆是文件,所以通过文件系统用户可以直接查看
每加载一个模块就会在sys/module/下生成对应的文件夹
*/