当前位置: 首页 > 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.jsqmd.com/news/30415/

相关文章:

  • Linux驱动开发学习日记(一)
  • Windows 路由表详解
  • 微软 Foundry Local - 本地 AI 推理解决方案
  • 如何启用cycloneDDS的iceoryx
  • 老化车
  • Android Studio 2025.2.1 汉化中文包临时解决方案
  • Markdown 学习训练
  • jmeter设置中文页面的两种方法
  • win10 下运行aoe2,报错,应用程序无法正常启动 0xc000022
  • Python生成器表达式详解(含与列表推导式核心对比、别名探讨)
  • 在Fiddler中模拟网络中断,返回500错误的过程
  • P4198 楼房重建 分析
  • 构建企业级AI提示词攻击防御体系的实战指南-2025年
  • 矩阵的秩
  • Python列表推导式完全指南
  • Rockchip RK3588 - Mali-G610 GPU驱动(mesa+Panthor)
  • AI浪潮下的学习与就业:机遇还是陷阱?
  • win10安装MongoDB 3.0.15 Community
  • auto
  • 一行“优雅”代码踩爆3x3矩阵:Python列表乘法的“共享引用”陷阱
  • 写给创业者新手:什么是MAU指标,什么是ARR、PMF
  • git不小心把本地从未提交过的贮藏的版本删掉了,如何恢复?
  • ffmpeg安装配置
  • 【C】 static用法
  • Python线程锁
  • 若依前端验证码的实现
  • 从O(n)到O(n):Python字符串拼接的效率陷阱与最佳实践
  • 实验4:MobileNet ShuffleNet - OUC
  • 模拟赛 31
  • CSP-S 2025 T3 小结