0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux驱动编程基础知识讲解

汽车玩家 来源:今日头条 作者:嵌入式在左C语言在 2020-03-01 08:27 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

由于Linux驱动编程的本质属于Linux内核编程,因此我们非常有必要熟悉Linux内核以及Linux内核的特点。 这篇文章将会帮助读者打下Linux驱动编程的基础知识。

本篇文章分为如下三个小节进行讲解:

1、Linux内核的组成(进程调度、内存管理、虚拟文件系统、网络接口和进程间通信);

2、Linux的用户空间和内核空间;

3、Linux内核的引导过程。

1、Linux内核的组成

1.1、Linux内核源代码的目录结构

读者朋友千万不要觉得了解目录结构对我们进行Linux开发没什么帮助,实际上目录体现了Linux的整体架构和思想,对于我们理解Linux是大有裨益的。Linux内核源代码包含如下目录:

arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录,如:ARM、PowerPC、MIPS等,在arch目录下,存放了各个不同的平台芯片对Linux内核进程调度、内存管理和中断等的支持;

block:块设备驱动程序调度(块设备不是我们学习的重点,前期学习中可忽略);

crypto:常用加密算法、一些压缩算法和CRC校验算法;

documentation:内核各部分的注释;

drivers:设备驱动程序,每个不同的驱动占用一个子目录,如char、net、i2c、spi等(重点来了,划重点了:高工资,设备驱动程序就是我们学习的重点,而开发过单片机程序的读者对驱动程序应该有更深刻的理解);

fs:所支持的各种文件系统,如EXT、FAT、NTFS等;

include:头文件,与系统相关的头文件放在include/linux的目录下;

init:内核初始化代码;

ipc:进程间通信的代码;

kernel:内核最核心的部分,包括进程调度和定时器等;

lib:库文件代码;

mm:内存管理代码:

net:网络相关代码,实现常见的网络协议;

scripts:用于配置内核的文件;

security:主要是一个SELinux模块;

sound:音频设备的驱动核心代码;

usr:实现用于打包和压缩等。

Linux驱动编程基础知识讲解

Linux的目录结构

1.2、进程调度

进程调度控制系统中的多个进程对CPU的访问,使得多个进程能够在CPU中“宏观并行、微观串行”地执行。进程调度处于系统的中心位置,内核其他的功能都依赖于它,因为每个子系统都需要挂起或者恢复进程。Linux进程会在几个状态之间进行切换,在设备驱动编程中,当请求的资源不能得到满足时,驱动一般或调度其他进程执行并使本进程进入睡眠状态,直到它请求的资源被释放,才会被系统唤醒从而进入就绪状态等待调度。绝大多数的进程是由我们的应用程序创建的,当它们存在硬件访问的需求时,会通过系统调用进入内核空间(文章的后面会讲到用户空间和内核空间的区别)。

1.3、内存管理

内存管理的主要作用是控制多个进程安全的共享内存区域。当CPU提供内存管理单元MMU时,Linux内存管理对于每个进程完成从虚拟内存到物理内存的转换。现在常用的处理器都是32位的,那么每个进程也就享有4GB(2的32次方)的内存空间,0~3GB属于用户空间,3~4GB属于内核空间。当然,这个界限是可以调整的,但是我们一般使用这个默认配置即可。

1.4、虚拟文件系统

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

1.5、网络接口

网络接口提供了对各种网络标准的存取和网络硬件的支持。在Linux中网络接口可分为网络协议和网络驱动程序,网络协议负责实现每一种可能的网络传输协议,网络设备驱动程序负责与硬件设备通信。Linux内核支持的协议栈很多,例如:Internet、NFC、Bluetooth等,在上层的应用程序中统一使用接口。看到这里,我想你也大概明白了吧,都是套路,我们需要学会这些调用API的套路。

1.6、进程间通信

Linux支持进程间的多种通信机制,包含信号量、共享内存、消息队列、管道等,这些机制可以协调多个进程、多个资源的互斥访问,进程间的同步和消息传递。这一部分也是我们后续学习的重点。

2、Linux内核的用户空间和内核空间

在Linux中分为用户空间和内核空间,我们开发时写的程序就是运行在用户空间,那我在这一节为什么又要说驱动的编程实质上就是内核的编程呢?这是因为我们完成驱动程序的开发之后,它是被编译进内核的,那它也就属于内核空间。在这种情况下,上层的程序是不能直接访问底层功能的,这就意味着应用程序是被禁止直接访问硬件和内存的,在应用程序中操作硬件的时候,其实发生了这样一个转换的过程:应用程序(用户空间)--->系统调用(文件系统)--->内核空间(驱动程序)。这样做有很多优点,最重要的一点是保证了系统的安全运行。

内核空间和用户空间这两个名词还用来区别程序执行的两种不同状态,也就是用户态和内核态,他们使用的是不同的地址空间。看到这里的读者还记不记得他们分别使用的地址空间呢?上文已经说过了哦。

Linux驱动编程基础知识讲解

用户和内核使用的地址空间

3、Linux内核的引导过程

SoC上电时,CPU0会先引导bootloader,而其他的CPU则判断自己是不是CPU0,进入等待状态等待CPU0来唤醒它。CPU0引导bootloader,bootloader引导Linux内核,在内核启动阶段,CPU0会发中断唤醒CPU1,之后CPU0和CPU1都投入运行。CPU0导致了用户空间的init初始化程序被调用,init程序再派生出其他进程,然后这些进程再派生出其他的进程 (看到这里你有没有想起单片机开发时的启动文件stm32f10x_startup.s,正因为有它帮我们把代码运行的环境都准备好了,所以我们才直接从main函数进入)

Linux驱动编程基础知识讲解

Linux系统的启动流程(大概看一下)

关于内核启动,与我们关系比较大的部分是每个平台的设备回调函数和属性信息,这些回调函数会在内核启动过程中被调用,后续的文章会进一步介绍。

相信读者已经对Linux的内核有了一个初步的了解,当然这只是初步的而已,更多更难的还在后面等着你呢!我们一步一步来,循序渐进的学习才能达到最好的效果。下一篇文章将介绍在Linux中 C语言编程的特点。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    11370

    浏览量

    226396
  • 接口
    +关注

    关注

    33

    文章

    9635

    浏览量

    157801
  • Linux
    +关注

    关注

    88

    文章

    11854

    浏览量

    219822
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何理解Linux内核中的PCIe驱动

    我们习惯了用 Verilog 去死磕 PCIe 的底层协议状态机。但一旦越过硬件边界来到操作系统层面,Linux 内核是如何接管并驱动这些 PCI/PCIe 设备的呢?由于不同的 CPU 架构实现了
    的头像 发表于 04-11 17:22 1402次阅读

    Linux内核驱动开发的技术核心精要

    嵌入式Linux驱动开发是连接硬件与操作系统的关键环节。随着内核演进(如Linux 6.13)和硬件复杂度提升,开发者需掌握并发控制、中断分层、内存管理、设备树、调试工具等核心知识。本
    发表于 03-10 13:56

    labview编程基础知识分享

    最近建了一个公众号,本人会在上面进行labview编程知识的分享,欢迎大家关注;公众号叫:上位机知识分享LABVIEW
    发表于 02-13 10:08

    阻燃系列基础知识

    我很荣幸有机会在这里与大家分享我对阻燃系列基础知识的研究。今天,我们将探讨的主题是“阻燃系列基础知识”。在我们日常生活中,火灾事故频发,造成巨大的财产损失和人员伤亡。因此,了解阻燃材料的基础知识对于
    的头像 发表于 02-06 08:07 740次阅读
    阻燃系列<b class='flag-5'>基础知识</b>

    深度解析ES8389/ES8390/音频芯片Linux驱动Linux6.1内核)

    基于 Linux6.1 内核,从驱动架构、寄存器配置、核心函数、数据流走向四个维度,完整拆解 ES8389 的 Linux 驱动实现,帮你吃透这款芯片的
    的头像 发表于 02-02 11:37 2900次阅读
    深度解析ES8389/ES8390/音频芯片<b class='flag-5'>Linux</b><b class='flag-5'>驱动</b>(<b class='flag-5'>Linux</b>6.1内核)

    无刷电机驱动器的基础知识

    本文将从技术角度出发,对三相无刷电机的电机驱动器的作用、种类和规格进行介绍。通过本文,您可以学习到电机驱动器选型所需的基础知识
    的头像 发表于 12-10 14:13 7035次阅读
    无刷电机<b class='flag-5'>驱动</b>器的<b class='flag-5'>基础知识</b>

    嵌入式应掌握的几种能力

    RT-Thread等。学习操作系统内核知识:线程调度、时钟管理、线程间同步、线程间通信、内存管理、设备管理等,并掌握基本的使用。 再熟悉Linux操作系统的基本使用。 再学习Linux下的应用开发
    发表于 12-08 06:05

    Linux驱动开发的必备知识

    内核基础知识: 1、熟悉 Linux 内核的架构、模块系统、进程管理、内存管理等。 了解内核的编译和加载过程。 2、C编程技能: 精通 C 语言编程,包括指针操作、内存管理、结
    发表于 12-04 07:58

    RK 平台 Vendor Storage 开发指南:基础知识、流程与实用技巧

    备可靠性校验、掉电恢复等关键特性,是保障设备身份标识、功能授权等核心信息安全的重要组件。本文将从基础知识、开发流程、使用途径三方面,为开发者梳理完整的开发逻辑。 一、核心基础知识:了解 Vendor Storage 是什么? 1. 核心定位与核心特性 Vendor Sto
    的头像 发表于 11-22 07:11 1428次阅读
    RK 平台 Vendor Storage 开发指南:<b class='flag-5'>基础知识</b>、流程与实用技巧

    【免费送书】成为硬核Linux开发者:《Linux 设备驱动开发(第 2 版)》

    Linux系统的设备驱动开发,一直给人门槛较高的印象,主要因内核机制抽象、需深度理解硬件原理、开发调试难度大所致。2021年,一本讲解驱动开发的专著问世即获市场青睐,畅销近万册——这便
    的头像 发表于 11-18 08:06 1953次阅读
    【免费送书】成为硬核<b class='flag-5'>Linux</b>开发者:《<b class='flag-5'>Linux</b> 设备<b class='flag-5'>驱动</b>开发(第 2 版)》

    【书籍评测活动NO.67】成为硬核Linux开发者:《Linux 设备驱动开发(第 2 版)》

    ——这便是《Linux 设备驱动开发》。本书从基础知识出发,分专题透彻讲解Linux环境下的设备驱动
    发表于 11-17 17:52

    视觉工程师必须知道的工业相机基础知识

    工业相机基础知识概述。
    的头像 发表于 09-19 17:04 1820次阅读
    视觉工程师必须知道的工业相机<b class='flag-5'>基础知识</b>

    【「Yocto项目实战教程:高效定制嵌入式Linux系统」阅读体验】+基础概念学习理解

    。为了对珠峰更了解些,开始接触 Linux 系统开发,并逐渐认识到 Yocto 项目在定制嵌入式 Linux 系统方面的重要性。所以很想拜读下此书。 二、书籍内容概述 基础知识 书中首先回顾了
    发表于 08-04 22:29

    IGBT驱动与保护电路设计及 应用电路实例

    本书结合国内外IGBT的发展和最新应用技术,以从事IGBT应用电路设计人员为本书的读者对象,系统、全面地讲解了IGBT应用电路设计必备的基础知识,并选取和总结了IGBT的典型应用电路设计实例,以供
    发表于 07-14 17:32

    【「Yocto项目实战教程:高效定制嵌入式Linux系统」阅读体验】01初读体验

    顺序为从基础到进阶,从进阶到实战,也就是说前面的部分偏理论知识学习,后端知识偏向于项目应用 Yocto可能能解决目前linux源码中的无用代码过多的问题(我一直觉得linux,zepy
    发表于 06-30 21:49