求助求助 red hat linux操作系统实现electron模块加载的指令
发布网友
发布时间:2022-04-14 04:10
我来回答
共2个回答
热心网友
时间:2022-04-14 05:40
内核模块的程序结构
模块加载函数(必须)
当通过insmod或modprobe命令加载内核模块时,模块会自动被内核执行,完成模块的相关初始化工作。
一般以 __init标识声名函数,并且用“mole_init(初始化函数名)”来初始化
模块卸载函数
模块许可证声名
模块参数
模块导出符号
模块作者等信息声名
独立编译Makefile
#makefile for kernel mole
MODNAME=helloworld
ifeq ($(PLATFORM), PC)
KERNELDIR?=/lib/moles/$(shell uname -r)/build
else
KERNELDIR?=你的linux源码编译路径
endif
obj-m := $(MODNAME).o
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) moles
clean:
@rm -rf *.o *.ko *.mod.* *.tmp* mole* Mole*
123456789101112131415
注意ifeq 后面要有个空格
模块测试源码
#include <linux/init.h>
#include <linux/mole.h>
static int __init helloworld_init(void)
{
printk(KERN_DEBUG "My first hello world kernel mole!\n");
return 0;
}
static void __exit helloworld_exit(void)
{
printk(KERN_DEBUG "Bye,cruel world !\n");
}
mole_init(helloworld_init);
mole_exit(helloworld_exit);
1234567891011121314151617
编译
初始化变量 export PLATFORM=PC
编译: make
执行make后得到对应的.ko文件
模块加载及卸载
insmod helloworld.ko
rmmod helloworld
执行加载命令时我们希望打印 My first hello world kernel mole!
卸载时我们希望能打印 Bye,cruel world !
然而实际上什么都没打印,lsmod查看helloworld.ko有成功加载
printk输出
在Linux中,内核打印语句printk()会将内核信息输出到内核信息缓冲区中,内核缓冲区是在
kernel/printk.c中通过如下语句静态定义的:
static char __log_buf[__LOG_BUF_LEN] __aligned(LOG_ALIGN);
1
内核信息缓冲区是一个环形缓冲区(Ring Buffer),因此,如果塞入的消息过多,则就会将之前的消
息冲刷掉。
printk()定义了8个消息级别,分为级别0~7,级别越低(数值越大),消息越不重要,第0级是紧急
事件级,第7级是调试级
通过/proc/sys/kernel/printk文件可以调节printk()的输出等级,该文件有4个数字值:
控制台(一般是串口)日志级别:当前的打印级别,优先级高于该值的消息将被打印至控制台。
默认的消息日志级别:将用该优先级来打印没有优先级前缀的消息,也就是在直接写printk(“xxx”)而不带打印级别的情况下,会使用该打印级别。
最低的控制台日志级别:控制台日志级别可被设置的最小值(一般都是1)。
默认的控制台日志级别:控制台日志级别的默认值。
用户可以通过dmesg命令查看内核打印缓冲区,而如果使用sudo dmesg -c命令,则不仅会显示__log_buf,还会清除该缓冲区的内容。
————————————————
版权声明:本文为CSDN博主「linyplhm」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43777852/java/article/details/101852495