课堂笔记
-
源代码
/*file: hello.c*/ #ifndef _KERNEL_ #define _KERNEL_ #endif #ifndef MODULE #define MODULE #endif #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> static hello_init(void); //需要添加额外的函数申明 void hello_exit(void); //_init and _exit is the special macro static int hello_init(void){ //去掉了函数名前的_init printk("Hello, world! "); return 0; } void hello_exit(void){ //去掉了函数名前的_exit,否则编译无法完成 printk("Good bye, world! "); return 0; } module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE("GPL"); // 开源协议许可
注:
- printk与printf类似,但是是运行在内核态,打印的日志文件在/var/log/messages
-
编写Makefile文件并运行
obj-m += hello.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
注:
-
必须用该操作编译,否则会出现找不到asm/linkage.h的错误
-
如果/lib/modules/3.10.0-514.26.2.el7.x86_64目录下的build文件为红色,则执行以下操作
rm -f build #删除build文件 ln -s /usr/src/kernels/3.10.0-1160.11.1.el7.x86_64/ ./build #新建build文件并建立软链接
make构建的文件
-
-
尝试添加和移除模块
insmod hello.ko rmmod hello.ko
如果执行成功,可以在/var/log/messages下查看是否有对应的日志打印
注:
- printk与printf类似,但是是运行在内核态,打印的日志文件在/var/log/messages
-
编写Makefile文件并运行
obj-m += hello.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
注:
-
必须用该操作编译,否则会出现找不到asm/linkage.h的错误
-
如果/lib/modules/3.10.0-514.26.2.el7.x86_64目录下的build文件为红色,则执行以下操作
rm -f build #删除build文件 ln -s /usr/src/kernels/3.10.0-1160.11.1.el7.x86_64/ ./build #新建build文件并建立软链接
make构建的文件
-
-
尝试添加和移除模块
insmod hello.ko rmmod hello.ko
如果执行成功,可以在/var/log/messages下查看是否有对应的日志打印