Presentation is loading. Please wait.

Presentation is loading. Please wait.

linux驱动模块编程 HelloWorld 广州创龙电子科技有限公司

Similar presentations


Presentation on theme: "linux驱动模块编程 HelloWorld 广州创龙电子科技有限公司"— Presentation transcript:

1 linux驱动模块编程 HelloWorld 广州创龙电子科技有限公司
Guangzhou Tronlong Electronic Technology Co., Ltd

2 01 内核模块简介 02 模块开发常用的命令 03 最简单的模块HelloWorld

3 01 内核模块简介 第 1 部分

4 内核模块简介 何为内核模块 内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),简称为模块。 作用: 不用编译进内核,控制内核大小; 新增或删除功能,不需重新编译内核,只需加载或卸载模块。 04 广州创龙电子科技有限公司

5 内核模块简介 内核模块程序结构 1. 模块加载函数 Linux内核模块加载函数一般以__init标识声明,示例代码如下:
1. 模块加载函数 Linux内核模块加载函数一般以__init标识声明,示例代码如下: static int __init myModule_init(void) { return 0; } module_init(myModule_init); 当通过加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相关初始化工作。 05 广州创龙电子科技有限公司

6 内核模块简介 内核模块程序结构 2. 模块卸载函数 模块卸载函数一般以__exit标识声明,示例代码如下:
2. 模块卸载函数 模块卸载函数一般以__exit标识声明,示例代码如下: static void __exit myModule_exit(void) { } module_exit(myModule_exit); 当卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能。 06 广州创龙电子科技有限公司

7 内核模块简介 内核模块程序结构 3. 模块声明 MODULE_LICENSE(“GPL”); 内核可以识别的许可证有GPL(任意版本GNU通用 公共许可证)、GPL v2等 MODULE_AUTHOR(“author”); 声明作者信息,可不用 MODULE_VERSION (“version”); 声明版本信息,可不用 MODULE_DESCRIPTION (“description”); 声明模块功能,可不用 许可证(LICENSE)声明描述内核模块的许可权限,如果不声明LICENSE,模块被加载时,将收到内核被污染 (kernel tainted)的警告. 注意:许可证(LICENSE)声明描述内核模块的许可权限,如果不声明LICENSE,模块被加载时,将收到内核被污染(kernel tainted)的警告. 07 广州创龙电子科技有限公司

8 02 模块开发常用的命令 第 2 部分

9 模块开发常用的命令 insmod XXX.ko 加载内核模块 rmmod XXX 卸载内核模块 lsmod 查看所有已加载的内核模块
modprobe XXX 可加载指定的个别模块,或是载入一组相依赖的模块 modinfo XXX.ko 查看模块信息 modprobe会根据depmod所产生的依赖关系,决定要载入哪些模块。若在载入过程中发生错误,在modprobe会卸载整组的模块。 04 广州创龙电子科技有限公司

10 03 最简单的模块HelloWorld 第 3 部分

11 最简单的模块HelloWorld 编写hello.c static int __init hello_init(void) {
printk("Hello World!\n"); return 0; } static void __exit hello_exit(void) printk("Goodbye World!\n "); 11 广州创龙电子科技有限公司

12 最简单的模块HelloWorld 编写Makefile ifneq ($(KERNELRELEASE),) obj-m := hello.o
else KDIR=<内核路径> CROSS_COMPILE=<编译工具路径> all: make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) clean: rm -rf *.ko *.o *.mod.o *.mod.c *.symvers modul* .hello.* .tmp_versions .*.*.cmd help: @echo "make KDIR=<you kernel path> CROSS_COMPILE=<your CROSS_COMPILE>" endif 12 广州创龙电子科技有限公司

13 最简单的模块HelloWorld 如果不会编写Makefile怎么办? 13 广州创龙电子科技有限公司

14 广州创龙电子科技有限公司 谢谢 官网: 论坛: 微信公众号:广州创龙


Download ppt "linux驱动模块编程 HelloWorld 广州创龙电子科技有限公司"

Similar presentations


Ads by Google