1、基础版本
#include <linux/init.h> ///这两个为内核编译必备头文件 #include <linux/module.h> #include "helloworld.h" MODULE_LICENSE("GPL"); ///module证书? static int hello_init(void) ///加载ko,insmod { printk("999 Hello, world\n"); return 0; } static void hello_exit(void) ///卸载ko,rmmod { printk("Goodbye, cruel world\n"); } module_init(hello_init); ///每个ko文件的最后都必须有module_init和module_exit module_exit(hello_exit); MODULE_LICENSE("GPL V2");
2、稍微多几个-MODULE_*
此时这个ko还是独立的,不依赖与别的module。
#include<linux/init.h> #include<linux/module.h> static int sum = 100; static int __init hello_init(void) { printk("hello world ,nihao\n"); printk("param sum = %d\n",sum); return 0; } static void __exit hello_exit(void) { printk("hello world,baibai\n"); } module_init(hello_init); module_exit(hello_exit); module_param(sum,int,S_IRUGO); MODULE_LICENSE("GPL V2"); MODULE_AUTHOR("WANG LONGHUI"); MODULE_DESCRIPTION("A SIMPLE EXAMPLE KO"); MODULE_ALIAS("HAHA");
3、依赖于别的ko
#include <linux/init.h> ///这两个为内核编译必备头文件 #include <linux/module.h> #include "helloworld.h" MODULE_LICENSE("GPL"); ///module证书? static int hello_init(void) ///加载ko,insmod { printk("999 Hello, world\n"); test_world(); return 0; } static void hello_exit(void) ///卸载ko,rmmod { printk("Goodbye, cruel world\n"); } module_init(hello_init); ///每个ko文件的最后都必须有module_init和module_exit module_exit(hello_exit); MODULE_LICENSE("GPL V2");
观察一下这个ko的源码文件,发现里面有个test_world()。
如果我们直接编译这个.ko,那么会发现运行不起来。会提示你fail to load,no such file。
编译的时候也会提示你warning 没有这个符号test_world()。
这是因为你编译的这个ko安装到内核的时候,运行的时候它会去内核的符号表中查找,但是你这个test_world没有编译进内核源码。所以你安装ko的这个kernel镜像得重新构建一版,当然你也可以使用kinux已经有的符号。(当然你聪明的小脑袋肯定知道了,那我是不是可以在ko的编译文件里面加上这个test_world的源码文件,是的,可以的哦)
world.c
#include <linux/kernel.h> void test_world(void){ printk("world---\n"); }
编译文件
obj-m :=start.o start-objs := hello.o world.o LINUX_KERNEL := $(shell uname -r) LINUX_KERNEL_PATH :=/usr/src/linux-headers-${LINUX_KERNEL}/ PWD :=$(shell pwd) modules : $(MAKE) -C $(LINUX_KERNEL_PATH) M=$(PWD) modules .PHONEY:clean clean : rm -f *.o *.ko *.mod.c
宗旨就一个: 你这个ko里面调用的函数,归根jiedi就是一个符号,你要确定这个符号有。
(因为这个问题难过了很久,定位问题的手段太单一~~~~~~)
其他的东西边用边再补充吧啦啦啦!!!