03-Linux内核驱动模块加载
概述
本文主要讲解Linux系统中的内核驱动模块编写和加载。
模块功能
Linux模块功能是对Linux内核的一种功能扩展机制,在linux系统不重启的情况下,通过用户空间动态扩展linux内核功能,Linux内核如果要支持动态加载内核模块的功能,需要在内核编译的时候,再内核配置文件中打开如下的两个选项:
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
内核模块编写
编写驱动程序helloworld.c文件如下:
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>static int __init helloworld_init(void)
{printk(KERN_INFO "Hello world!\n");return 0;
}static void __exit helloworld_exit(void)
{printk(KERN_INFO "GoodBye of the world\n");
}module_init(helloworld_init);
module_exit(helloworld_exit);
MODULE_AUTHOR("yanl1229 <yanl1229@163.com>");
MODULE_LICENSE("GPL");
编写Makefile文件
obj-m := helloworld.oKERNELDIR ?= $(shell pwd)/../../../kernelall default: modules
install: modules_installmodules modules_install help clean:$(MAKE) ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C $(KERNELDIR) M=$(shell pwd) $@
注: 网上很多编写Makefile文件中对于内核目录的指定,都是基于编译模块主机的内核模块路径,对于嵌入式开发,单独编译模块的时候,需要参考如上的Makefile写法.
模块的编译
1、模块源码目录下执行make进行编译。
2、将编译好的helloworld.ko文件拷贝到buildroot/output/target目录下。
3、执行./build.sh 将内核模块打包到文件系统中。
内核模块加载
1、在工程目录下执行./build.sh run 运行qemu 平台的arm linux系统, 并且切换到root目录
2、使用insmod加载内核模块如下所示:
总结
本文主要讲述了如何在嵌入式arm Linux系统中编写驱动模块和加载的步骤。
工程链接
https://gitee.com/yanl1229/EasyLinux.git