栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Linux内核模块

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux内核模块

文章目录
  • 一、Linux内核模块简介
    • 一个最简单的模块(module)
  • 二、Linux内核模块程序结构
  • 三、一个完整驱动源码
    • Makefile文件

一、Linux内核模块简介

 Linux内核的整体架构本就非常庞大,其包含的组件也非常多,而我们怎样把需要的部分都包含在内核中呢?

 如果把需要的所有功能都编译到Linux内核中。这会导致两个问题,一是生成的内核会很大,二是如果我们要在现有的内核中新增或删除功能,将不得不重新编译内核。

 有没有另一种机制可使得编译出的内核本身并不需要包含所有功能,而这些功能需要被使用的时候,其对应的代码被动态地加载到内核中呢?

 Linux提供了这样的机制,这种机制被称为模块(module)。模块具有这样的特点。

  • 模块本身不被编译人内核映像,从而控制了内核的大小。
  • 模块一旦被加载,它就和内核中的其他部分完全一样。
一个最简单的模块(module)
#include 
#include 

static int __init hello_init(void)
{
	printk(KERN_INFO "Hello World entern");
	return 0;
}

module_init(hello_init);

static void __exit hello_exit(void)
{
	printk(KERN_INRO "Hello World exitn");
}
module_exit(hello_exit);

MODULE_AUTHOR("Lief Yuan ");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("A simple Hello World Module");
MODULE_ALIAS("a simplest module");

这个最简单的内核模块只包含内核模块加载函数、卸载函数和对GPL v2 许可权限的声明以及一些描述信息。

二、Linux内核模块程序结构

一个Linux内核模块主要由如下几个部分组成:

  • (1)模块加载函数
    当通过insmod或modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相关初始化工作。
  • (2)模块卸载函数
    当通过rmmod命令卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相关的功能。
  • (3)模块许可证声明
    许可证(LICENSE)声明描述内核模块的许可权限,如果不声明LICENSE,模块被加载时,将收到内核被污染(Kernel Tainted)的警告。
  • (4)模块参数(可选)
    模块参数是模块被加载的时候可以传递给它的值,它本身对应模块内部的全局变量。
  • (5)模块导出符号(可选)
    内核模块可以导出的符号(symbol,对应于函数或变量),若导出,其他模块则可以使用本模块中的变量或函数。
  • (6)模块作者等信息声明(可选)
三、一个完整驱动源码

详细参考:嵌入式Linux–Beep驱动模块

  • 驱动文件
  • Makefile文件

1、驱动的Makefile文件需要指定内核文件夹
2、编译出来的.ko驱动文件只能安装在编译时指定的内核文件的版本上

Makefile文件
KERNEL_DIR := /home/liefyuan/Liefyuan/cherry-pi/linux-zero-5.2.y
CURRENT_PATH := $(shell pwd)
obj-m := led.o

build: kernel_modules

kernel_modules:
	$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules

clean:
	$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean
  • 第1行,指定内核源码文件目录,使用绝对路径
  • 第2行,CURRENT_PATH 表示当前路径,直接通过运行“pwd”命令来获取当前所处路径
  • 第3行,obj-m 表示将 led.c 这个文件编译为 led.ko 模块
  • 第8行,具体的编译命令,后面的 modules 表示编译模块,-C 表示将当前的工作目录切
    换到指定目录中,也就是 KERNERLDIR 目录。M 表示模块源码目录,“make modules”命令
    中加入 M=dir 以后程序会自动到指定的 dir 目录中读取模块的源码并将其编译为.ko 文件。

编译
Makefile文件编写好以后输入

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16

进行编译。

liefyuan@ubuntu:~/Liefyuan/cherry-pi/driver/lradc-key$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16
make -C /home/liefyuan/Liefyuan/cherry-pi/linux-zero-5.2.y M=/home/liefyuan/Liefyuan/cherry-pi/driver/lradc-key modules
make[1]: Entering directory '/home/liefyuan/Liefyuan/cherry-pi/linux-zero-5.2.y'
  CC [M]  /home/liefyuan/Liefyuan/cherry-pi/driver/lradc-key/mykeypad.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/liefyuan/Liefyuan/cherry-pi/driver/lradc-key/mykeypad.mod.o
  LD [M]  /home/liefyuan/Liefyuan/cherry-pi/driver/lradc-key/mykeypad.ko
make[1]: Leaving directory '/home/liefyuan/Liefyuan/cherry-pi/linux-zero-5.2.y'
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/828149.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号