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

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

一、基础

  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.gsyq.cn/news/38964.html

相关文章:

  • Linux驱动开发学习日记(一)
  • 微软 Foundry Local - 本地 AI 推理解决方案
  • win10 下运行aoe2,报错,应用程序无法正常启动 0xc000022
  • AI浪潮下的学习与就业:机遇还是陷阱?
  • 如何从csdn中快速转载文章(转载)
  • 一行“优雅”代码踩爆3x3矩阵:Python列表乘法的“共享引用”陷阱
  • 【C】 static用法
  • 模拟赛 31
  • P1.python环境的配置和安装
  • CSP-S 2025 游寄喵
  • Windows 10操作技巧:如何在 Windows 10 中恢复永久删除的文件
  • 2026 年预估适用于 Windows 10_11 的 10 款最佳数据恢复软件
  • 2025 年 9 款最佳 PDF 文档管理编辑工具
  • flex:1 什么意思
  • ESP32 I2C通信
  • day05-智能换脸-12306出行建议-提取音频工作流
  • x./AC自动机
  • 怎么在现有App里融入AI对话能力
  • DFS 序 O(1) 求 LCA
  • 矿山通信如何实现全域一体化?迈威为煤矿装上了“智慧神经网络”
  • 哈希学习总结
  • 2025 年 11 月制冷设备厂家推荐排行榜,小型制冷设备,空调制冷设备,工业制冷设备,商用制冷设备,大型制冷设备,制冷设备安装与维修服务公司推荐
  • 从创作到分析全搞定!2025公众号效率工具深度测评,这波升级95%的人还不知道
  • 20232304 2025-2026-1 《网络与系统攻防技术》实验四实验报告
  • k8s-java应用部署(4)
  • 单目三角化原理 - MKT
  • [CEOI 2017] Sure Bet
  • LeRobot v0.4.0 正式发布:全面提升开源机器人的学习能力
  • whk 笔记
  • 冬月做题记录