当前位置: 首页 > news >正文

Linux驱动开发1:设备驱动模块加载与卸载

Linux驱动开发1:设备驱动模块加载与卸载

应用程序和驱动的交互原理

用户空间(用户态)和内核空间(内核态):
Linux操作系统内核和驱动程序运行在内核空间、应用程序运行在用户空间。

应用程序想要访问内核资源,有三种方法:系统调用、异常(中断)和陷入

应用程序不会直接调用系统调用,而是通过API函数来间接的调用系统调用,比如POSIX、API和C库等。unix类操作系统中最常用的编程接口就是POSIX。

系统调用处于内核空间,应用程序无法直接访问,因此需要“陷入“到内核,方法就是软中断。陷入内核以后还要指定系统调用号。

驱动就是获取外设、或者传感器数据,控制外设。数据会提交给应用程序。Linux驱动编译既要编写一个驱动,还要我们编写一个简单的测试应用程序,APP,Linux下驱动和应用是完全分开的。

Linux 应用程序对驱动程序的调用

在 Linux 中一切皆为文件,驱动加载成功以后会在“/dev”目录下生成一个相应的文件,应用程序通过对这个名为“/dev/xxx” (xxx 是具体的驱动文件名字)的文件进行相应的操作即可实现对硬件的操作。

在用户空间想要实现对内核的操作,比如使用 open 函数打开/dev/led 这个驱动,因为用户空间不能直接对内核进行操作,因此必须使用一个叫做“系统调用”的方法来实现从用户空间“陷入” 到内核空间,这样才能实现对底层驱动的操作。

open、 close、 write 和 read 等这些函数是由 C 库提供的,在 Linux 系统中,系统调用作为 C 库的一部分。
在这里插入图片描述
调用 open 函数的时候流程如图
在这里插入图片描述

驱动模块的加载与卸载

Linux 驱动有两种运行方式:
第一种就是将驱动编译进 Linux 内核中,这样当 Linux 内核启动的时候就会自动运行驱动程序。
第二种就是将驱动编译成模块(Linux 下模块扩展名为.ko),在Linux 内核启动以后使用“insmod”命令加载驱动模块。

编译驱动的时候需要用到Linux内核源码,

驱动编译

模块有加载和卸载两种操作,在编写驱动的时候需要注册这两种操作函数,模块的加载和卸载注册函数如下:

module_init(xxx_init); //注册模块加载函数
module_exit(xxx_exit); //注册模块卸载函数

编写本地简单驱动demo如下
在这里插入图片描述
编写Makefile进行模块驱动编译(注:需提前编译好linux kernel代码,Makefile中需要指定内核代码路径)
在这里插入图片描述
编译日志
在这里插入图片描述
成果物如下
在这里插入图片描述

驱动移植

驱动编译完成以后扩展名为.ko,有两种命令可以加载驱动模块: insmod和modprobe, insmod是最简单的模块加载命令,此命令用于加载指定的.ko 模块

insmod 命令不能解决模块的依赖关系

modprobe 会分析模块的依赖关系,然后会将所有的依赖模块都加载到内核中

modprobe 命令默认会去/lib/modules/目录中查找模块

将编译出来的.ko文件放到根文件系统中,
在这里插入图片描述
执行modprobe chrdevbase.ko命令进行加载
在这里插入图片描述
模块加载
在这里插入图片描述
模块卸载
在这里插入图片描述

http://www.xdnf.cn/news/1114777.html

相关文章:

  • ControlNet与T2IAdapter
  • 三种网络类型
  • WordPress Ads-pro 本地文件包含漏洞复现(CVE-2025-4380)
  • 设计模式之工厂模式:对象创建的智慧之道
  • 从“被动巡检”到“主动预警”:塔能物联运维平台重构路灯管理模式
  • Docker安装Nginx
  • Leaflet面试题及答案(61-80)
  • 全国青少年信息素养大赛-算法创意实践挑战赛小学组复赛(代码版)
  • Gin框架统一响应与中间件机制学习笔记
  • JAVA-springboot 整合Activemq
  • Docker一键安装中间件(RocketMq、Nginx、MySql、Minio、Jenkins、Redis)脚步
  • jeepay开源项目开发中金支付如何像其他支付渠道对接那样简单集成,集成服务商模式,极简集成工具。
  • HarmonyOS-ArkUI Web控件基础铺垫1-HTTP协议-数据包内容
  • Docker三剑客
  • AWS Lambda Container 方式部署 Flask 应用并通过 API Gateway 提供访问
  • 手写std::optional:告别空指针的痛苦
  • 系规备考论文:论IT服务知识管理
  • 010_学习资源与社区支持
  • C语言基础教程(002):变量介绍
  • Spring Boot 配置注解处理器 - spring-boot-configuration-processor
  • 初识计算机网络
  • Node.js 聊天内容加密解密实战教程(含缓存密钥优化)
  • python 列表(List) vs. 元组(Tuple):什么时候该用不可变的元组?它们在性能和用途上有什么区别?
  • C++使用Thread实现子线程延时重发
  • 语言模型常用的激活函数(Sigmoid ,GeLU ,SwiGLU,GLU,SiLU,Swish)
  • 【论文阅读】基于注意力机制的冥想脑电分类识别研究(2025)
  • LeetCode第 458 场周赛题解
  • 字符串问题(哈希表解决)
  • 【论文阅读】Think Only When You Need with Large Hybrid-Reasoning Models
  • 【源力觉醒 创作者计划】文心开源大模型ERNIE-4.5私有化部署保姆级教程与多功能界面窗口部署