相信初學(xué)操作系統的同學(xué),都曾對這個(gè)問(wèn)題有過(guò)疑問(wèn),從嵌入式、單片機到PC,各種解釋都有,到底什么是驅動(dòng),什么是固件呢? 驅動(dòng)為軟件服務(wù),固件為硬件服務(wù) (來(lái)自知乎時(shí)國懷) 驅動(dòng)和固件(firmware)都是代碼,前者為軟件服務(wù),后者為硬件服務(wù)。 在操作系統概念還不明確的時(shí)代,二者是沒(méi)有明顯區別的。 但是隨著(zhù)計算機體系結構的發(fā)展,硬件的種類(lèi)開(kāi)始變多,操作系統的種類(lèi)也變多了。 這個(gè)時(shí)候,因為各種技術(shù)的、商業(yè)的原因,硬件廠(chǎng)商希望自己的硬件能被更多的軟件廠(chǎng)商使用,所以就需要在硬件之上做一些封裝,讓自己的硬件操縱起來(lái)更容易,這個(gè)時(shí)候就要有firmware這種東西了,它簡(jiǎn)化了軟件與硬件的交互。 但是為什么不把fimware做的很完美,做的不需要驅動(dòng)支持呢?因為有不同的操作系統。我不知道你對操作系統的理解是到什么程度?只知道Windows? 還是還僅僅知道Linux?還是清楚Unix和FreeBSD是不同的系統?知道有RTOS?知道有上百種不同的內核? 不同的操作系統, 對于操作硬件的方式完全不同,在Windows里應用態(tài)是無(wú)法直接寫(xiě)IO端口的,而在嵌入式系統里,一般都不限制直接操作IO端口。所以,硬件廠(chǎng)商一方面為了自己的硬件能被軟件更簡(jiǎn)單的使用,就需要寫(xiě)firmware,而另一方面為了兼容各種操作系統,又不能把firmware寫(xiě)的太死,必須預留足夠的余地讓軟件自由發(fā)揮——軟件的自由發(fā)揮就是驅動(dòng)。 不同操作系統的驅動(dòng)是不能兼容的,原因就是驅動(dòng)是為操作系統服務(wù)的,有的操作系統是單線(xiàn)程的,有些操作系統不允許動(dòng)態(tài)申請內存,所以不同的操作系統要操作硬件,就要根據自身的特性編寫(xiě)對應的操作代碼,這就是驅動(dòng)存在的意義——適應系統需要。 假如世界上只有一種操作系統,并且版本永遠不會(huì )改變,那么firmware和驅動(dòng)就可以融合在一起,但這只能一個(gè)不現實(shí)的夢(mèng)想,要知道民用操作系統和工業(yè)控制操作系統差別是十分巨大的。 driver和firmware沒(méi)有什么直接的關(guān)系 (來(lái)自知乎in nek) 從計算機領(lǐng)域來(lái)說(shuō),驅動(dòng)和固件從來(lái)沒(méi)有過(guò)明確的定義,就好像今天我們說(shuō)內存,大部分人用來(lái)表示SDRAM,但也有人把Android里的“固化的Flash/Storage"稱(chēng)為“內存”,你不能說(shuō)這樣說(shuō)就錯了,因為這確實(shí)是一種“內部存儲”。 但在Linux Kernel中,Driver和Firmware是有明確含義的,其中Driver是控制被操作系統管理的外部設備(Device)的代碼段。很多時(shí)候 Driver會(huì )被實(shí)現為L(cháng)KM,但這不是必要條件。driver通過(guò)driver_register()注冊到總線(xiàn)(bus_type)上,代表系統具備 了驅動(dòng)某種設備(device)的能力。當某個(gè)device被注冊到同樣的總線(xiàn)的時(shí)候(通常是總線(xiàn)枚舉的時(shí)候發(fā)現了這個(gè)設備),總線(xiàn)驅動(dòng)會(huì )對driver 和device會(huì )通過(guò)一定的策略進(jìn)行binding(即進(jìn)行匹配),如果Binding成功,總線(xiàn)驅動(dòng)會(huì )調用driver的probe()函數,把設備的 信息(例如端口,中斷號等)傳遞給驅動(dòng),驅動(dòng)就可以對真實(shí)的物理部件進(jìn)行初始化,并把對該設備的控制接口注冊到Linux的其他子系統上(例如字符設 備,v4l2子系統等)。這樣操作系統的其他部分就可以通過(guò)這些通用的接口來(lái)訪(fǎng)問(wèn)設備了。 而Firmware,是表示運行在非“控制處理器”(指不直接運行操作系統的處理器,例如外設中的處理器,或者被用于bare metal的主處理器的其中一些核)中的程序。這些程序很多時(shí)候使用和操作系統所運行的處理器完全不同的指令集。這些程序以二進(jìn)制形式存在于Linux內核的源代碼樹(shù)中,生成目標系統的時(shí)候,通?截愒/lib/firmware目錄下。當driver對device進(jìn)行初始化的時(shí)候,通過(guò) request_firmware()等接口,在一個(gè)用戶(hù)態(tài)helper程序的幫助下,可以把指定的firmware加載到內存中,由驅動(dòng)傳輸到指定的設 備上。 所以,總的來(lái)說(shuō),其實(shí)driver和firmware沒(méi)有什么直接的關(guān)系,但firmware通常由驅動(dòng)去加載。我們討論的那個(gè)OS,一般不需要理解firmware是什么,只是把它當做數據。firmware是什么,只有使用這些數據的那個(gè)設備才知道。好比你用一個(gè)電話(huà),電話(huà)中有一個(gè)軟件,這個(gè)軟件你完全不關(guān)心如何工作的,你換這個(gè)軟件的時(shí)候,就可以叫這個(gè)軟件是“固件”,但如果你用了一個(gè)智能手機,你要細細關(guān)心什么是上面的應用程序,Android平臺,插件之類(lèi)的細節內容,你可能就不叫這個(gè)東西叫“固件”了。 這種情況在計算機領(lǐng)域非常常見(jiàn),所以大部分Spec都自己重新定義概念。比如說(shuō),我們平時(shí)寫(xiě)軟件,說(shuō)Component,很多就是指軟件的其中一個(gè)部分,但在UEFI中,Component的定義是: An executable image. Components defined in this specification support on elf the defined module types. 這是一個(gè)“獨立的映像”,和我們一般理解的概念就完全不同,但如果你學(xué)計算機,請了解,這是我們的慣例。 從實(shí)例看driver 和 firmware的區別 (來(lái)自知乎楊慶) 驅動(dòng) driver 指的提供編程api接口,用以操控某一硬件/軟件產(chǎn)品的應用程序。以程序的使用目的來(lái)定義它是否為driver。 固件firmware 概念上來(lái)說(shuō)是指那些預安裝到硬件產(chǎn)品內部只讀記憶體里面,與硬件產(chǎn)品捆綁匹配的程序。這個(gè)名詞的定義主要強調此類(lèi)軟件的不應當被修改,并且與硬件捆綁的特性。更改firmware屬于hack范疇了。 名詞解釋到這,下面舉幾個(gè)例子吧。 屬于driver但不屬于firmware的例子: “ ● oracle database, .net driver。 所有軟件產(chǎn)品的驅動(dòng)都不屬于固件。 ● 打印機驅動(dòng)光盤(pán)。由于并沒(méi)有預裝入打印機只讀記憶體,不屬于固件。 屬于固件但不屬于驅動(dòng)的: “ ● 洗衣機內置電腦程序。此為直接用戶(hù)交互的系統終端(user interface,UI),并不和其他應用程序交互(application programming interface, API)。 ● 計算器里面的操作系統。 同屬于firmware 和 driver的: “ ● 路由器內置系統... 刻錄入路由器存儲器,用于與其他軟件連接交互的(電腦,手機,其他路由器等)。 以下課程可免費試聽(tīng)C語(yǔ)言、電子、PCB、STM32、Linux、FPGA、JAVA、安卓等。 想學(xué)習的你和我聯(lián)系預約就可以免費聽(tīng)課了。 宋工企鵝號:3524-6590-88 Tel/WX:173--1795--1908 |