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

Linux驱动开发学习笔记

第1章 Linux驱动开发的方式

  1. mmap映射型设计方法。【不推荐】
    • 将芯片上的物理地址映射到用户空间的虚拟地址上,用户操作虚拟地址来操作硬件。
  2. 使用文件操作集(file_operatiopns)设计方法。【极致推荐】
  3. platfrom总线型设置方法。【比较流行】
  4. 设备树。【推荐】

第2章 Linux设备分类

2.1 字符设备

  1. LED
  2. 显卡
  3. 声卡
  4. USB
  5. 鼠标
  6. 键盘
  7. 触摸屏

2.1.1 字符设备特点

  1. 按字节流顺序访问

    • 数据以字节为单位进行读写,像“流”一样,通常不支持随机访问。
    • 例如:串口、键盘、鼠标、LED 驱动等。
  2. 不经过文件系统缓冲(可选)

    • 可以直接进行 read()write() 系统调用,绕过内核页缓存(也可以使用缓存)。
    • 支持非阻塞 I/O、异步 I/O。
  3. 无固定块大小概念

    • 传输单位是字节或任意大小的数据块,不像块设备固定为 512B 或 4KB。
  4. 设备文件通常位于 /dev

    • 如 /dev/ttyS0/dev/leds/dev/mychardev
    • 主设备号(major)标识设备类型,次设备号(minor)标识具体设备。
  5. 常见操作函数

    • openclosereadwriteioctl 等。
  6. 不需要文件系统支持即可访问

    • 可以直接通过系统调用操作设备文件

2.2 块设备

  1. 硬盘
  2. nand flash
  3. SD卡
  4. U盘
  5. eMMC卡

2.2.1  块设备特点

  1. 以“块”为单位进行数据传输

    • 块大小通常是 512 字节、4KB 等,必须是 2 的幂。
    • 所有 I/O 操作都对齐到块边界。
  2. 支持随机访问

    • 可以直接读写任意一个数据块(如第 1000 个块),适合存储设备。
  3. 通过内核缓冲区(页缓存)进行 I/O

    • 块设备 I/O 通常经过 Buffer Cache 或 Page Cache,提高性能。
    • 支持写缓存、预读等优化。
  4. 通常用于存储系统

    • 是文件系统(如 ext4、XFS)的底层载体。
  5. I/O 请求被放入请求队列(request queue)

    • 内核可以对请求进行合并、排序(电梯算法),提高效率。
  6. 设备文件在 /dev

    • 如 /dev/sda/dev/sda1/dev/mmcblk0
  7. 可被挂载为文件系统

    • 例如:mount /dev/sda1 /mnt

块设备驱动带有缓存。

2.3 网络设备

  1. 无线网卡
  2. 有线网卡

2.3.1 网络设备的特点

  1. 不支持文件操作接口

    • 没有 open()read()write() 等系统调用。
    • 不创建传统意义上的设备文件(如 /dev/eth0 不存在)。
  2. 通过套接字(socket)接口访问

    • 用户通过 socket()send()recv()ioctl() 等进行网络通信。
  3. 数据以“包”(packet)为单位传输

    • 面向数据包,不是字节流或块。
    • 支持协议栈(如 TCP/IP)。
  4. 双向传输:发送和接收队列

    • 有独立的发送队列(TX queue)和接收队列(RX queue)。
    • 使用中断或 NAPI 处理数据包。
  5. 由内核网络子系统管理

    • 属于 net_device 结构体管理,不是 inode
    • 通过 ifconfigip 命令配置。
  6. 支持多种协议

    • 如以太网、Wi-Fi、PPP、虚拟网卡(tun/tap)等。
  7. 没有设备号(major/minor)

    • 不属于字符或块设备,因此不参与 dev_t 编号系统。

第3章 设备驱动框架

3.1 驱动框架

3.1 程序调用流程

第4章 重要驱动函数

4.1 调试信息

级别名称(宏)数字描述(用途)
KERN_EMERG0紧急(Emergency):系统崩溃,几乎无法运行。如:"System is down"
KERN_ALERT1警报(Alert):必须立即处理的问题。如:"Kernel panic"
KERN_CRIT2严重(Critical):严重错误,如硬件故障、关键服务失败。
KERN_ERR3错误(Error):运行时错误,影响功能但系统仍可运行。
KERN_WARNING4警告(Warning):潜在问题,可能出错,但尚未失败。
KERN_NOTICE5注意(Notice):正常但重要的情况,需引起注意。
KERN_INFO6信息(Informational):普通信息,如设备初始化成功。
KERN_DEBUG7调试(Debug):调试信息,仅开发时使用,生产环境通常关闭。
printk(KERN_INFO "This is an info message\n");
printk(KERN_ERR "Failed to allocate memory\n");
printk(KERN_DEBUG "Debug: i = %d\n", i);

第5章 自动生成设备文件

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

相关文章:

  • web自动化测试(selenium)
  • [架构之美]pdf压缩实战笔记(十五)
  • FlutterUnit 3.3.0 | 全组件、全属性、鸿蒙支持来袭
  • 高德开放平台智能眼镜解决方案,Rokid Glasses AR导航实测
  • Proxy 我踩过的那些坑
  • apache-jmeter-5.1.1安装部署与使用教程(小白一看就会)​
  • 【游戏开发】街景风格化运用到游戏中,一般有哪些风格可供选择?
  • 【实测】安装最新Unity6的常规操作
  • intellij idea2021.3.3版本如何获取永久权限
  • 第二章:技术基石:写出“活”的代码(1)
  • 基础算法之二分算法 --- 1
  • AI-调查研究-67-具身智能 核心技术构成全解析:感知、决策、学习与交互的闭环系统
  • DVWA靶场通关笔记-DOM型XSS(Impossible级别)
  • 服务器托管需要注意什么事项?
  • STM32CUBEMX配置LAN8720a实现UDP通信
  • pycharm无法添加本地conda解释器/命令行激活conda时出现很多无关内容
  • 阿里云国际代理商:如何重置阿里云服务器密码?
  • 【ComfyUI】SDXL Turbo一步完成高速高效的图像生成
  • UNet改进(37):AxialDynamicConv2D原理剖析与实战应用
  • 【开发技术】Lucene.NET入门指南
  • 消息存储机制-索引文件及页缓存
  • 爬虫逆向--Day20Day21--JS逆向案例之Webpack逆向
  • GPT-5在医疗领域应用的研究效能初探(下)
  • iOS混淆工具实战 视频流媒体类 App 的版权与播放安全保护
  • 【Python语法基础学习笔记】竞赛常用标准库
  • 在 macOS 下升级 Python 几种常见的方法
  • 矩阵scaling预处理介绍
  • 自动化运维-ansible中的循环应用
  • Maven + JUnit:Java单元测试的坚实组合
  • MYSQL 认识事务