linux底层硬件需求,Linux系统的硬件设备驱动的底层结构讲解
什么是驱动?最通俗的解释就是“驱使硬件设备行动”
作用?设备驱动与底层硬件直接打交道,按照硬件设备的具体工作方式读写设备寄存器,完成设备的轮询、中断处理、DMA通信,进行物理内存向虚拟内存的映射,最终使通信设备能够收发数据,使显示设备能够显示文字和画面,使存储设备能够记录文件号数据
计算机系统的硬件主要有cpu、存储器、外设组成。但是随着IC制造工艺的发展,目前,芯片的集成度越来越高,往往cpu内部就集成了存储器和外设适配器。ARM处理器集成了UART、I2C控制器(2==平方)、USB控制器、SDRAM控制器等
驱动针对的对象是存储器和外设(包括cpu内部集成的存储器和外设),而不是针对cpu核。Linux将存储器和外设分为3个基础大类:字符设备、块设备、网络设备
字符设备之那些必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标等。可设备可以按照任意顺序进行访问,以块为单位进行操作,如硬盘、软驱等。字符设备不经过系统的快速缓冲,而块设备经过系统的快速缓冲。但是,字符设备和块设备并没有明显的界限,如flash设备符合块设备的特点,但是我们仍然可以把它作为一个字符设备来访问
在Linux系统中,网络设备面向数据包的接收和发送而设计,它并不对应于文件系统的节点。内核与网络设备的通信和内核与字符设备、块设备的通信方式完全不同。
如上图所示,除网络设备外,字符设备与块设备都被映射到Linux文件系统的文件和目录,通过文件系统的系统调用接口open()、write()、read()、close()等函数即可访问字符设备和块设备。块设备比字符设备复杂,在它上面会首先建立一个磁盘/Flash文件系统,如FAT、Ext3、YAFFS、JFFS等FAT、Ext3、YAFFS、JFFS规范了文件和目录在存储介质上的组织
应用程序可以使用Linux的系统调用接口编程,也可由使用c库函数,出于可移植性的考虑,后者更值得推荐。c库函数本身也是通过系统调用接口而实现的
在嵌入式系统的设计中,LED一般直接由cpu的GPIO控制。GPIO一般有两组寄存器控制,即一组控制寄存器和一组数据寄存器。控制寄存器可设置GPIO口的工作方式为输入或输出。当引脚设置为输出时,向数据寄存器的对应位写入1和0会分别在引脚上产生高电平和低电平;当引脚设置为输入时,读取数据寄存器的对应位可获得引脚上相应的电平信号。
驱动设计的硬件基础处理器的分类,如下图所示:
存储器可分为只读存储器(ROM)、闪存(Flash)、随机存取存储器(RAM)、光介质存储器和磁介质存储器
Nor Flash和cpu的接口属于典型的类SRAM接口,不需要增加额外的控制电路。Nor Flash的特点是可芯片内执行,程序可以直接在Nor内运行。而Nand Fash和cpu的接口必须由相应的控制电路进行转换,当然也可以通过地址线或GPIO产生Nand Flash接口的信号。Nand Flash以块方式进行访问,不支持芯片内执行。
Flash的编程原理都是只能将1写为0,而不能将0写完1.所以在Flash编程之前必须将对应的块擦除,而擦除的过程就是把所有的位都写为1的过程,块内的所有字节变为1xFF
存储器的分类,如下图所示:
原理图分析:通过阅读电路板的原理图获得各种存储器、外设所使用的硬件资源,主要包括存储器和外设控制芯片所使用的片选、中断、DMA资源。通过分析片选得出芯片的内存、I/O基地址,通过分析中断、DMA信号获得芯片使用的中断号和DMA通道,归纳出类似下表:
时序分析:对驱动工程师或硬件工程师而言,时序分析的意思是让芯片之间的访问满足芯片手册中时序图信号有效的先后顺序、采样建立时间和保持时间的要求,在电路板工作不正常的时候,准确的定位时序方面的问题
内核及内核编程在设备驱动方面,Linux2.6相对于Linux2.4有较大的改动,这主要表现在内核API中增加了不少新功能(如内存池)、sysfs文件系统、内核模块从.o变为.ko、驱动模块编译方式、模块使用计数、模块加载和卸载函数的定义等方面
Linux内核主要有进程调度、内存管理、虚拟文件系统、网络接口和进程间通信等5个子系统组成,如下图:
在设备驱动编程中,当请求的资源不能满足时,驱动一般会调度其他线程执行,并使驱动对应的进程进入睡眠状态,直到它请求的资源被释放,才会被唤醒而纪念日就绪状态
在设备驱动编程中,如果需要几个并发执行的任务,可以启动内核线程,启动内核线程的函数为:int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
Linux内存管理完成为每个进程进行虚拟内存到物理内存的转换。一般而言,Linux的每个进程享有4GB的内存空间,0-3GB属于用户空间,3-4GB属于内核空间,内核空间对常规内存、I/O设备内存以及高端内存存在不同的处理方式
虚拟文件系统隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口。而且,它独立于各个具体的文件系统,是对各种文件系统的一个抽象,它使用super block存放文件系统相关信息,使用索引节点inode存放文件的物理信息,使用目录项dentry存放文件的逻辑信息
Linux系统只能通过系统调用和硬件中断完成从用户空间到内核空间的控制转移。
linux底层硬件需求,Linux系统的硬件设备驱动的底层结构讲解相关推荐
- linux内核源码实战_3.2理解设备驱动和文件系统
linux内核源码实战_3.2理解设备驱动和文件系统 linux内核源码实战_理解设备驱动和文件系统 理解设备驱动和文件系统 理解设备驱动和文件系统详解 7-文件系统-proc文件系统实现 总结 li ...
- linux平台驱动运行空间,UIO(linux Userspace I/O子系统)用户空间设备驱动I/O技术介绍...
UIO(linux Userspace I/O子系统)用户空间设备驱动I/O技术介绍(由搜集整理) UIO(Userspace I/O)是运行在用户空间的I/O技术.Linux系统中一般的驱动设备都是 ...
- Linux查看网卡是rdma,Chelsio RDMA Block设备驱动测试
RDMA Block 设备驱动介绍 我们现在测试使用的 Chelsio T4 及 T5 系列万兆以太网卡支持 iWARP RDMA 功能,查阅文档之后发现此系列的万兆网卡除了支持常用的基于 IP 协议 ...
- Linux kernel SPI源码分析之SPI设备驱动源码分析(linux kernel 5.18)
SPI基础支持此处不再赘述,直接分析linux中的SPI驱动源码. 1.SPI设备驱动架构图 2.源码分析 本次分析基于kernel5.18,linux/drivers/spi/spidev.c 设备 ...
- 示例:Linux应用程序遍历当前系统的PCI设备
使用应用程序遍历设备上的所有PCI设备,通过遍历这些设备,可以获取到每个设备对应的bus号,dev号,func号,以及每个PCI设备的额vendorID和deviceID 示例程序中的iopl, ou ...
- linux内核源代码情景分析(第八章 设备驱动)
第八章 设备驱动 文章目录
- Linux嵌入外部程序窗口,μClinux嵌入系统外部硬件设备快速调试||μClinux|
μClinux嵌入系统外部硬件设备快速调试 摘要:为 了加快开发调试μClinux嵌入式系统的外部硬件设备,采用直接物理地址的设备访问方法,在μClinux嵌入式系统中实现了外部硬件设备的快速访问. ...
- Linux下驱动开发_块设备驱动开发(硬件上采用SD卡+SPI协议)
一.前言 块设备主要为存储设备设计的框架. 在前面章节Linux下驱动开发_块设备驱动开发(内存模拟存储) 里介绍了块设备驱动编写思路,并且利用内存模拟了硬件存储,完成了块设备驱动开发测试.这一篇文章 ...
- linux 设备驱动 ppt,linux设备驱动开发详解讲座ppt
PPT内容 这是linux设备驱动开发详解讲座ppt下载,主要介绍了设备驱动简介:建立和运行模块:字符驱动:调试技术:并发和竞争:分配内存:硬件通讯:中断处理:块设备驱动,欢迎点击下载. 嵌入式Lin ...
最新文章
- 利用html5标签audio在不同客户端下适配播放音频
- 双网口相机平台搭建C++(大恒水星)
- 启明云端方案分享| 小尺寸串口屏在充电桩的应用
- IE10,IE9透明元素无法点击
- 最安全的js类型检测
- LevelDb实现原理
- sharedpreferences使用方法_细数 SharedPreferences 的那些槽点 !
- IDEA如何添加本地项目到git上
- python 数组 元组 列表_python_Day_02[数组、列表、元组之篇]
- Win10卸载微软sql服务器,卸载 SQL Server Management Studio
- MikroTik(RouteOS)有线路由器快速设置教程
- 云标签,关键字图排版 html5 canvas版
- oracle设置组合主键,Oracle主键的设置
- python使用codecs.open 读写
- 淘宝官方商品、交易、订单、物流接口列表
- Node.js 单页应用
- stm32复用时钟AFIO什么时候开启
- C语言编程入门—基本输入输出(week1)
- 【毕业生】外包公司适合你么?
- 一次性解决教师资格证报名问题
热门文章
- ping 一会通一会不通
- python 多个变量赋值
- MobileNetv2优化问题
- cannot be registered to your development team. Change your bundle identifier to a unique string to t
- ubuntu 安装OpenBLAS
- 五、唱歌不如跳舞(下)
- c语言申请字符串动态,【分享】C语言动态长度字符串
- sample 算子_Spark----RDD及算子
- 大学计算机实验教程实验报告2.2,大学计算机实验2-实验报告.pdf
- java的函数传值_java 函数形参传值和传引用的区别[转]