想边学习内核边进行系统的移植,用了两天的时间,在新的优麒麟环境下移植成功Linux整个系统。虽然中间改的东西少,但是这个更深层次的学习,要一步一步来,我现在也很着急,不知道为什么,可能是因为别人考研的考研,实习的实习,好像全世界就我一个人在马上大四的暑假还在学习。但是我还是要送自己一句话:我有一辈子要过,不争今日,只争朝夕。好了打气也打完了,开始新的一天的学习。
模块的安装: insmod
insmod /home/dnw_usb.ko
模块的卸载:rmmod
rmmod dnw_usb.ko
模块的查看:lsmod
lsmod
分析得到:
内核模块分为三个部分:
1.头文件:linux/init.h和linux/module.h
2.加载函数:module_init
3.卸载函数:module_exit
代码编写:
helloword.c
#include<linux/init.h>
#include<linux/module.h>
static int helloword_init()
{
printk(KERN_WARNING"Hello world!\n");
return 0;
}
static void helloword_exit()
{
printk(KERN_WARNING"hello exit!\n");
}
module_init(helloword_init);
module_exit(helloword_exit);
Makefile编写格式:
只有一个源文件的:
obj-m := helloword.o
KDIR :=/内核代码的路径
all:
make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm
这一句的意思中,M=表示模块代码的路径,PWD是当前路径。CROSS_COMPILE这个是指定编译器。ARCH是体系结构。
clean:
rm -f *.o *.ko
多个源文件:
obj-m := helloword.o
helloword-objs := file1.c file2.c ......
以上是内核模块的必选项,之后的是可选项
1.模块申明
MODULE_LICENSE(”遵守的协议”)
申明该模块遵守的许可证协议,如:“GPL“、”GPL v2“等
MODULE_AUTHOR(“作者”)
申明模块的作者
MODULE_DESCRIPTION(“模块的功能描述")
申明模块的功能
MODULE_VERSION("V1.0")
申明模块的版本
2.模块的参数
module_param(name,type,perm)
name:变量的名称
type:变量类型,bool:布尔型 int:整型 charp:字符串型
perm是访问权限。 S_IRUGO:读权限 S_IWUSR:写权限
3.符号输出
EXPORT_SYMBOL(符号名)
EXPORT_SYMBOL_GPL(符号名)
其中EXPORT_SYMBOL_GPL只能用于包含GPL许可证的模块