首先模块代码编译加载需要哪些东西:
先看 makefile
#!/bin/bash
# -m 表示不会 编译到zImage 是生成可加载模块 目标文件
obj-m += mini_linux_module.o
#表示坐着的kernel源码路径
KDIR := /home/topeet/android4.0/iTop4412_Kernel_3.0
#当前路径
PWD ?= $(shell pwd)
all:
#-C 表示执行这个目录下的makefile 然后返回继续执行
make -C $(KDIR) M=$(PWD) modules
.phony clean:
clean:
rm -rf *.o**
这样我们 就清楚,编译生成模块代码需要这几个东西:
1、kernel 源码 这个下载解压使用menuconfig配置就好了
2、我们写的模块代码 重点是这个相当于我们写某个驱动调用的入口;
3、makefile
看下源码 :
头文件所在目录:
源码下
include/linux/init.h
#define module_init(x) __initcall(x);
#define module_exit(x) __exitcall(x);
include/linux/module.h
#define MODULE_LICENSE(_license) MODULE_INFO(license, _license)
#define MODULE_AUTHOR(_author) MODULE_INFO(author, _author)
#include <linux/module.h>
#include <linux/init.h>
//GPL协议 来自于moudle.h的头文件中必须包含 否则内核无法调用
MODULE_LICENSE("DUAL BSD/GPL");
MODULE_AUTHOR("danni_cj");
/*紧急事件消息,系统崩溃之前提示,表示系统不可用*/
static int HELLO_INIT(void)
{
printk(KERN_EMERG "HELLO_INIT function enter \n");
return 0;
}
static void HELLO_EXIT(void)
{
printk(KERN_MEMRG "hello_exit function enter \n");
}
module_init(HELLO_INIT);
module_exit(HELLO_EXIT);
U盘加载
mount /dev/sda1 /mnt/udisk 挂在U盘
insmod /mnt/udisk/mini_linux_module.ko
输出:HELLO_INIT function enter
rmmod mini_linux_module
输出:hello_exit function enter
这就实现了简单的驱动模块的加载,卸载流程;
ps:
make中不清楚的 += := = 区别可以查看 我上期发的
https://blog.csdn.net/c4679281314/article/details/96441284
#################################
喜欢了你 是凑巧;
或许是你 身上的某个元素吸引了我
但真的喜欢上你时去不是偶然。
cj ->danni
################################