分享

驱动与固件的区别是什么?

 pgl147258 2015-04-13

【时国怀的回答(81票)】:

驱动和固件(firmware)都是代码,前者为软件服务,后者为硬件服务

在操作系统概念还不明确的时代,二者是没有明显区别的。

但是随着计算机体系结构的发展,硬件的种类开始变多,操作系统的种类也变多了。

这个时候,因为各种技术的、商业的原因,硬件厂商希望自己的硬件能被更多的软件厂商使用,所以就需要在硬件之上做一些封装,让自己的硬件操纵起来更容易,这个时候就要有firmware这种东西了,它简化了软件与硬件的交互。

但是为什么不把fimware做的很完美,做的不需要驱动支持呢?因为有不同的操作系统。我不知道你对操作系统的理解是到什么程度?只知道Windows?还是还仅仅知道Linux?还是清楚Unix和FreeBSD是不同的系统?知道有RTOS?知道有上百种不同的内核?

不同的操作系统,对于操作硬件的方式完全不同,在Windows里应用态是无法直接写IO端口的,而在嵌入式系统里,一般都不限制直接操作IO端口。所以,硬件厂商一方面为了自己的硬件能被软件更简单的使用,就需要写firmware,而另一方面为了兼容各种操作系统,又不能把firmware写的太死,必须预留足够的余地让软件自由发挥——软件的自由发挥就是驱动。

不同操作系统的驱动是不能兼容的,原因就是驱动是为操作系统服务的,有的操作系统是单线程的,有些操作系统不允许动态申请内存,所以不同的操作系统要操作硬件,就要根据自身的特性编写对应的操作代码,这就是驱动存在的意义——适应系统需要。

假如世界上只有一种操作系统,并且版本永远不会改变,那么firmware和驱动就可以融合在一起,但这只能一个不现实的梦想,要知道民用操作系统和工业控制操作系统差别是十分巨大的。

【innek的回答(4票)】:

至今为止回答的人可能就没有搞Linux的。

首先从计算机领域来说,驱动和固件从来没有过明确的定义,就好像今天我们说内存,大部分人用来表示SDRAM,但也有人把Android里的“固化的Flash/Storage"称为“内存”,你不能说这样说就错了,因为这确实是一种“内部存储”。

但在Linux Kernel中,Driver和Firmware是有明确含义的,其中Driver是控制被操作系统管理的外部设备(Device)的代码段。很多时候Driver会被实现为LKM,但这不是必要条件。driver通过register_dirver()注册到总线(bus_type)上,当某个device被注册到同样的总线的时候,driver和device会通过一定的策略进行binding,最终在probe()函数中由driver实际控制对应的设备,并把控制接口注册到Linux的其他子系统上(例如字符设备,v4l2子系统等)。

而Firmware,是表示运行在非“控制处理器”(指不直接运行操作系统的处理器),例如外设中的处理器,或者被用于bare metal的主处理器的其中一些核,中的程序。这些程序很多时候使用和操作系统所运行的处理器完全不同的指令集。这些代码以二进制形成存在于Linux内核的源代码树中,根据配置,可以直接集成到最终的映像中,或者被拷贝到指定的位置。当driver对device进行初始化的时候,通过load_firmware()等接口,可以把指定的firmware加载到内存中,并传输到指定的设备上。

所以,总的来说,其实driver和firmware没有什么直接的关系。

【杨庆的回答(2票)】:

driver 和 firmware 两个名词有很大的区别。

驱动 driver 指的提供编程api接口,用以操控某一硬件/软件产品的应用程序。以程序的使用目的来定义 它是否为driver。

固件firmware 概念上来说是指那些预安装到硬件产品内部只读记忆体里面,与硬件产品捆绑匹配的程序。这个名词的定义主要强调此类软件的不应当被修改,并且与硬件捆绑的特性。更改firmware属于hack范畴了。

名词解释到这,下面举几个例子吧

属于driver但是不属于firmware的例子:

1. oracle database, .net driver。 所有软件产品的驱动都不属于固件。

2. 打印机 驱动光盘。由于并没有预装入打印机只读记忆体,不属于固件。

属于固件但不属于驱动的:

1. 洗衣机内置电脑程序。此为直接用户交互的系统终端(user interface,UI),并不和其他应用程序交互(application programming interface, API).

2. 计算器里面的操作系统。

同属于firmware 和 driver的

1. 路由器内置系统... 刻录入路由器存储器,用于与其他软件连接交互的(电脑,手机,其他路由器等)

【chencrazy的回答(1票)】:

简单来说,你电脑新装了一个声卡,跑在声卡硬件内部的是固件,安装在你电脑里的是驱动

【杜克石的回答(1票)】:

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

固件的情况有点复杂,我知道的一般是:

固件是某些硬件的操作系统,比如计算机中的智能SCSI卡的固件,它就是SCSI卡的操作系统。

【陈厚来的回答(0票)】:

驱动相对没有标准答案,为驱动某模块工作的插件,都可以叫驱动。

所以不光操作系统有驱动,应用程序也可以有,比如某种数据库的驱动。

固件,望文生义,就是相对固定的软件,比如烧写在芯片内的软件。

【高雄的回答(0票)】:

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

驱动:它是实现高级应用和底层硬件操作的中间模块。

在高级系统(如Windows)很明显,可以用安装包来安装。而在低级系统里可能它只是一个函数,嵌入式开发里常见。

固件:可以认为就是操作系统,或者是操作系统+必要的应用程序。

最平常的就是把android和ios都叫做固件(刷固件,升级固件)。

人们把嵌入式系统的安装叫做刷固件,把pc和pc以上的硬件叫安装系统。

为什么会有这样的叫法,我觉得

1,嵌入式很多系统很低级,有些甚至不超过百行代码,在操作系统归类中,有些都不认为它是操作系统。

2,嵌入式系统安装后基本不会再进行软件层面的修改,是稳固的。

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

原文地址:知乎

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多