固件:Firmware. 就是寫入EROM(可擦寫只讀存儲(chǔ)器)或者EEPROM(電可茶歇可編程只讀存儲(chǔ)器)中的程序
供鸠。
固件是只設(shè)備內(nèi)部保存的設(shè)備“驅(qū)動(dòng)程序”畦贸,通過(guò)固件,操作系統(tǒng)才能按照標(biāo)準(zhǔn)的設(shè)備驅(qū)動(dòng)實(shí)現(xiàn)特定機(jī)器的運(yùn)行運(yùn)作回季,比如光驅(qū)家制,刻錄機(jī)等都有內(nèi)部固件。
固件是擔(dān)任著一個(gè)系統(tǒng)最基礎(chǔ)最底層工作的軟件泡一。而在硬件設(shè)備中颤殴,固件就是硬件設(shè)備的靈魂,因?yàn)橐恍┯布O(shè)備除了固件以外沒(méi)有其他軟件組成鼻忠,因此固件也就決定這硬件設(shè)備的功能以及性能涵但。
手機(jī)、數(shù)碼相機(jī)帖蔓、mp3矮瘟、mp4、路由器塑娇、電子書澈侠、交換機(jī)、貓埋酬、PSP哨啃、PS3烧栋、NDS、XBOX拳球、U盤审姓、主板、打印機(jī)的BIOS(BIOS就是一種固件)祝峻、顯卡的BIOS魔吐。
固件既然是軟件,就有大小之分莱找。大的可有幾百兆酬姆,小的也許只有幾K,甚至不足1K宋距。
而對(duì)于非獨(dú)立的電子產(chǎn)品轴踱,比如硬盤、鼠標(biāo)谚赎、BIOS淫僻、光驅(qū)、U盤等設(shè)備壶唤,固件就是指其最底層的雳灵,讓設(shè)備得以運(yùn)行的程序代碼。
固件與驅(qū)動(dòng)的區(qū)別:
驅(qū)動(dòng)和固件(firmware)都是代碼闸盔,前者為軟件服務(wù)悯辙,后者為硬件服務(wù)。
隨著計(jì)算機(jī)體系結(jié)構(gòu)的發(fā)展迎吵,硬件的種類開(kāi)始變多躲撰,操作系統(tǒng)的種類也變多了。
這個(gè)時(shí)候击费,因?yàn)楦鞣N技術(shù)的拢蛋、商業(yè)的原因,硬件廠商希望自己的硬件能被更多的軟件廠商使用蔫巩,所以就需要在硬件之上做一些封裝谆棱,讓自己的硬件操縱起來(lái)更容易,這個(gè)時(shí)候就要有firmware這種東西了圆仔,它簡(jiǎn)化了軟件與硬件的交互垃瞧。
但是為什么不把fimware做的很完美,做的不需要驅(qū)動(dòng)支持呢坪郭?因?yàn)橛胁煌牟僮飨到y(tǒng)个从。
不同的操作系統(tǒng),對(duì)于操作硬件的方式完全不同歪沃,在Windows里應(yīng)用態(tài)是無(wú)法直接寫IO端口的嗦锐,而在嵌入式系統(tǒng)里鸵隧,一般都不限制直接操作IO端口。所以意推,硬件廠商一方面為了自己的硬件能被軟件更簡(jiǎn)單的使用,就需要寫firmware珊蟀,而另一方面為了兼容各種操作系統(tǒng)菊值,又不能把firmware寫的太死,必須預(yù)留足夠的余地讓軟件自由發(fā)揮——軟件的自由發(fā)揮就是驅(qū)動(dòng)育灸。
不同操作系統(tǒng)的驅(qū)動(dòng)是不能兼容的腻窒,原因就是驅(qū)動(dòng)是為操作系統(tǒng)服務(wù)的,有的操作系統(tǒng)是單線程的磅崭,有些操作系統(tǒng)不允許動(dòng)態(tài)申請(qǐng)內(nèi)存儿子,所以不同的操作系統(tǒng)要操作硬件,就要根據(jù)自身的特性編寫對(duì)應(yīng)的操作代碼砸喻,這就是驅(qū)動(dòng)存在的意義——適應(yīng)系統(tǒng)需要柔逼。
假如世界上只有一種操作系統(tǒng),并且版本永遠(yuǎn)不會(huì)改變割岛,那么firmware和驅(qū)動(dòng)就可以融合在一起愉适,但這只能一個(gè)不現(xiàn)實(shí)的夢(mèng)想,要知道民用操作系統(tǒng)和工業(yè)控制操作系統(tǒng)差別是十分巨大的癣漆。
從計(jì)算機(jī)領(lǐng)域來(lái)說(shuō)维咸,驅(qū)動(dòng)和固件從來(lái)沒(méi)有過(guò)明確的定義,就好像今天我們說(shuō)內(nèi)存惠爽,大部分人用來(lái)表示SDRAM癌蓖,但也有人把Android里的“固化的Flash/Storage"稱為“內(nèi)存”,你不能說(shuō)這樣說(shuō)就錯(cuò)了婚肆,因?yàn)檫@確實(shí)是一種“內(nèi)部存儲(chǔ)”租副。
但在Linux Kernel中,Driver和Firmware是有明確含義的旬痹,其中Driver是控制被操作系統(tǒng)管理的外部設(shè)備(Device)的代碼段附井。很多時(shí)候Driver會(huì)被實(shí)現(xiàn)為L(zhǎng)KM,但這不是必要條件两残。driver通過(guò)register_dirver()注冊(cè)到總線(bus_type)上永毅,當(dāng)某個(gè)device被注冊(cè)到同樣的總線的時(shí)候,driver和device會(huì)通過(guò)一定的策略進(jìn)行binding人弓,最終在probe()函數(shù)中由driver實(shí)際控制對(duì)應(yīng)的設(shè)備沼死,并把對(duì)該設(shè)備的控制接口注冊(cè)到Linux的其他子系統(tǒng)上(例如字符設(shè)備,v4l2子系統(tǒng)等)崔赌。
而Firmware意蛀,是表示運(yùn)行在非“控制處理器”(指不直接運(yùn)行操作系統(tǒng)的處理器耸别,例如外設(shè)中的處理器,或者被用于bare metal的主處理器的其中一些核)中的程序县钥。這些程序很多時(shí)候使用和操作系統(tǒng)所運(yùn)行的處理器完全不同的指令集秀姐。這些程序以二進(jìn)制形式存在于Linux內(nèi)核的源代碼樹(shù)中,根據(jù)配置若贮,可以直接集成到最終的映像中省有,或者被拷貝到指定的位置。當(dāng)driver對(duì)device進(jìn)行初始化的時(shí)候谴麦,通過(guò)load_firmware()等接口蠢沿,可以把指定的firmware加載到內(nèi)存中,由驅(qū)動(dòng)傳輸?shù)街付ǖ脑O(shè)備上匾效。
所以舷蟀,總的來(lái)說(shuō),其實(shí)driver和firmware沒(méi)有什么直接的關(guān)系面哼。