1、模块化编程概念:
C语言阶段:将功能分成.c和.h文件
MCU阶段:.c和.h对应一个硬件或者功能的模块
Linux驱动:主要对应着硬件的模块(led灯、按键),指的是最终生成的.ko文件,这个ko文件可 以模块化的动态的加载到内核里。
2、内核层代码的架构
1)当我们的进程启动的时候,我们的操作系统会为进程虚拟出一块4G大小的内存空间,虚拟空间最终会映射到真实的物理空间,这块空间分成了两部分:0-3G:用户空间(应用层) 3-4G:内核空间(内核层);我们之前所写代码都是运行在应用空间的,是无法直接访问硬件的,我们可以通过特殊接口来直接访问硬件。
2)内核代码框架
//1:内核层代码头文件
#include<linux/kernel.h>
#include<linux/module.h>
//2:内核层没有main 他有加载函数和卸载函数
//加载函数的格式
static int __init myled_init(void)
{
return 0;
}
//卸载函数的格式
static void __exit myled_exit(void)
{
}
//3:声明函数
//声明加载函数
module_init(myled_init)
//声明卸载函数
module_exit(myled_exit)
//声明开源协议
MODULE_LICENSE("GPL")
3、内核代码的编译使用
1)编译
我们的代码是运行在Linux3.5内核环境下的,还需要用到交叉编译工具,所以我们必须借助makefile来完成。
obj-m +=led.o
KDIR:=/home/lym/work/203/3neihe/linux-3.5
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.ko *.o *.mod.c *.order *.symvers
说明:
obj-m:以模块化的方式编译内核
+=:追加
KDIR:编译代码的时候依赖的内核的路径
all:目标
-C:指定编译的路径
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
make -C $(KDIR) M=$(PWD) modules
该命令是make modules命令的扩展,-C选项的作用是指将当前的工作目录转移到制定的目录,即(KDIR)目录,程序到(PWD)当前目录查找模块源码,将其编译,生成.ko文件。
KDIR表示内核源码目录,这种方式适用于嵌入式开发的交叉编译,KDIR目录中包含了内核驱动模块所需要的各种头文件及依赖。
2)使用
模块的加载--他会执行 XX_init函数
insmod led.ko
模块的卸载 ----他会执行XX_exit函数
rmmod led.ko