涉及函数如下:
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");
2>>module_init(get_init);
原理借鉴:https://www.jianshu.com/p/a783474efb44
3>>module_exit(get_exit);
4>>EXPORT_SYMBOL(func_sum);
详细用法:https://blog.csdn.net/qq_37858386/article/details/78444168#commentBox
]
实验:模块的传参与符号导出(符号=接口)
使用两个模块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
obj-m += show.o
KDIR = /home/topeet/iTop4412_Kernel_3.0
PWD = $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
install:
cp get.ko /home/topeet/minilinux/modul_pro1/
cp show.ko /home/topeet/minilinux/modul_pro1/
clean:
rm -rf *.o
===============================================================================================
===========================================Makefile文件结束=====================================
================================================================================================
================================================================================================
运行效果如下:
[root@iTOP-4412]# insmod get.ko
[ 2011.391086] ====get_init====
[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
[root@iTOP-4412]# rmmod show
[ 2062.227470]
[ 2062.227487] show_exit>>
[root@iTOP-4412]# rmmod get
[ 2068.157346] get_exit exit