驱动driver
Driver是控制被操作系统管理的外部设备(Device)的代码段。很多时候Driver会被实现为LKM,但这不是必要条件。
driver通过driver_register()注册到总线(bus_type)上,代表系统具备了驱动某种设备(device)的能力。当某个device被注册到同样的总线的时候(通常是总线枚举的时候发现了这个设备),总线驱动会对driver和device会通过一定的策略进行binding(即进行匹配),如果Binding成功,总线驱动会调用driver的probe()函数,把设备的信息(例如端口,中断号等)传递给驱动,驱动就可以对真实的物理部件进行初始化,并把对该设备的控制接口注册到Linux的其他子系统上(例如字符设备,v4l2子系统等)。这样操作系统的其他部分就可以通过这些通用的接口来访问设备了。
固件firmware
firmware 出现的背景
随着计算机体系结构的发展,硬件的种类开始变多,操作系统的种类也变多了。这个时候,因为各种技术的、商业的原因,硬件厂商希望自己的硬件能被更多的软件厂商使用,所以就需要在硬件之上做一些封装,让自己的硬件操纵起来更容易,这个时候就要有firmware这种东西了,它简化了软件与硬件的交互。
为什么还需要驱动
为什么不把fimware做的很完美,做的不需要驱动支持呢?
因为有不同的操作系统。
不同的操作系统,对于操作硬件的方式完全不同。
在Windows里应用态是无法直接写IO端口的,而在嵌入式系统里,一般都不限制直接操作IO端口。
所以,硬件厂商一方面为了自己的硬件能被软件更简单的使用,就需要写firmware;
而另一方面为了兼容各种操作系统,又不能把firmware写的太死,必须预留足够的余地让软件自由发挥——软件的自由发挥就是驱动。
不同操作系统的驱动是不能兼容的,原因就是驱动是为操作系统服务的,有的操作系统是单线程的,有些操作系统不允许动态申请内存,所以不同的操作系统要操作硬件,就要根据自身的特性编写对应的操作代码,这就是驱动存在的意义——适应系统需要。
假如世界上只有一种操作系统,并且版本永远不会改变,那么firmware和驱动就可以融合在一起,但这只能一个不现实的梦想,要知道民用操作系统和工业控制操作系统差别是十分巨大的。
什么是 firmware
Firmware是一种软件的代名词,但这种软件与普通意义上的软件完全不同,它是一种固化在集成电路内部的源程序代码,而集成电路的功能就是由这些程序而决定的。ROM不过只是Firmware的载体,而我们通常所说的BIOS正是固化了系统主板Firmware的ROM芯片。
Firmware,是表示运行在非“控制处理器”(指不直接运行操作系统的处理器,例如外设中的处理器,或者被用于bare metal的主处理器的其中一些核)中的程序。
这些程序很多时候使用和操作系统所运行的处理器完全不同的指令集。
固件firmware 概念上来说是指那些预安装到硬件产品内部只读记忆体里面,与硬件产品捆绑匹配的程序。这个名词的定义主要强调此类软件的不应当被修改,并且与硬件捆绑的特性。
固件是设备内部保存的设备“驱动程序”;通过固件,操作系统才能按照标准的设备驱动实现特定机器的运行运作,比如光驱,刻录机等都有内部固件。
在硬件设备中,固件就是硬件设备的灵魂,因为一些硬件设备除了固件以外没有其他软件组成,因此固件也就决定这硬件设备的功能以及性能。
固件的存储介质/载体
Firmware是存储在硬件中的,其存储介质主要有ROM、PROM、EPROM、EEPROM和Flash Rom,现在的光储产品基本都使用可擦写的存储介质存储Firmware,便于用户刷新。
Flash Rom是一种在EEPROM基础上改进的非易失性的存储介质,它在擦写数据时是以“块”为单位进行的,块的大小由厂商自定;
而EEPROM则是以字节为单位进行擦写的,因此Flash Rom的擦写速度较快,其技术的先进性和操作的便捷性非常方便用户自行对固件进行升级。
具体采用何种存储介质,设备制造商往往是根据制造成本、安全性能、是否需要升级、设备标准的发展变化等实际情况来综合考虑的。
如何将固件写入到硬件
- 方法一
一般固件储存于外设储存空间里的,在外设通电运行时再载入外设的运存里。- 方法二
还有一种就是固件放在电脑系统里,在外设连电脑时,由电脑传入外设运存,完成外设初始化。这就是linux里fireware结构来完成把外设固件写入外设运存。
详细:
固件程序以二进制形式存在于Linux内核的源代码树中,生成目标系统的时候,通常拷贝在/lib/firmware目录下。当driver对device进行初始化的时候,通过request_firmware()等接口,在一个用户态helper程序的帮助下,可以把指定的firmware加载到内存中,由驱动传输到指定的设备上。
固件升级
采用可擦写的介制是为了对firmware进行升级。厂家可以提供对Firmware的升级,以便为Firmware增加更多的功能或改进其性能,甚至修正其中的错误。
虽然有些固件的问题可以通过软件补丁来弥补,但终归还是不如直接进行固件的升级来得可靠和方便。因此目前绝大多数的厂家在推出硬件产品时,都采用了可以升级的固件设计以提供更加灵活的适用性。
- 范例一
现有一台HP DL580 G7服务器,运行redhat linux5.6 64位操作系统,突然出现宕机现象,重启后查看/var/log/messages,发现有:interface1 kernel:eth0:firmware hang detected相关信息,考虑到HP G7的服务器曾经出现过网卡BUG,再通过ethtool -i eth0查看网卡固件版本,发现是固件版本是4.0.555,需要升级固件。
其他
固件既然是软件,就有大小之分。大的可有几百兆,小的也许只有几K,甚至不足1K。
而对于非独立的电子产品,比如硬盘、鼠标、BIOS、光驱、U盘等设备,固件就是指其最底层的,让设备得以运行的程序代码。
区别与联系
- 流程
(应用→驱动)→(固件→硬件逻辑),应用和驱动在我们电脑系统里,固件和硬件逻辑在外设里。- 服务对象
驱动和固件(firmware)都是代码,前者为软件(操作系统)服务,后者为硬件服务。
随硬件一起发布的叫固件,随软件一起发布的叫驱动。
随硬件一起发布是因为没有固件,硬件本身无法工作,如bios。
随软件一起发布是因为为没有它软件无法在目标硬件上工作,如linux驱动。- 对比
- 驱动
驱动和操作系统一起在服务器上运行,为操作系统提供功能服务。
驱动是硬件封装层,它按照操作系统定义的功能要求提供服务并操作硬件。
驱动屏蔽了操作系统对硬件的直接操作,降低了操作系统编写的难度,它使操作系统看到的不同厂家的、但是功能类似的硬件都一样。- 固件
固件是某些硬件的操作系统,比如计算机中的智能SCSI卡的固件,它就是SCSI卡的操作系统。
参考
https://www.zhihu.com/question/22175660