模块

//=================================================================================================================================
涉及函数如下:
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值