/*
name:全局变量名
type:
使用符号 实际类型 传参方式
bool bool insmod xxx.ko 变量名=0 或 1
invbool bool insmod xxx.ko 变量名=0 或 1
charp char * insmod xxx.ko 变量名="字符串内容"
short short insmod xxx.ko 变量名=数值
int int insmod xxx.ko 变量名=数值
long long insmod xxx.ko 变量名=数值
ushort unsigned short insmod xxx.ko 变量名=数值
uint unsigned int insmod xxx.ko 变量名=数值
ulong unsigned long insmod xxx.ko 变量名=数值
perm:给对应文件 /sys/module/name/parameters/变量名 指定操作权限(一般为0664)
#define S_IRWXU 00700
#define S_IRUSR 00400
#define S_IWUSR 00200
#define S_IXUSR 00100
#define S_IRWXG 00070
#define S_IRGRP 00040
#define S_IWGRP 00020
#define S_IXGRP 00010
#define S_IRWXO 00007
#define S_IROTH 00004
#define S_IWOTH 00002 //不要用 编译出错
#define S_IXOTH 00001
*/
/*
name、type、perm同module_param,type指数组中元素的类型
&num:存放数组大小变量的地址,可以填NULL(确保传参个数不越界)
传参方式 insmod xxx.ko 数组名=元素值0,元素值1,...元素值num-1
*/
dmesg
MODULE_PARM_DESC(变量名,字符串常量);
字符串常量的内容用来描述对应参数的作用
modinfo
可查看这些参数的描述信息
模块的代码与其他内核代码公用统一的运行环境,也就是模块是在存在形式上独立,运行上其实和其他内核模块是一个整体,属于同一个程序。因此一个模块或者内核其他部分源码可以使用另一个模块的全局特性。
一个模块中可以被其他地方使用的名称被称为导出符号,所有的导出符号被填在同一个表中,这个表被称为符号表
最常用的可导出全局特性为全局变量和函数
查看符号表的命令:nm
nm
查看elf格式的可执行文件或目标文件包含的符号表,用法:nm 文件名两个用于导出模块中符号名称的宏:
使用导出符号的地方,需要对这些符号进行extern声明后才能使用这些符号
B模块使用了A模块导出的符号,此时称B模块依赖于A模块,则:
为了彻底解决一个应用程序出错不影响系统和其他app运行,操作系统给每个app分配了一个独立的假象地址空间,这个假象的空间被称为虚拟地址空间(也叫逻辑地址),操作系统也占用其中的一部分。32为Linux的虚拟地址空间大小为4G,并将其划分为两部分:
实际内存操作时,需要将虚拟地址映射到实际内存的物理地址,然后才能进行实际的内存读写
执行流:有开始有结束总体顺序执行的一段独立代码,又被称为代码上下文
执行流分类:
应用编程可能涉及到的执行流:
内核编程可能涉及到的执行流:
不同点 | 内核模块 | 应用程序 |
---|---|---|
API来源 | 不能使用任何库函数 | 各种库函数均可以使用 |
运行空间 | 内核空间 | 用户空间 |
运行权限 | 特权模式运行 | 非特权模式运行 |
编译方式 | 静态编译进内核镜像或编译特殊的ko文件 | elf格式的应用程序可执行文件 |
运行方式 | 模块中的函数在需要时被动调用 | 从main开始顺序执行 |
入口函数 | init_module | main |
退出方式 | cleanup_module | main函数返回或调用exit |
浮点支持 | 一般不涉及浮点运算,因此printk不支持浮点数据 | 支持浮点运算,printf可以打印浮点数据 |
并发考虑 | 需要考虑多种执行流并发的竞态情况 | 只需考虑多任务并行的竞态 |
程序出错 | 可能会导致整个系统崩溃 | 只会让自己崩溃 |