设备驱动&&固件“驱动”

来源:互联网 发布:淘宝哪里输入淘口令 编辑:程序博客网 时间:2024/05/01 21:04

在Linux Kernel中,设备驱动(Driver)和固件“驱动”(Firmware)是有明确含义的,其中Driver是控制外部设备(Device:这写外部设备是被操作系统管理的)的代码段。很多时候Driver会被实现为LKM,但这不是必要条件。Driver通过driver_register()注册到总线(bus_type)上,代表操作系统具备了驱动某种设备(Device)的能力。当某个Device被注册到同样的总线的时候(通常是总线枚举的时候发现了这个设备),总线驱动会按照一定的策略对Driver和Device进行binding(即进行匹配),如果Binding成功,总线驱动会调用Driver的probe()函数,把设备的信息(例如端口,中断号等)传递给设备驱动Driver,驱动就可以对真实的物理部件进行初始化,并把对该设备的控制接口注册到Linux的其他子系统上(例如字符设备,v4l2子系统等)。这样操作系统的其他部分就可以通过这些通用的接口来访问设备了。

而Firmware,是表示运行在非“控制处理器”(指不直接运行操作系统的处理器,例如外设中的处理器,或者被用于bare metal的主处理器的其中一些核)中的程序。这些程序很多时候使用和操作系统所运行的处理器完全不同的指令集。这些程序以二进制形式存在于Linux内核的源代码树中,生成目标系统的时候,通常拷贝在/lib/firmware目录下。当Driver对Device进行初始化的时候,通过request_firmware()等接口(这些接口是Linux内核对设备固件的装载和清除提供的),在一个用户态helper程序的帮助下,可以把指定的firmware加载到内存中,由Driver传输到指定的设备上。

/*
注:关于Linux内核对设备固件的装载和清除提供的接口可以参考下面的链接
http://blog.csdn.net/u014379540/article/details/52496647
*/

所以,总的来说,其实driver和firmware没有什么直接的关系,但firmware通常由driver去加载。我们讨论的那个OS,一般不需要理解firmware是什么,只是把它当做数据。firmware是什么,只有使用这些数据的那个设备才知道。

PS:知乎回答

首先要对操作系统有个概念,从低级系统(前后台系统)到高级系统(进程式系统)的发展是模块化的过程。系统的不同功能由不同模块来实现。

驱动:它是实现高级应用和底层硬件操作的中间模块。(个人认为反正不是操作系统微笑
在高级系统(如Windows)很明显,可以用安装包来安装。而在低级系统里可能它只是一个函数,嵌入式开发里常见。

固件:可以认为就是操作系统(低级的),或者是操作系统+必要的应用程序。
最平常的就是把android和ios都叫做固件(刷固件,升级固件)。
人们把嵌入式系统的安装叫做刷固件(例如在手机上),而在pc硬件上的安装叫安装系统。
为什么会有这样的叫法,我觉得
1,嵌入式很多系统很低级,有些甚至不超过百行代码,在操作系统归类中,有些都不认为它是操作系统。
2,嵌入式系统安装后基本不会再进行软件层面的修改,是稳固的。

电脑可以认为是一个高级系统和多个低级系统携手操作硬件的机器。像网卡、声卡、usb等的主控制器都有操作系统(固件)来控制完成其所需要完成的工作。


(应用→驱动)→(固件→硬件逻辑),应用和驱动在我们电脑系统里,固件和硬件逻辑在外设里。

一般固件储存于外设储存空间里的,在外设通电运行时再载入外设的运存里。
还有一种就是固件放在电脑系统里,在外设连电脑时,由电脑传入外设运存,完成外设初始化。这就是linux里用firmware结构来完成把外设固件写入外设运存(就是上面提到的)。


设备驱动和操作系统一起在服务器上运行,为操作系统提供功能服务。驱动是硬件封装层,它按照操作系统定义的功能要求提供服务并操作硬件。驱动屏蔽了操作系统对硬件的直接操作,降低了操作系统编写的难度,它使操作系统看到的不同厂家的、但是功能类似的硬件都一样。










原创粉丝点击