在Linux Kernel中,设备驱动(Driver)和固件“驱动”(Firmware)是有明确含义的,其中Driver是控制外部设备(Device:这写外部设备是被操作系统管理的)的代码段。很多时候Driver会被实现为LKM,但这不是必要条件。Driver通过driver_register()注册到总线(bus_type)上,代表操作系统具备了驱动某种设备(Device)的能力。当某个Device被注册到同样的总线的时候(通常是总线枚举的时候发现了这个设备),总线驱动会按照一定的策略对Driver和Device进行binding(即进行匹配),如果Binding成功,总线驱动会调用Driver的probe()函数,把设备的信息(例如端口,中断号等)传递给设备驱动Driver,驱动就可以对真实的物理部件进行初始化,并把对该设备的控制接口注册到Linux的其他子系统上(例如字符设备,v4l2子系统等)。这样操作系统的其他部分就可以通过这些通用的接口来访问设备了。
/*
注:关于 Linux内核对设备固件的装载和清除提供的接口可以参考下面的链接
http://blog.csdn.net/u014379540/article/details/52496647
*/
PS: 知乎回答:
首先要对操作系统有个概念,从低级系统(前后台系统)到高级系统(进程式系统)的发展是模块化的过程。系统的不同功能由不同模块来实现。
驱动:它是实现高级应用和底层硬件操作的中间模块。(个人认为反正不是操作系统)
在高级系统(如Windows)很明显,可以用安装包来安装。而在低级系统里可能它只是一个函数,嵌入式开发里常见。
固件:可以认为就是操作系统(低级的),或者是操作系统+必要的应用程序。
最平常的就是把android和ios都叫做固件(刷固件,升级固件)。
人们把嵌入式系统的安装叫做刷固件(例如在手机上),而在pc硬件上的安装叫安装系统。
为什么会有这样的叫法,我觉得
1,嵌入式很多系统很低级,有些甚至不超过百行代码,在操作系统归类中,有些都不认为它是操作系统。
2,嵌入式系统安装后基本不会再进行软件层面的修改,是稳固的。
电脑可以认为是一个高级系统和多个低级系统携手操作硬件的机器。像网卡、声卡、usb等的主控制器都有操作系统(固件)来控制完成其所需要完成的工作。
(应用→驱动)→(固件→硬件逻辑),应用和驱动在我们电脑系统里,固件和硬件逻辑在外设里。
一般固件储存于外设储存空间里的,在外设通电运行时再载入外设的运存里。
还有一种就是固件放在电脑系统里,在外设连电脑时,由电脑传入外设运存,完成外设初始化。这就是linux里用firmware结构来完成把外设固件写入外设运存(就是上面提到的)。
设备驱动和操作系统一起在服务器上运行,为操作系统提供功能服务。驱动是硬件封装层,它按照操作系统定义的功能要求提供服务并操作硬件。驱动屏蔽了操作系统对硬件的直接操作,降低了操作系统编写的难度,它使操作系统看到的不同厂家的、但是功能类似的硬件都一样。