03-Linux内核驱动模块加载

发布于:2025-07-03 ⋅ 阅读:(24) ⋅ 点赞:(0)

概述

本文主要讲解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.o

KERNELDIR ?= $(shell pwd)/../../../kernel

all default: modules
install: modules_install

modules 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