二、驱动基础(基于北京迅为电子)

news/2025/11/3 21:15:21/文章来源:https://www.cnblogs.com/gramming/p/19185332

一、基础

  1. Linux驱动的分类:字符设备(顺序访问)、块设备(随机访问)、网络设备(数据包收发)
  2. Linux内核源码的目录架构:arch(架构相关)、block(块设备)、crypto(加密算法)、Documentation(官方文档)、drivers(驱动)、firmware(固件)、fs(文件系统相关)、include(公共头文件)、init(初始化代码)、ipc(进程间通信)、kernel(内核核心代码)、lib(库文件)、mm(内存管理)、net(网络相关)、scripts(脚本)、security(安全)、sound(音频)、tools(工具)、usr(启动)、virt(虚拟机)

二、基本Linux驱动编译模板Makeile

export ARCH=arm64
export CROSS_COMPILE=aarch64-rockchip1031-linux-gnu-
KERNEL_DIR=/home/rk/rk3562/rk3562_linux_sdk_release/kernel-5.10/all:make -C ${KERNEL_DIR} M=`pwd` modulesclean:make -C ${KERNEL_DIR} M=`pwd` modules cleanrm -rf modules.orderobj-m += hello.o
  1. 在Linux的顶层Makefile中一般有关于这两个变量的?=语法,这两个变量指定了编译内核需要的架构和工具链
  2. 模块加载和卸载命令
insmod hello.ko       // 加载模块
modprobe hello.ko     // 同时加载该模块所依赖的模块
rmmod hello.ko        // 卸载模块
lsmod                 // 显示当前加载的模块 
modinfo hello.ko      // 列出信息
  1. 配置内核make menuconfig的文件
    Kconfig,通过设置变量ARCH为arm64,在对应的arch/arm64/Kconfig中存储了图形化配置界面(make menuconfig)的各种选项
    config和.conig,前者一般存储了配置好的各种配置文件,后者是本次编译使用的最终配置文件
    Makefile包含了各个代码和模块的编译规则
  2. Kconfig的语法
    mainmenu,设置主菜单的标题
    menu,endmenu,生成一个菜单
    config,定义一个新的选项,常见类型有bool、tristate、string,有default值,有help帮助
    depends on表示直接依赖关系,select表示反向依赖关系
    choice和endchoice定义了可选项
    comment在图形化界面中显示注释
    source读取另一个Kconig文件

三、驱动编译进内核

  1. 创建一个新文件夹存储c文件、Kconfig文件和Makefile文件
  2. 修改Kconfig文件和Makefile文件,Kconfig中增加一个config选项,Makefile中使用obj-$(xx) += xx.o
  3. 修改上一级目录的Kconfig文件和Makefile文件,Kconfig中使用source包含下一级新加的Kconfig文件,Makefile中使用obj-y += xx/包含xx目录下的Makefile文件

四、驱动传参

module_param(name, type, perm);
module_param_array(name, type, nump, perm);
module_param_string(name, string, len, perm);
MODULE_PARAM_DESC(_parm, desc);
// 使用时在insmod的时候通过=进行赋值

五、其他小技巧

  1. vscode中加入头文件的方法,ctrl+shift+p,输入config,在json文件的includePath列表中加入对应的头文件目录
  2. 头文件补全插件和源文件补全插件,Tabnine和Include Autocomplete

六、内核符号导出

  1. 内核符号表,内核中的函数或全局变量
  2. EXPORT_SYMBOL_GPL(符号名); // 使用时只需要声明符号即可

七、驱动加载

  1. module_init(hello)定义了一个函数指针并将其设置为hello函数的指针,放在initcall6.init段中
  2. module_init的优先级是6
  3. 内核顶层的Makefile,如果将驱动编译进内核,则使用变量KBUILD_CFLAGS_KERNEL,如果编译成模块则使用变量KBUILD_CFLAGS_MODULE,CFLAGS是编译时候使用的
  4. insmod命令实际是使用了一个系统调用完成ko文件的加载,系统调用根据系统调用号绑定了一个系统调用函数

八、在内核中添加一个系统调用

  1. 使用内核提供的宏实现系统调用
  2. 关联系统调用和系统调用号
  3. 编译内核

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/954904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux驱动开发学习日记(一)

Linux驱动开发学习日记(一)整完无人机项目之后进行更新,具体怎么写还没想好,现在学的也比较迷糊

Windows 路由表详解

Windows 路由表详解windows 路由表详解 查看ip信息 字段说明IPv4 Address: ipv4地址,用于标识网络中的主机Subnet Mask: 子网掩码,分为 连续的1 和 连续的0 两部分, 可以简写为 /n, 例如 /24,表示高24位为1,剩下为…

微软 Foundry Local - 本地 AI 推理解决方案

微软在其 2025 Build 大会上发布了 Foundry Local,能够在本地设备上执行 AI 推理,意味着可以利用本地的 AI 算力,如:CPU/GPU/NPU;也让用户在隐私方面得到了充足的保障,还能有改善成本效益!Foundry Local 默认除…

如何启用cycloneDDS的iceoryx

共享内存交换 — Eclipse Cyclone DDS,0.11.0 首先我们需要先下载安装iceoryx,因为cycloneDDS如果要使用共享内存传输是依赖于这个插件的。顺带一提,只有同一节点的不同进程间会使用到共享内存,cycloneDDS是根据如…

老化车

老化车非常好 👍,这个问题在电子制造和测试领域里很关键。 “老化车”(又叫 Burn-in Cart 或 Aging Rack)是用于电子产品在出厂前做 老化测试(Burn-in Test) 的一种设备或平台。 下面我给你系统讲清楚 👇🧭…

Android Studio 2025.2.1 汉化中文包临时解决方案

打开 JetBrains 官网 Chinese ​(Simplified)​ Language Pack / 中文语言包 下载最新版 242.152 版本插件将 zh.242.152.jar 文件解压出来用压缩包工具打开 zh.242.152.jar 找到目录 META-INF 并打开用文本编辑工具打…

Markdown 学习训练

Markdown 学习训练 引用(使用>)这是我的第一篇博客,本篇博客是参照狂神说课程进行学习,目的是为了练习markdown使用语法。主要包含各级标题、字体、图片、代码块、超链接、表格使用语法练习。具体可前往typora官网…

jmeter设置中文页面的两种方法

JMeter设置中文界面有两种方法:临时设置(仅当前会话有效)和永久设置(修改配 置文件后永久生效)。 设置方法 1.临时设置(关闭后恢复英文): 打开JMeter,点击菜单栏“Options”→“Choose Language”→选择“Chi…

win10 下运行aoe2,报错,应用程序无法正常启动 0xc000022

控制面板 →搜索“启用或关闭 Windows 功能”找到并勾选 “旧版组件” → “DirectPlay” → 确定 → 重启电脑。

Python生成器表达式详解(含与列表推导式核心对比、别名探讨)

从“囤货”到“现做”:Python生成器表达式详解(含与列表推导式核心对比) 在Python中,处理数据时经常会遇到一个矛盾:既要简洁的语法,又要避免大量数据占用内存。列表推导式虽能简化代码,却会“一次性生成所有元…

在Fiddler中模拟网络中断,返回500错误的过程

开启断点在 Fiddler 菜单栏点击 Rules → Automatic Breakpoints,选择以下任一断点模式: Before Requests(请求发送前断点):可修改请求后再发送,适合模拟服务器因异常请求返回 500。 After Responses(响应返回后…

P4198 楼房重建 分析

题目概述 题目链接:https://www.luogu.com.cn/problem/P4198。 给出一个 \(x\) 轴长度为 \(n\),\(y\) 轴长度为 \(10^9\) 的二维平面。 一共有 \(n\) 天,第 \(i\) 天令坐标为 \(x_i\) 的线段变长为 \(y_i\)(屋顶就…

构建企业级AI提示词攻击防御体系的实战指南-2025年

构建企业级AI提示词攻击防御体系的实战指南-2025年在人工智能技术深度赋能的2025年,大型语言模型已全面渗透金融、政务、医疗等企业核心业务场景。与此同时,提示词攻击正以惊人的速度演进为企业AI安全的头号威胁。研…

矩阵的秩

设运输问题的约束矩阵为: \[A = \begin{bmatrix} 1 & 1 & 1 & 0 & 0 & 0 \\[6pt] 0 & 0 & 0 & 1 & 1 & 1 \\[6pt] 1 & 0 & 0 & 1 & 0 & 0 \\[6pt] 0 &a…

Python列表推导式完全指南

从循环到一行代码:Python列表推导式完全指南 在Python中,列表推导式(List Comprehension)是一种简洁、高效的创建列表的语法。它能将原本需要多行循环+条件判断的代码,浓缩成一行可读性强的表达式。但对新手来说,…

Rockchip RK3588 - Mali-G610 GPU驱动(mesa+Panthor)

参考文章: [1] Rockchip RK3399 - Mali-T860 GPU驱动(mesa+Panfrost) [2] RK3588关于panthor驱动的移植 [3] ARM Mali GPU Upstream software, aka Lima/Panfrost

如何启用cycloneDDS的iceoryx共享内存?(转载)

我们如果使用的cycloneDDS版本是0.10以上的,用这个官方文档 共享内存交换 — Eclipse Cyclone DDS,0.11.0 如果是以下的,用这个 Shared Memory — Eclipse Cyclone DDS 0.8.2 documentation 首先我们需要先下载…

AI浪潮下的学习与就业:机遇还是陷阱?

最近刷到一堆AI相关的新闻,感觉整个科技圈都炸了。从OpenAI在大学里搞实验,到DeepCode在论文复现代码上碾压人类博士,再到微软悄悄去掉Copilot的警告提示,AI这玩意儿真是越来越猛了。作为一个学软件工程的,我一边…

如何从csdn中快速转载文章(转载)

原文链接:https://www.cnblogs.com/SymPny/p/17570360.html#:~:text=按住Ctrl%2BF快捷键,寻找"article_content" 在编辑界面直接粘贴。 界面如下:,转载成功! 参考文档: https%3A%2F%2Fblog.csdn.net%2F…

win10安装MongoDB 3.0.15 Community

win10安装MongoDB 3.0.15 Community 1、下载MongoDB 下载地址:https://www.mongodb.com/try/download/community-edition/releases/archive安装步骤运行安装程序‌:双击下载好的.msi文件,启动安装向导。接受许可协议…