驅動與固件的區別是什麼?

最近學習linux內核,不理解這個概念,百度後,各種答案自相矛盾,從嵌入式和單片機到pc,好糊塗


驅動和固件(firmware)都是代碼,前者為軟體服務,後者為硬體服務

在操作系統概念還不明確的時代,二者是沒有明顯區別的。

但是隨著計算機體系結構的發展,硬體的種類開始變多,操作系統的種類也變多了。

這個時候,因為各種技術的、商業的原因,硬體廠商希望自己的硬體能被更多的軟體廠商使用,所以就需要在硬體之上做一些封裝,讓自己的硬體操縱起來更容易,這個時候就要有firmware這種東西了,它簡化了軟體與硬體的交互。

但是為什麼不把fimware做的很完美,做的不需要驅動支持呢?因為有不同的操作系統。我不知道你對操作系統的理解是到什麼程度?只知道Windows?還是還僅僅知道Linux?還是清楚Unix和FreeBSD是不同的系統?知道有RTOS?知道有上百種不同的內核?

不同的操作系統,對於操作硬體的方式完全不同,在Windows里應用態是無法直接寫IO埠的,而在嵌入式系統里,一般都不限制直接操作IO埠。所以,硬體廠商一方面為了自己的硬體能被軟體更簡單的使用,就需要寫firmware,而另一方面為了兼容各種操作系統,又不能把firmware寫的太死,必須預留足夠的餘地讓軟體自由發揮——軟體的自由發揮就是驅動。

不同操作系統的驅動是不能兼容的,原因就是驅動是為操作系統服務的,有的操作系統是單線程的,有些操作系統不允許動態申請內存,所以不同的操作系統要操作硬體,就要根據自身的特性編寫對應的操作代碼,這就是驅動存在的意義——適應系統需要。

假如世界上只有一種操作系統,並且版本永遠不會改變,那麼firmware和驅動就可以融合在一起,但這隻能一個不現實的夢想,要知道民用操作系統和工業控制操作系統差別是十分巨大的。


從計算機領域來說,驅動和固件從來沒有過明確的定義,就好像今天我們說內存,大部分人用來表示SDRAM,但也有人把Android里的「固化的Flash/Storage"稱為「內存」,你不能說這樣說就錯了,因為這確實是一種「內部存儲」。

但在Linux Kernel中,Driver和Firmware是有明確含義的,其中Driver是控制被操作系統管理的外部設備(Device)的代碼段。很多時候Driver會被實現為LKM,但這不是必要條件。driver通過driver_register()註冊到匯流排(bus_type)上,代表系統具備了驅動某種設備(device)的能力。當某個device被註冊到同樣的匯流排的時候(通常是匯流排枚舉的時候發現了這個設備),匯流排驅動會對driver和device會通過一定的策略進行binding(即進行匹配),如果Binding成功,匯流排驅動會調用driver的probe()函數,把設備的信息(例如埠,中斷號等)傳遞給驅動,驅動就可以對真實的物理部件進行初始化,並把對該設備的控制介面註冊到Linux的其他子系統上(例如字元設備,v4l2子系統等)。這樣操作系統的其他部分就可以通過這些通用的介面來訪問設備了。

而Firmware,是表示運行在非「控制處理器」(指不直接運行操作系統的處理器,例如外設中的處理器,或者被用於bare metal的主處理器的其中一些核)中的程序。這些程序很多時候使用和操作系統所運行的處理器完全不同的指令集。這些程序以二進位形式存在於Linux內核的源代碼樹中,生成目標系統的時候,通常拷貝在/lib/firmware目錄下。當driver對device進行初始化的時候,通過request_firmware()等介面,在一個用戶態helper程序的幫助下,可以把指定的firmware載入到內存中,由驅動傳輸到指定的設備上。

所以,總的來說,其實driver和firmware沒有什麼直接的關係,但firmware通常由驅動去載入。我們討論的那個OS,一般不需要理解firmware是什麼,只是把它當做數據。firmware是什麼,只有使用這些數據的那個設備才知道。好比你用一個電話,電話中有一個軟體,這個軟體你完全不關心如何工作的,你換這個軟體的時候,就可以叫這個軟體是「固件」,但如果你用了一個智能手機,你要細細關係什麼是上面的應用程序,Android平台,插件之類的細節內容,你可能就不叫這個東西叫「固件」了。

這種情況在計算機領域非常常見,所以大部分Spec都自己重新定義概念。比如說,我們平時寫軟體,說Component,很多就是只軟體的其中一個部分,但在UEFI中,Component的定義是:

An executable image. Components defined in this specification support on elf the defined module types.

這是一個「獨立的映像」,和我們一般理解的概念就完全不同,但如果你學計算機,請了解,這是我們的慣例。


固件是燒進flash里的的程序,相對來說不太會被用戶去更新、安裝、卸載的程序,這是跟應用程序或者操作系統等程序去區分的一個概念。
驅動程序,是被上層軟體用來去操作底層硬體的一系列程序的組合,它是從功能上去定義的一個概念,就是去操作底層,所以叫「驅動程序」,還是蠻形象的嘛。


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. 路由器內置系統... 刻錄入路由器存儲器,用於與其他軟體連接交互的(電腦,手機,其他路由器等)


驅動相對沒有標準答案,為驅動某模塊工作的插件,都可以叫驅動。
所以不光操作系統有驅動,應用程序也可以有,比如某種資料庫的驅動。

固件,望文生義,就是相對固定的軟體,比如燒寫在晶元內的軟體。


驅動 驅動硬體工作 直接和硬體有交互 固件 簡單的說是類似Android的ROM 就燒寫的整體 兩者沒任何必然關係,嵌入式裡面就是整個代碼都算 但很多人將官方燒錄的部分叫固件 在開發替換或者補丁進去的叫非固件,這些都不是嚴格的技術概念 舉例:我是寫固件的一般就是指這個sdk是我做的,不是寫固件的 一般就指我就在官方的sdk修修補補 總體感覺真不算一個嚴格定義的技術概念 更像行業說詞. 驅動也是,概念是相對的 比如你做Linux 寫了個觸摸屏驅動 對於觸摸屏的工程師 你算毛驅動啊 老子把驅動 固件都寫好了 你只是在我基礎上做點小應用。


驅動是 OS 的一部分,跑在 CPU 上;Firmware 是硬體的一部分,跑在硬體板載的嵌入式晶元上。兩者之間通過某些協議進行溝通,譬如對於硬碟驅動和 firmware 之間就是 SCSI 之類的協議。


很多外設晶元都是可編程的。外設運行的代碼和數據叫固件。cpu運行的硬體相關程序叫驅動。


首先要對操作系統有個概念,從低級系統(前後台系統)到高級系統(進程式系統)的發展是模塊化的過程。系統的不同功能由不同模塊來實現。

驅動:它是實現高級應用和底層硬體操作的中間模塊。
在高級系統(如Windows)很明顯,可以用安裝包來安裝。而在低級系統里可能它只是一個函數,嵌入式開發里常見。

固件:可以認為就是操作系統,或者是操作系統+必要的應用程序。
最平常的就是把android和ios都叫做固件(刷固件,升級固件)。
人們把嵌入式系統的安裝叫做刷固件,把pc和pc以上的硬體叫安裝系統。
為什麼會有這樣的叫法,我覺得
1,嵌入式很多系統很低級,有些甚至不超過百行代碼,在操作系統歸類中,有些都不認為它是操作系統。
2,嵌入式系統安裝後基本不會再進行軟體層面的修改,是穩固的。

ps:電腦可以認為是一個高級系統和多個低級系統攜手操作硬體的機器。像網卡、音效卡、usb等的主控制器都有操作系統(固件)來控制完成其所需要完成的工作
2013.12.8
——————————————————————————————————————
額,以前好像沒仔細看問題。
(應用→驅動)→(固件→硬體邏輯),應用和驅動在我們電腦系統里,固件和硬體邏輯在外設里。

一般固件儲存於外設儲存空間里的,在外設通電運行時再載入外設的運存里。
還有一種就是固件放在電腦系統里,在外設連電腦時,由電腦傳入外設運存,完成外設初始化。這就是linux里fireware結構來完成把外設固件寫入外設運存。

在重申一下,固件就是操作系統,只不過有高低操作系統之分而已。
無盤工作站中,你可以把要從主機載入的Windows理解為固件。
2015.12.17


簡單來說,你電腦新裝了一個音效卡,跑在音效卡硬體內部的是固件,安裝在你電腦里的是驅動


內核代碼相關名詞挺多的,要自己理解,有個對應的概念,驅動跟固件完全不是一個範圍的東西,固件就是刷機用的bin文件,驅動就是溝通內核和硬體寄存器的部分代碼模塊。


驅動是操作系統和硬體的介面,固件是告訴硬體如何完成自己的工作。


這個問題,不嚴謹來看,一句話解釋為 裸奔的是固件,帶系統的是驅動.....


前段時間編寫過驅動
驅動是服務硬體的,編寫驅動的目的是為了驅動硬體設備,比如印表機、鍵盤等。拿印表機來說,印表機對計算機來說就是個串口輸出端,給埠輸出數據就需要編寫程序讀取你pc上的文檔然後在內核態寫到串口,Linux分成用戶態和內核態,用戶只有通過驅動才能寫寄存器數據。上層用戶態的軟體如word通過調用驅動獲取設備地址並且在內核態將數據寫到串口內存。
至於固件,不太了解題主所說的固件具體是什麼,通常我們說的固件其實就是嵌入式的系統,比如手機有固件,就是常說的rom,通常的智能終端我們都可以叫他嵌入式設備,比如印表機,印表機的控制程序就可以叫固件,我不了解印表機具體是什麼樣的嵌入式,有可能是fpga的也有可能是arm的,固件的定義比較寬泛,總體上來說就是設備出廠時的系統、包括系統中的驅動、內核、和固化的軟體


驅動,用於銜接兩部分,比如使用U盤,系統必須驅動電腦生成特定信號以匹配U盤所需的信號,而U盤所需的信號往往就是其內部固件決定。

驅動僅是部件,而固件是一個整體,這是根本區別。當然運行著固件的設備,也可能成為一個大系統中的驅動設備。


一個是直接在硬體上運行,一個是基於OS kernel的運行。


驅動和操作系統一起在伺服器上運行,為操作系統提供功能服務。驅動是硬體封裝層,它按照操作系統定義的功能要求提供服務並操作硬體。驅動屏蔽了操作系統對硬體的直接操作,降低了操作系統編寫的難度,它使操作系統看到的不同廠家的、但是功能類似的硬體都一樣。

固件的情況有點複雜,我知道的一般是:
固件是某些硬體的操作系統,比如計算機中的智能SCSI卡的固件,它就是SCSI卡的操作系統。


作為一個外行,我簡單的理解,固件是讓設備能運行起來,驅動是讓設備能盡量好的運行起來。


大家好,這裡有木有做MIPS CPU Hardware Engineer 和firmware engineer的呢,可否幫忙推薦或自薦下啊


推薦閱讀:

TAG:Linux | 嵌入式開發 |