| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> linux驱动开发篇(一)—— Linux 内核模块介绍 -> 正文阅读 |
|
[系统运维]linux驱动开发篇(一)—— Linux 内核模块介绍 |
linux系列目录: 文章目录一、Linux 内核模块本篇文章是介绍Linux 驱动开发承上启下的一个知识点。在 Linux 系统中,设备驱动会以内核模块的形式出现,学习 Linux 内核模块编程是驱动开发的先决条件。 1、内核内核按照体系结构分为两类: 微内核(Micro Kernel) 和 宏内核(Monolithic Kernel)。在微内核架构中,内核只提供操作系统核心功能,如实现进程管理、存储器管理、进程间通信、 I/O 设备管理等,而其它的应用层 IPC、文件系统功能、设备驱动模块则不被包含到内核功能中,属于微内核之外的模块,所以针对这些模块的修改不会影响到微内核的核心功能。微内核具有动态扩展性强的优点。 Windows 操作系统、华为的鸿蒙操作系统就属于这类微内核架构。 而宏内核架构是将上述包括微内核以及微内核之外的应用层 IPC、文件系统功能、设备驱动模块都编译成一个整体。其优点是执行效率非常高,但缺点也是十分明显的,一旦我们想要修改、增加内核某个功能时(如增加设备驱动程序)都需要重新编译一遍内核。 Linux 操作系统正是采用了宏内核结构。为了解决这一缺点, linux 中引入了内核模块这一机制。 2、内核模块引入原因Linux 是一个跨平台的操作系统,支持众多的设备,在 Linux 内核源码中有超过 50% 的代码都与设备驱动相关。 Linux 为宏内核架构,如果开启所有的功能,内核就会变得十分臃肿。内核模块就是实现了某个功能的一段内核代码,在内核运行过程,可以加载这部分代码到内核中,从而动态地增加了内核的功能。基于这种特性,我们进行设备驱动开发时,以内核模块的形式编写设备驱动,只需要编译相关的驱动代码即可,无需对整个内核进行编译。 3、内核模块的定义和特点核模块的具体的定义:内核模块全称 Loadable Kernel Module(LKM), 是一种在内核运行时加载一组目标代码来实现某个特定功能的机制。
二、Linux 内核模块的工作机制我们编写的内核模块,经过编译,最终形成.ko 为后缀的 ELF 文件。ko 文件在数据组织形式上是 ELF(Excutable And Linking Format) 格式,是一种普通的可重定位目标文件。这类文件包含了代码和数据,可以被用来链接成可执行文件或共享目标文件,静态链接库也可以归为这一类。在学习linux基础篇(二)——静态和动态链接时,有讲解过ELF文件的详细信息。内核就是利用ELF文件留在内核模块里的信息,对内核模块进行利用的。 1、内核模块组成部分Linux 内核模块的代码框架通常由下面几个部分组成:
2、内核模块的加载过程linux内核模块加载函数一般以__init标识声明,模块加载函数以
__init 和module_init宏定义介绍:
带有 __init 的修饰符,表示将该函数放到可执行文件的 __init 节区中,该节区的内容只能用于模块的初始化阶段,初始化阶段执行完毕之后,这部分的内容就会被释放掉。
宏定义 module_init 用于通知内核初始化模块的时候,要使用哪个函数进行初始化。它会将函数地址加入到相应的节区 section 中,这样的话,开机的时候就可以自动加载模块了。 3、内核模块的卸载过程当模块从内核被卸载时,系统会调用模块的模块卸载函数,该函数使用__exit来标识。
4、模块声明与描述
完整代码的例子:
5、模块参数Linux 内核提供一个宏来实现模块的参数传递
6、导出符号模块可以使用如下宏导出符号到内核符号表中
导出符号可以被其他模块使用,只需要使用前声明一下即可。EXPORT_SYMBOL_GPL()只适用于包含GPL许可权的模块,一般认为,保守做法是linux内核不能使用非GPL许可权。
三、Linux内核模块的编译四、Linux内核模块的使用 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 15:41:47- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |