溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

linux firmware的含義是什么

發(fā)布時間:2023-04-18 14:22:49 來源:億速云 閱讀:200 作者:iii 欄目:建站服務(wù)器

這篇文章主要介紹“l(fā)inux firmware的含義是什么”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“l(fā)inux firmware的含義是什么”文章能幫助大家解決問題。

在linux中,firmware是指“固件”,是硬件設(shè)備自身執(zhí)行的一段程序,一般存放在設(shè)備flash內(nèi)。在Linux系統(tǒng)中,設(shè)備驅(qū)動程序處于內(nèi)核態(tài),而固件文件處于用戶態(tài),因此需要一個安全穩(wěn)定可靠的機制,用來確保設(shè)備驅(qū)動程序成功加載固件文件。

linux firmware是什么

固件(firmware)是硬件設(shè)備自身執(zhí)行的一段程序。固件一般存放在設(shè)備flash內(nèi)。而出于成本和便利性的考慮,通常是先將硬件設(shè)備的運行程序打包為一個特定格式的固件文件,存儲到終端系統(tǒng)內(nèi),通過終端系統(tǒng)給硬件設(shè)備進行升級。

Linux內(nèi)核開發(fā)過程中,開發(fā)人員調(diào)試外設(shè)驅(qū)動設(shè)備,比如觸控,充電,線性馬達(dá),存儲,WIFI設(shè)備等,同樣存在需要更新固件的情況。在Linux系統(tǒng)中,設(shè)備驅(qū)動程序處于內(nèi)核態(tài),而固件文件處于用戶態(tài),因此需要一個安全穩(wěn)定可靠的機制,用來確保設(shè)備驅(qū)動程序成功加載固件文件。

為了解決設(shè)備驅(qū)動程序從內(nèi)核態(tài)穩(wěn)定加載用戶態(tài)固件文件的問題,Linux系統(tǒng)提供了固件子系統(tǒng)。

Linux固件子系統(tǒng)流程簡介

Linux固件子系統(tǒng)基于sysfs 和uevent機制實現(xiàn)。

驅(qū)動程序調(diào)用固件系統(tǒng)函數(shù)接口申請固件之后,固件子系統(tǒng)使用固件編譯內(nèi)核的方式去獲取固件;如果獲取失敗,就使用固件緩存的方式去獲取固件;如果仍然獲取失敗,就使用默認(rèn)路徑內(nèi)核直接查找的方式去獲取固件。如果還是獲取失敗,就通過上報uevent消息給init進程。init進程則接收到uevent消息,過濾出subsystem類型為firmware的消息。init進程根據(jù)uevent消息內(nèi)指向的固件信息去查找固件,通過sysfs提供的文件節(jié)點接口,把獲取的固件內(nèi)容從用戶態(tài)寫入內(nèi)核態(tài),從而使驅(qū)動程序,獲取到固件文件的數(shù)據(jù)。

Linux固件系統(tǒng)提供了多種在不同場景下獲取固件文件的方法。

1)直接編譯到內(nèi)核的方式;

2)固件緩存的方式;

3)直接根據(jù)內(nèi)核指定路徑的方式:

4)通過init進程來協(xié)助處理的方式;

Linux固件子系統(tǒng)流程框圖

linux firmware的含義是什么

Linux固件子系統(tǒng)主要函數(shù)接口

主要函數(shù)接口:

申請固件接口主要類型分為同步和異步。

通常申請固件的過程比較耗時,以及處理固件升級的過程比較耗時,因此可以采用異步函數(shù)接口實現(xiàn),或者在驅(qū)動程序內(nèi)先創(chuàng)建工作隊列調(diào)用同步函數(shù)接口實現(xiàn)。

其中:

  • 內(nèi)核申請固件文件調(diào)用 request_firmware函數(shù)實現(xiàn)。

  • 內(nèi)核獲取固件文件后調(diào)用release_firmware釋放相關(guān)的內(nèi)存。

linux firmware的含義是什么

其中:

  • request_firmware_direct接口只在內(nèi)核指定的路徑內(nèi)查找固件,不使用uevent機制來獲取固件。

  • request_firmware_nowait接口是通過異步的工作隊列去獲取固件,可以起到不阻塞驅(qū)動probe時間的作用。

linux firmware的含義是什么

Linux固件子系統(tǒng)實現(xiàn)過程

request_firmware實現(xiàn)流程

request_firmware函數(shù)通過調(diào)用_request_firmware_prepare函數(shù),設(shè)置不同的標(biāo)志位,實現(xiàn)不同的差異功能。

  • _request_firmware_prepare函數(shù):

在打開CONFIG_FW_LOADER宏開關(guān)基礎(chǔ)上,首先通過調(diào)用fw_get_builtin_firmware函數(shù)的方式,判斷固件文件是否編譯到內(nèi)核。

linux firmware的含義是什么

接著調(diào)用fw_lookup_and_allocate_buf函數(shù),判斷全局fw_cache結(jié)構(gòu)內(nèi)鏈表是否記錄過當(dāng)前請求firmware的name。如果不存在當(dāng)前請求firmware的name,則動態(tài)分配對應(yīng)的內(nèi)存空間并且添加當(dāng)前請求firmware的name到全局的fw_cache結(jié)構(gòu)內(nèi)的鏈表。

  • fw_get_filesystem_firmware函數(shù)

主要是通過內(nèi)核提供的默認(rèn)路徑去查找固件文件,調(diào)用kernel_read_file_from_path函數(shù)。如果沒有查找到固件文件,則通過標(biāo)志位FW_OPT_USERHELPER判斷,是否啟用USER_HELPER模式實現(xiàn)。

其中:

Firmware系統(tǒng)內(nèi)默認(rèn)路徑如下:

linux firmware的含義是什么

默認(rèn)路徑可以通過kernel command line的方式來增加一個路徑,通過module_param_string接口傳遞給變量path來客制化新增路徑。

linux firmware的含義是什么

USER_HELPER模式

在內(nèi)核打開CONFIG_FW_LOADER_USER_HELPER之后,才支持該功能。主要功能就是通過kernel上報uevent消息給到init進程,通過init進程獲取固件信息寫入底層sysfs節(jié)點。

fw_load_from_user_helper函數(shù):

先調(diào)用fw_create_instance函數(shù)創(chuàng)建device設(shè)備,class文件和屬性文件,以及分配firmware_priv結(jié)構(gòu)體。

接著在 /sys/class/firmware 下將創(chuàng)建一個目錄,該目錄使用設(shè)備名作為它的目錄名。

該目錄包含三個屬性:

  • loading:

    設(shè)置為 1:該屬性由負(fù)責(zé)裝載固件的用戶空間設(shè)置1開始;

    設(shè)置為 0:當(dāng)裝載過程完畢;

    設(shè)置為 -1:將終止固件裝載過程。

  • data:

    用來接收固件數(shù)據(jù),在設(shè)置完 loading 后,用戶空間進程把固件寫入該屬性。

  • device:

    /sys/devices 下相應(yīng)入口的符號鏈接。

  • timeout:

    默認(rèn)申請firmware通過uevent方式最大超時時間為60S,支持上層寫入超時時間。

_request_firmware_load函數(shù):

首先先禁用uevent上報,通過調(diào)用device_add函數(shù)添加設(shè)備,觸發(fā)調(diào)用firmware_uevent函數(shù)。其中,填充uevent上報的信息格式,包括固件的名稱,超時時間,是否異步。

linux firmware的含義是什么

下一步則啟用uevent上報功能,同時調(diào)用kobject_uevent函數(shù),上報add動作類型給到上層ueventd。

linux firmware的含義是什么

接著調(diào)用fw_state_wait_timeout函數(shù),在預(yù)設(shè)的超時時間內(nèi)等待上層ueventd的處理。

若超時時間達(dá)到或者收到完成量喚醒,則釋放之前申請的內(nèi)存,釋放device,class等內(nèi)存信息。

ueventd相關(guān)firmware處理流程

Ueventd是init進程內(nèi)重要的模塊,它主要處理selinux,dev設(shè)備創(chuàng)建,監(jiān)聽kernel上報uevent消息,firmware固件加載等內(nèi)容。

FirmwareHandler處理流程:

FirmwareHandler內(nèi)的HandleUevent方法主要是處理firmware固件加載和底層節(jié)點的交互流程。

首先先判斷uevent消息的subsystem類型是firmware字段才進行處理,這個類型只有kernel內(nèi)firmware模塊才會上報。

HandleUevent主要是通過一個主線程創(chuàng)建不同的子線程,并行分別處理來自kernel的不同驅(qū)動的firmware請求。

linux firmware的含義是什么

ProcessFirmwareEvent函數(shù)

首先是循環(huán)判斷ueventd支持的路徑內(nèi)檢索固件文件是否存在;若存在,則寫入底層loading屬性文件為1,同時拷貝獲取的固件文件,寫入到底層data文件。完成之后則寫入底層loading屬性文件為0。

至此,kernel就獲取到了用戶空間寫入的固件文件信息。

linux firmware的含義是什么

其中:

ueventd 默認(rèn)支持搜索固件的路徑:

來自 ueventd.rc文件內(nèi)指定的firmware_directory。

linux firmware的含義是什么

關(guān)于“l(fā)inux firmware的含義是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI