1.驱动模块的编写
例子:
@在PC机源码目录drivers/arm_emb:
mkdir demo_simple 建一个模块目录
vim demo.c 编写demo
static int demo_init (void) {};
module_init(demo_init);
static void demo_exit (void) {};
module_exit(demo_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("XXX");
MODULE_VERSION("xx-xx-xx");
MODULE_DESCRIPTION(" ********");
vim Makefile 编写Makefile
obj-m :=demo.o
KERNEL :=/linux-3.5
all:
make -C $(KERNEL) M=`pwd` modules
clean:
make -C $(KERNEL) M=`pwd` clean
完了make 将生成的文件 demo.ko 拷贝到开发板的根目录
@开发板:
插入 insmod demo.ko
移除 rmmod demo (注意木有.ko)
查看 lsmod demo.ko
注:如模涉及到模坏调用的,先移除被调用的模块,再移除调用模块
两个模块的调用:
在被调用的函数模块:EXPORT_SYMBOL_GPL(demo_func); //demo_func是被调用的函数名
在主动调用模块:extern void demo_func(int val); //对函数进行外部声明
对与两的模块间参数的传递也是一样的
extern int val; //在主动调用模块声明
EXPORT_SYMBOL_GPL(val); //在主动调用模块导出
注: 符号(参数)导出:在那调用,在哪导出
2.如何向内核添加系统调用函数
例子:
@在PC机linux源码目录drivers下:
mkdir arm_emb 建立目录文件
vim mysyscall.c 编写调用函数
SYSCALL_DEFINE1(buzzer_ctrl, int, cmd) {}; //cmd函数的参数,有X个参数=》DEFINEX
vim Makefile 建立Makefile
obj-y +=mysyscall.o
vim arch/arm/kernel/calls.S 添加系统调用号
arch/arm/include/asm/unistd.h //查看真正系统调用号
vim ../Makefile 即 arm_emb 的上层目录drivers 的Makefile 添加一行:
obj-y +=arm_emb/ //arm_emb是使当前目录能够编译
然后返回源码目录 make -jX