//================================================================================================================================= 涉及函数如下: MODULE_LICENSE() MODULE_AUTHOR() module_param() module_init() module_exit() EXPORT_SYMBOL() //================================================================================================================================= [1] >>MMU内存管理单元,程序员将地址传递给MMU,MMU再转化为物理地址 //================================================================================================================================= [2] >> linux系统架构 --------------------------------------------------------- ----------------------------------------------------- | User Space [User       App] | | | || | |---------------| |--------------| | |[C library] | | | 进程调度 | | 文件系统 | | ------------------------------------------------------- | | | | | | | kernel space		↓		↓ | | |---------------| |--------------| | | [system call interface] | | | || | |--------------| |---------------| | | [kernel] ----------------------------> | | 内存管理MMU | | 网络协议栈 | | || | | | | | | | [hardware platform] | | |--------------| |---------------| | --------------------------------------------------------- ----------------------------------------------------- //================================================================================================================================= [3] >> 驱动文件? -->><1>驱动文件的两种启动方式 1:将驱动文件编译进内核,随着内核启动而启动 2:模块形式加载到内核中 #特点:减小内核体积;方便管理驱动,灵活度高; [ -->>模块编程涉及的接口 1>>MODULE_LICENSE("GPL"); //GPL声明 (模块必须) 2>>module_init(get_init); //加载模块指令 --> get_init() 原理借鉴:https://www.jianshu.com/p/a783474efb44 3>>module_exit(get_exit); //卸载模块指令 --> get_exit() 4>>EXPORT_SYMBOL(func_sum); //导出符号func_sum 详细用法:https://blog.csdn.net/qq_37858386/article/details/78444168#commentBox ] 
实验:模块的传参与符号导出(符号=接口) //内核各个模块是一个个黑匣子,用户层向黑匣子传递参数用module_param();黑匣子向其他黑匣子提供函数接口使用export_symbol(); 使用两个模块get,show
 get模块提供sum,sub功能
 show模块调用get模块的导出符号(导出符号 = 函数接口) show模块接收用户层两个参数parm1,parm1并做sum与sub运算 =============================================================================================== ===========================================get.c文件开始======================================== ================================================================================================ #include<linux/init.h> #include<linux/module.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("YQJ"); int get_init(void) {  printk("\n====%s====\n",__FUNCTION__); } void get_exit(void) {  printk("%s exit",__FUNCTION__); } void func_sum(int a,int b) {  printk("\n%s>>%d\n",__FUNCTION__,a+b); } void func_sub(int a,int b) {  printk("\n%s>>%d\n",__FUNCTION__,a-b); } EXPORT_SYMBOL(func_sum); //导出符号 EXPORT_SYMBOL(func_sub); module_init(get_init); //用户层模块初始化接口 module_exit(get_exit); //用户层模块卸载接口 =============================================================================================== ===========================================get.c文件结束======================================== ================================================================================================ =============================================================================================== ===========================================show.c文件开始======================================== ================================================================================================ #include "get.h" #include<linux/init.h> #include<linux/module.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("YQJ"); static int parm1 = 0; static int parm2 = 0; module_param(parm1, int, 0644); //模块参数设置 module_param(parm2, int, 0644); static int show_init(void) {  printk("\n%s>>\n",__FUNCTION__); func_sum(parm1,parm2); func_sub(parm1,parm2); return 0; } static void show_exit(void) {  printk("\n%s>>\n",__FUNCTION__); } module_init(show_init); module_exit(show_exit); =============================================================================================== ===========================================show.c文件开始======================================== ================================================================================================ =============================================================================================== ===========================================get.h文件开始======================================== ================================================================================================ #ifndef _GET_H #define _GET_H void func_sum(int a,int b); void func_sub(int a,int b); #endif =============================================================================================== ===========================================get.h文件开始======================================== ================================================================================================ =============================================================================================== ===========================================Makefile文件开始===================================== ================================================================================================ obj-m += get.o //向module项目添加get.o与show.o obj-m += show.o   
KDIR = /home/topeet/iTop4412_Kernel_3.0 //编译需要的内核源码 PWD = $(shell pwd) //get.c与show.c路径 all: make -C $(KDIR) M=$(PWD) modules //编译模块指令 install: cp get.ko /home/topeet/minilinux/modul_pro1/ //将ko模块复制到nfs目录 cp show.ko /home/topeet/minilinux/modul_pro1/ clean: rm -rf *.o =============================================================================================== ===========================================Makefile文件结束===================================== ================================================================================================ ================================================================================================ 运行效果如下: //加载get模块(最先加载底层模块,show调用get的导出符号,get就是底层模块) [root@iTOP-4412]# insmod get.ko [ 2011.391086] ====get_init==== //加载show模块 [root@iTOP-4412]# insmod show.ko parm1=3 parm2=2 [ 1923.769203] [ 1923.769220] show_init>> [ 1923.771769] [ 1923.771782] func_sum>>5 [ 1923.778361] [ 1923.778375] func_sub>>1 //卸载show模块 [root@iTOP-4412]# rmmod show [ 2062.227470] [ 2062.227487] show_exit>> //卸载get模块(最后卸载底层模块) [root@iTOP-4412]# rmmod get [ 2068.157346] get_exit exit