Linux设备驱动开发详解1

简介: Linux设备驱动开发详解

前言

  本文主要用来摘录《Linux设备驱动开发详解第四版》一书中学习知识点,本书基于 Linux 4.0 版本,源代码摘录基于 Linux 4.15.18 ,两者之间可能有些出入。

资源链接: 宋宝华《Linux设备驱动开发详解》

一、Linux设备驱动概述及开发环境构建

  • 设备驱动的作用
  • 无操作系统时的设备驱动
  • 有操作系统时的设备驱动
  • Linux设备驱动
  • Linux设备驱动的开发环境构建
  • 设备驱动Hello World:LED驱动

二、驱动设计的硬件基础

  • 处理器
  • 存储器
  • 接口与总线
  • CPLD和FPGA
  • 原理图分析
  • 硬件时序分析
  • 芯片数据手册阅读方法
  • 仪器仪表使用

三、 Linux内核及内核编程

1、Linux内核的发展与演变

    Linux 操作系统是 UNIX 操作系统的一种克隆系统,是一种类 UNIX 操作系统,诞生于1991年10月5日(第一次正式向外公布的时间),起初的作者是 Linus Torvalds。Linux 操作系统的诞生、发展和成长过程依赖着 5 个重要支柱:UNIX 操作系统、Minix 操作系统、GNU 计划、POSIX 标准和 Internet

2、Linux 2.6后的内核特点

  1. 新的调度器
  2. 内核抢占
  3. 改进的线程模型
  4. 虚拟内存的变化
  5. 文件系统
  6. 音频
  7. 总线、设备和驱动模型
  8. 电源管理
  9. 联网和IPSec
  10. 用户界面层
  11. Linux 3.0后ARM架构的变更

3、Linux内核的组成

(1)Linux内核源代码的目录结构

  • arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录,如 i386、arm、arm64、
    powerpc、mips 等。Linux 内核目前已经支持 30 种左右的体系结构。在 arch 目录下,存放的是各个平台以及各个平台的芯片对 Linux 内核进程调度、内存管理、中断等的支持,以及每个具体的 SoC 和电路板的板级支持代码。
  • block:块设备驱动程序 I/O 调度。
  • crypto:常用加密和散列算法(如 AES、SHA 等),还有一些压缩和 CRC 校验算法。
  • documentation:内核各部分的通用解释和注释。
  • drivers:设备驱动程序,每个不同的驱动占用一个子目录,如 char、block、net、mtd、i2c 等。
  • fs:所支持的各种文件系统,如 EXT、FAT、NTFS、JFFS2 等。
  • include:头文件,与系统相关的头文件放置在 include/linux 子目录下。
  • init:内核初始化代码。著名的 start_kernel() 就位于 init/main.c 文件中。
  • ipc:进程间通信的代码。
  • kernel:内核最核心的部分,包括进程调度、定时器等,而和平台相关的一部分代码放 arch/*/kernel 目录下。
  • lib:库文件代码。
  • mm:内存管理代码,和平台相关的一部分代码放在 arch/*/mm 目录下。
  • net:网络相关代码,实现各种常见的网络协议。
  • scripts:用于配置内核的脚本文件。
  • security:主要是一个 SELinux 的模块。
  • sound:ALSA、OSS 音频设备的驱动核心代码和常用设备驱动。
  • usr:实现用于打包和压缩的 cpio 等。
  • include:内核API级别头文件。

    内核一般要做到 driversarch 的软件架构分离,驱动中不包含板级信息,让驱动跨平台。同时内核的通用部分(如 kernel、fs、ipc、net 等)则与具体的硬件( arch 和 drivers )剥离。

(2)Linux内核的组成部分

    Linux 内核主要由进程调度(SCHED)、内存管理(MM)、虚拟文件系统(VFS)、

网络接口(NET)和进程间通信(IPC)5 个子系统组成。

① 进程调度


② 内存管理

【操作系统】进程空间管理

③ 虚拟文件系统

    Linux 虚拟文件系统隐藏了各种硬件的具体细节,为所有设备提供了统一的接口。而且,它独立于各个具体的文件系统,是对各种文件系统的一个抽象。它为上层的应用程序提供了统一的 vfs_read()vfs_write() 等接口,并调用具体底层文件系统或者设备驱动中实现的 file_operations 结构体的成员函数。

④ 网络接口

    网络接口提供了对各种网络标准的存取和各种网络硬件的支持。


⑤ 进程间通信

    Linux 支持进程间的多种通信机制,包含信号量、共享内存、消息队列、管道、UNIX 域套接字等,这些机制可协助多个进程、多资源的互斥访问、进程间的同步和消息传递。在实际的 Linux 应用中,人们更多地趋向于使用 UNIX 域套接字,而不是 System V IPC 中的消息队列等机制。Android 内核则新增了 Binder 进程间通信方式。

    Linux 内核 5 个组成部分之间的依赖关系如下。

进程调度与内存管理之间的关系:这两个子系统互相依赖。在多程序环境下,程序要运行,则必须为之创建进程,而创建进程的第一件事情,就是将程序和数据装入内存。

进程间通信与内存管理的关系:进程间通信子系统要依赖内存管理支持共享内存通信机制,这种机制允许两个进程除了拥有自己的私有空间之外,还可以存取共同的内存区域。

虚拟文件系统与网络接口之间的关系:虚拟文件系统利用网络接口支持网络文件系统(NFS),也利用内存管理支持 RAMDISK 设备。

内存管理与虚拟文件系统之间的关系:内存管理利用虚拟文件系统支持交换,交换进程定期由调度程序调度,这也是内存管理依赖于进程调度的原因。当一个进程存取的内存映射被换出时,内存管理向虚拟文件系统发出请求,同时,挂起当前正在运行的进程。

    除了这些依赖关系外,内核中的所有子系统还要依赖于一些共同的资源。这些资源包括所有子系统都用到的 API ,如分配和释放内存空间的函数、输出警告或错误消息的函数及系统提供的调试接口等。

(3)Linux内核空间与用户空间

    ARM Linux 的系统调用实现原理是采用 swi 软中断从用户(usr)模式陷入管理模式(svc)。

4、Linux内核的编译及加载

(1)Linux内核的编译

make config     #(基于文本的最为传统的配置界面,不推荐使用)
make menuconfig   #(基于文本菜单的配置界面)
make xconfig    #(要求QT被安装)
make gconfig    #(要求GTK+被安装)

    内核配置包含的条目相当多,arch/arm/configs/xxx_defconfig 文件包含了许多电路板的默认配置。只需要运行 make ARCH=arm xxx_defconfig 就可以为 xxx 开发板配置内核。

编译内核和模块的方法是:

make ARCH=arm xxx_defconfig   # 使用默认配置
make ARCH=arm zImage
make ARCH=arm modules

   上述命令中,如果 ARCH=arm 已经作为环境变量导出,则不再需要在 make 命令后书写该选项。执行完上述命令后,在源代码的根目录下会得到未压缩的内核映像 vmlinux 和内核符号表文件 System.map ,在 arch/arm/boot/ 目录下会得到压缩的内核映像 zImage,在内核各对应目录内得到选中的内核模块。

(2)Kconfig 和 Makefile

    在 Linux 内核中增加程序需要完成以下 3 项工作。

  • 将编写的源代码复制到 Linux 内核源代码的相应目录中。
  • 在目录的 Kconfig 文件中增加关于新源代码对应项目的编译配置选项。
  • 在目录的 Makefile 文件中增加对新源代码的编译条目。

(3)Linux内核的引导


Linux设备驱动开发详解2:https://developer.aliyun.com/article/1597417

目录
相关文章
|
26天前
|
Ubuntu 搜索推荐 Linux
详解Ubuntu的strings与grep命令:Linux开发的实用工具。
这就是Ubuntu中的strings和grep命令,透明且强大。我希望你喜欢这个神奇的世界,并能在你的Linux开发旅程上,通过它们找到你的方向。记住,你的电脑是你的舞台,在上面你可以做任何你想做的事,只要你敢于尝试。
100 32
|
3月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
539 76
|
1月前
|
安全 Ubuntu Linux
Nipper 3.8.0 for Windows & Linux - 网络设备漏洞评估
Nipper 3.8.0 for Windows & Linux - 网络设备漏洞评估
70 0
Nipper 3.8.0 for Windows & Linux - 网络设备漏洞评估
|
2月前
|
运维 安全 Linux
试试Linux设备命令行运维工具——Wowkey
WowKey 是一款专为 Linux 设备设计的命令行运维工具,提供自动化、批量化、标准化、简单化的运维解决方案。它简单易用、高效集成且无依赖,仅需 WIS 指令剧本文件、APT 账号密码文件和 wowkey 命令即可操作。通过分离鉴权内容与执行内容,WowKey 让运维人员专注于决策,摆脱繁琐的交互与执行细节工作,大幅提升运维效率与质量。无论是健康检查、数据采集还是配置更新,WowKey 都能助您轻松应对大规模设备运维挑战。立即从官方资源了解更多信息:https://atsight.top/training。
|
2月前
|
数据采集 运维 安全
Linux设备命令行运维工具WowKey问答
WowKey 是一款用于 Linux 设备运维的工具,可通过命令行手动或自动执行指令剧本,实现批量、标准化操作,如健康检查、数据采集、配置更新等。它简单易用,只需编写 WIS 指令剧本和 APT 帐号密码表文件,学习成本极低。支持不同流派的 Linux 系统,如 RHEL、Debian、SUSE 等,只要使用通用 Shell 命令即可通吃Linux设备。
|
3月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
8月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
262 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
9月前
|
存储 Linux 开发工具
如何进行Linux内核开发【ChatGPT】
如何进行Linux内核开发【ChatGPT】
|
10月前
|
存储 缓存 Unix
Linux 设备驱动程序(三)(上)
Linux 设备驱动程序(三)
124 3
|
10月前
|
Linux
Linux 设备驱动程序(四)
Linux 设备驱动程序(四)
85 1