i.MX6ULL驱动开发 | 01-Linux内核模块的编写与使用

Posted Mculover666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了i.MX6ULL驱动开发 | 01-Linux内核模块的编写与使用相关的知识,希望对你有一定的参考价值。

一、Linux内核模块

Linux内核中提供了模块(Module)机制,具有以下优点:

  • 模块不会被编译到linux内核中
  • 使用的时候,动态加载进内核
  • 不需要的时候,从内核卸载

二、Linux内核模块的编写

1. 头文件

#include <linux/init.h>
#include <linux/module.h>

2. 模块加载函数

当模块被加载进内核时,系统会调用模块的模块加载函数,该函数使用__init来标识。

static int __init module_demo_init(void)

    printk("module demo init success!");
    return 0;

module_init(module_demo_init);

在编写时,若初始化成功应该返回0,若初始化失败应该返回错误编码,方便用户程序利用perror等方法将它们转换为有意义的错误信息字符串。

3. 模块卸载函数

当模块从内核被卸载时,系统会调用模块的模块卸载函数,该函数使用__exit来标识。

static void__exit module_demo_exit(void)

    printk("module demo exit success!");

module_exit(module_demo_exit);

4. 模块参数

5. 模块声明与描述

  • MODULE_AUTHOR:模块作者
  • MODULE_DESCRIPTION:模块描述
  • MODULE_VERSION:模块版本
  • MODULE_DEVICE_TABLE:设备表
  • MODULE_ALIAS:别名
MODULE_AUTHOR("mculover666 <mculover666@qq.com>");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("A example Module");

至此,一个简单的基本的内核模块编写完成。

三、Linux内核模块的编译

编写一个Makefile,和模块源码位于同一个目录:

KERNEL_DIR := /home/mculover666/imx6ull/kernel/linux-imx6ull

# Kernel modules
obj-m += module_demo.o

# Specify flags for the module compilation.
#EXTRA_CFLAGS=-g -O0

build: kernel_modules

kernel_modules:
	make -C $(KERNEL_DIR) M=$(CURDIR) modules

clean:
	make -C $(KERNEL_DIR) M=$(CURDIR) clean

编译:

make

注意,模块编译也属于内核代码编译,所以在make之前,需要设置ARCH和CROSS_COMPILE环境变量

编译完成后,在当前路径下会生成.ko文件,这个便称之为内核模块。

四、Linux内核模块的使用

1. 加载模块与卸载模块

使用 insmod命令加载模块:

insmod <模块名称.ko>


使用 rmmod 命令卸载模块:

rmmod <模块名称>

2. 查看系统中已加载的所有模块

lsmod


lsmod命令实际上是读取并分析/proc/modules文件:

内核中已加载模块的信息也存在于sys/module目录下,加载module_demo.ko后,内核中将包含/sys/module/module_hello目录:

该目录下又有一个refcnt文件和一个sections目录,

3. modprobe命令

modprobe命令要比insmod命令强大,它在加载模块时,会同时加载该模块依赖的其它模块:

modprobe <模块名称.ko>

通过modprobe加载的模块,可以通过modprobe卸载,将卸载其依赖的模块

modprobe -r <模块名称.ko>

模块之间的依赖关系存放在根文件系统的 /lib/modules/<kernel-vesion>/modules.dep 文件中,该文件是在整体编译内核时,由depmod工具生成的。

4. modinfo命令

modinfo <模块名>

使用该命令可以获得模块的信息,包括模块作者、说明等等。

参数资料

  • 《Linux设备驱动开发详解:基于最新的Linux 4.0内核》,宋宝华

以上是关于i.MX6ULL驱动开发 | 01-Linux内核模块的编写与使用的主要内容,如果未能解决你的问题,请参考以下文章

i.MX6ULL驱动开发 | 26 - Linux内核的RTC驱动

i.MX6ULL驱动开发 | 26 - Linux内核的RTC驱动

i.MX6ULL驱动开发1——字符设备开发模板

i.MX6ULL驱动开发 | 09 -基于Linux自带的LED驱动点亮LED

i.MX6ULL驱动开发 | 31 - Linux内核网络设备驱动框架

i.MX6ULL驱动开发 | 31 - Linux内核网络设备驱动框架