【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来!

《QT开发实战》

《嵌入式通用开发实战》

《从0到1学习嵌入式Linux开发》

目录

0 引言

1 什么是Linux驱动?

2 Linux驱动程序需要掌握的内容

3 Linux驱动可参考的资源

4 ARM处理器体系架构

5 ARM的前世今生


0 引言

前面Linux专题中关于Linux下系统编程总结了17篇博文,主要是为了提高Linux下的C编程应用能力,熟悉Linux编程应用环境,从此篇博文起开始Linux驱动的总结,后面计划加一些综合实践项目练习。

1 什么是Linux驱动?

做过嵌入式的都知道裸机程序和带操作系统的程序,这里就不展开讲了,初学者最开始接触的都是裸机程序,main中while大循环跑天下。实际上,掌握了操作系统后,我们会发现基于操作系统的开发更高效,可以分工协作,A去开发应用层软件,B去开发操作系统相关的,C去开发驱动程序,D做底层硬件。

说到这里,从顶层到底层正好是A到D的顺序,驱动程序就是联接操作系统和硬件之间的桥梁,驱动程序多半都是和硬件打交道的,如何让硬件更好、稳定的运行起来,这就是看驱动程序的好坏了,它对上需要提供硬件操作的相关接口。对于顶层的应用软件,无法直接调动硬件,是通过操作系统调用驱动程序提供的接口间接进行的,这样各层各司其职,对于整体系统来说也更稳定可靠,假如每个应用都能直接操作硬件,那才是最大的隐患。

Linux驱动又具体包含三种:一般后两种,处理器厂家都会提供BSP支持包,我们不需要做什么,开发中涉及最多的就是字符设备。

  • 字符设备驱动:大部分都是字符设备,如GPIO、LED、串口、蜂鸣器、声卡等
  • 块设备驱动:存储设备,如U盘、硬盘、TF卡等
  • 网络设备驱动:通信设备,如wifi、以太网等

2 Linux驱动程序需要掌握的内容

1)GPIO,通用输入输出口

单片机中只需要对寄存器进行设置操作就可以了,但在高端处理器中,就没那么简单了。

2)内存管理单元MMU

MMU是单片机和处理器的一个区别,普通的51单片机一般叫MCU(微控制器),ARM处理器一般叫MPU(微处理器),后者加入了内存管理单元。MMU是一种负责处理处理器的内存访问请求的硬件。它的功能包括虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、中央处理器高速缓存的控制,在较为简单的计算机体系结构中,负责总线的仲裁以及存储体切换。

3)Linux中一切皆文件

Linux中一切都被看成是文件,把设备也看成文件,所以字符设备驱动的编程路子就是做一组设备对应的驱动函数,使能能用open、read、write、ioctrl、close像操作文件一样进行操作。

4)设备节点

要想用户进程与内核下的硬件进行通信,就需要建立一个设备节点,前面Linux系统编程时也是见过的,比如在开发板新插上一个U盘,使用fdisk -l指令查看,/dev/sda1就是我们新插U盘的一个设备节点。

5)上层应用如何操作外部设备

这个应该说是做嵌入式的一个常规操作了,简单说下,大致思路基本都是一样的,举个很简单例子,我们要用控制器的某个 IO 口开关蜂鸣器,该如何操作:首先根据原理图确定是那个pin,然后去控制器的datasheet中查找操作这个IO口的对应寄存器,明确物理地址,然后根据手册要求向该物理地址写数据控制IO口输出高低电平,进而控制了蜂鸣器的关断。

写到这里,是不是感觉和刚上大学时玩51单片机的套路差不多?是的,其实裸机程序中都是这么操作外设的,但是如果上了Linux,启动了MMU,就不是直接对物理地址进行操作了,而是把物理地址先转换为虚拟地址,然后对虚拟地址进行操作的。

6)底层驱动的编写方式,并注册到系统(register_chrdev())

7)MISC杂项设备(混杂设备):简化了驱动的编写

8)模块(module):驱动调试时以模块的形式进行驱动的加载和卸载

3 Linux驱动可参考的资源

Linux本身就是一个开源软件,开源的好处大家都知道,资料丰富,我们做Linux驱动开发,能找到技术支持和相应资源的有如下,列出的,对于新手来说,建议最佳的顺序是从1到5:

1)开发板厂家:比如原子、讯为等,提供大量的学习资料,这个对于新手小白来说建议是首选的;

2)Linux开发工程师:这个就是广大的开发网友了,有论坛、有博客等参照学习。

3)主控芯片原厂:如iMX6、4412等,原厂会在Linux官方代码基础上,加入适配自己主控的SDK等;

4)外设芯片原厂:比如4G、wifi、声卡、显卡芯片等,这么复杂的全自己搞可麻烦了,这些外设原厂会给对应的驱动,我们自己参照移植即可;

5)Linux官方:https://www.kernel.org,有Linux原始的内核代码;

Linux驱动如何学习和理解,借用大神总结的话,在此记录下,我初次看时感觉很受用,理解的很到位:

上层是文件系统和应用,中层是Linux内核,下层是底层硬件,Linux驱动是介于文件系统和底层硬件之间的,是嵌入到内核中的程序,应用是嵌入到文件系统中的程序,比如Android APP。

对上:Linux设备驱动给上层提供调用的接口;

对中:Linux设备驱动要注册到内核中,标准说法是 挂载在总线上;

对下:直接操作硬件,如GPIO、IIC、SPI、PWM等;

以上三个,Linux内核都提供了大量的接口函数、结构体,其实Linux驱动,就是掌握了这些东西怎么用,适应到自己要写的驱动程序中。

4 ARM处理器体系架构

ARM体系架构中区别于单片机的比较突出的体现在有了CACHE 高速缓存和MMU 内存管理单元,ARM体系架构还是比较繁杂的,我们一步步说起,有些基础的概念,就当是温故学习了。

1) CPU中央处理器

CPU到现在都在遵循经典的 冯诺依曼存储结构,CPU其实就是一堆数字电路,与门、或门、非门、触发器等组成,这些单个拿出来都认识,放在一起就复杂了。每个处理器(51、PIC、ARM、X86)都有自己对应的一套指令系统,处理的数字电路就是对套指令系统进行解析,并不断从存储器中按顺序取指令去执行。后来,在冯诺依曼结构基础上,又有了创新的哈佛结构,取指令和取数据分开,可以同时进行。

扩展的点一下,评价一个处理器一般从四方面:频率、性能(MIPS/MHz,MIPS指的是每秒能够处理的指令数)、功耗、面积。

2)指令系统

可以把它看成是一套API,一个软硬件的分界面,这是在计算机系统体系结构中比较重要的思想。对于软件开发人员,只需要知道指令系统就行,知道每一条指令的作用,直接调用指令去实现要操作的功能,至于怎么实现这个操作的,不需要自己掌握;对于处理器设计人员,需要做的是把指令解析,执行。

指令系统分两类:RISC 经典指令集和CISC复杂指令集,早期的处理器如8051、X86用的是CISC,ARM、MIPS、PowerPC等都是用的RISC,RISC指的是每条指令执行的时间相同,指令长度相同,为什么后期会有RISC呢?存在即合理,RISC的指令执行时间和指令长度相同的特点,便于实现流水线,可以使一些多项操作在时间上进行重叠进行,便于提高系统的主频,进而提高处理性能。

3)Cache高速缓存

Cache高速缓存,是CPU与内存之间的高速存储子系统,作用就是为了提高CPU访问内存的速度,高速缓存一般是SRAM,内存一般是DRAM,后者成本较低些。

为什么说高速缓存的存在提高CPU访问存储器的速度?原理是这样的,CPU存取数据首先到高速缓存中去找,若找到的话直接就用,没有的话就会到存储器中去找,同时这部分指令或相关的数据会放到内存中,CPU下次再存取数据的话,就直接能从高速缓存中获取了,总体上提高了系统性能,提高了存储器的平均访问速度,使存储器的速度和CPU的速度匹配。

既然高速缓存速度这么快(一般CPU访问速度是寄存器>高速缓存>内存),那么CPU直接集成大点的高速缓存不就OK了吗,为什么还有额外配置内存呢?答案就是它贵啊,采用CPU+高速缓存+内存的架构性价比较高,也不仅仅是贵的问题,另外,比较重要的一点是,处理器和存储器的性能差距每年大约在以50%d的速度增大,像CPU每18个月其性能都会翻一番,但是存储器发展速度就没那么快了(跟器件工艺相关性比较大),所以采用这种架构很好的平衡了这两点。

4)内存管理单元MMU

内存管理单元实现了虚拟地址到物理地址的转换,ARM上面跑Linux系统,编程用的地址都是虚拟地址,物理地址到虚拟地址的转换是通过ioremap函数实现的。MMU其实就是维护下面这样一个映射表格,ioremap通过查找这个映射表实现虚拟地址到物理地址的转换。

MMU主要应用方面的作用包括:辅助实现虚拟内存、辅助实现多任务管理。

虚拟存储器的空间大小取决于处理器的访存能力,不是实际外存的大小,比如ARM处理器有32、64位系统,32位系统2^32=4G,说明处理器有能力访问4G内存的范围,也就是程序开发人员可以操作的内存范围是4G的,就算实际内存有8G,也只能操作4G的空间,这就是为什么我们PC机8G的内存,一般都是装的64位系统的原因,否则就是浪费硬件嘛。

虚拟内存可以实现既具有外存的容量(PC机中的硬盘、ARM系统中的EMMC/FLASH),又有接近内存的访问速度的效果。

5 ARM的前世今生

ARM全名Advanced Risc Machines,Ltd,ARM公司是1990年成立的,这个公司牛的是自己并不产芯片,是设计公司,只提供IP,处理器的设计方案,ARM芯片厂商需要从ARM手里买IP核做自己的ARM芯片。主要ARM芯片厂商有哪些?我们常见的:

外企:SAMSUNG、TI、Freescale、Intel、NXP、Atmel

国产:联发科、华为、瑞芯微、全志,现在IC国产化兴起,还有很多国内公司,像中科芯、紫光展锐等。

ARM处理器的架构(指的是结构设计)从V3发展到V8,这里的架构不是具体的产品,类似于设计框架,具体的产品像ARM7、ARM8、ARM11、Cortex的A/R/M系列,下面是网络上找的一张图,参考下,发展的时间线也是这样走的。ARM处理器目标就是做出低功耗、低成本的方案,其大量使用了寄存器、指令长度固定,具有领先的性能和功耗。

目前主流的Cortex系列,包含了A、R、M、Secure四个分支,A 系列是性能最强悍的,面向平板电脑应用等,可以说对标 X86了;R系列面向实时处理场景,像工业控制、汽车领域;M系列性价比较高,一般民用、消费品等;Secure系列主要面向安全产品。可以看出ARM公司基本把所有的领域都覆盖了,这个公司还是比较可怕的。

作于202104062140,已归档

———————————————————————————————————

本文为博主原创文章,转载请注明出处!

若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!

祝君升职加薪,鹏程万里!

Linux——Linux驱动之基本理论常识总结(什么是Linux驱动?Linux驱动需要掌握哪些?ARM处理体系架构及前世今生)相关推荐

  1. ARM嵌入式体系架构(理论篇)

    [基础知识] (1)电路中的逻辑状态:0代表的是低电平,1代表高电平 (2)半导体元开关: [1]二极管 单向导通性 普通二极管 发光二极管 光敏二极管 稳压二极管 [2]三极管(开关特性) C :集 ...

  2. linux网络驱动架构,Linux网络体系架构和网卡驱动设计

    Linux网络体系架构 1.Linux的协议栈层次 2.Linux的网络子系统架构 Linux的协议栈层次 Linux的优点之一在于它丰富而稳定的网络协议栈.其范围从协议无关层(例如通用socket层 ...

  3. 【正点原子Linux连载】第六十七章 Linux USB驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  4. linux判断网卡是否挂载,检查网卡是否加载 - Linux服务器网卡驱动安装及故障排除_服务器应用_Linux公社-Linux系统门户网站...

    2.检查网卡是否加载: 驱动硬件是操作系统最基本的功能,操作系统通过各种驱动程序来驾驭硬件设备,和Windows系统不同Linux内核目前采用可加载的模块化设计(LKMs Loadable Kerne ...

  5. Linux块设备驱动(二)————块设备的体系架构

    块设备的体系架构从上到下依次为VFS虚拟文件系统.磁盘缓冲.各种类型的磁盘系统.通用块设备层.I/O调度层(优化访问上层的请求(读写请求)).块设备驱动层.块设备硬件层. 1.虚拟文件系统(VFS) ...

  6. 《Android深度探索(卷1):HAL与驱动开发》——6.4节使用多种方式测试Linux驱动...

    本节书摘来自异步社区<Android深度探索(卷1):HAL与驱动开发>一书中的第6章,第6.4节使用多种方式测试Linux驱动,作者李宁,更多章节内容可以访问云栖社区"异步社区 ...

  7. 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】PowerPC + Linux2.6.25平台下的I2C驱动架构分析

    PowerPC + Linux2.6.25平台下的I2C驱动架构分析 Sailor_forever  sailing_9806#163.com (本原创文章发表于Sailor_forever 的个人b ...

  8. 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】PowerPC + Linux2.6.25平台下的SPI驱动架构分析

    PowerPC + Linux2.6.25平台下的SPI驱动架构分析 Sailor_forever  sailing_9806#163.com (本原创文章发表于Sailor_forever 的个人b ...

  9. Linux系统驱动全吗,linux系统需要给硬件安装驱动程序么?谁推荐一下linux系统阿~要驱动最全...

    需要,不过大部分linux都自带,少量的也都有自动安装文件 比如ati的显卡驱动什么的. 之前还自己写过驱动,linux的驱动比windows的驱动透明度高很多 大部分硬件基本上 都可以识别的 也可以 ...

最新文章

  1. RAC 实例 迁移到 单实例 -- 使用导出导入
  2. 以太网应用于控制时存在的问题
  3. Linux 下安装JDK1.8-解压版
  4. 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群 (2)
  5. 滴滴缺席的这 11 个月,顺风车迷局如何破?
  6. 安卓手机小说阅读器_粉笔免费小说阅读器app下载-粉笔免费小说阅读器手机版下载v1.0.1...
  7. 写给大家看的设计模式
  8. 数据库中的左连接和右连接
  9. 区块链架构与扩容方案
  10. Repeated column in mapping for entity
  11. Centos7做回收站功能,防止误删除
  12. c语言中max的用法。
  13. WPF编程,使用 Path 画虚线
  14. uniapp | 打开iOS和Android实现GPS定位权限
  15. TensorFlow2 手把手教你实现自定义层
  16. Kubernetes集群搭建以及基本使用【具详细】;
  17. 雄牛PVC地板革新胶地板行业成环保绿色新选择
  18. English语法_名词性从句 - what
  19. ssas脚本组织程序_SSAS 使用手册.doc
  20. 计算二叉树带权路径和(WPL)

热门文章

  1. css 浮动 -张鑫旭博客笔记
  2. visio如何固定地调整图形大小
  3. html css 机器猫,HTML5+CSS3实现机器猫
  4. JavaScript是一门什么样的语言
  5. python算法工程师招聘_经验 | 我心目中招聘深度学习算法工程师的标准
  6. 一建经济公式存入计算机,【2017一建《工程经济》干货第二篇:工程经济必记5个计算公式】- 环球网校...
  7. Linux 虚拟机向导
  8. 为什么sleeping的会话会造成阻塞
  9. vue项目debug调试
  10. 网络丢包现象分析处理指导书6