最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Linux固件子系統(tǒng)的實(shí)現(xiàn)機(jī)制簡(jiǎn)介

2023-08-10 16:53 作者:補(bǔ)給站Linux內(nèi)核  | 我要投稿

一、Linux固件子系統(tǒng)概述

固件是硬件設(shè)備自身執(zhí)行的一段程序。固件一般存放在設(shè)備flash內(nèi)。而出于成本和便利性的考慮,通常是先將硬件設(shè)備的運(yùn)行程序打包為一個(gè)特定格式的固件文件,存儲(chǔ)到終端系統(tǒng)內(nèi),通過(guò)終端系統(tǒng)給硬件設(shè)備進(jìn)行升級(jí)。Linux內(nèi)核開(kāi)發(fā)過(guò)程中,開(kāi)發(fā)人員調(diào)試外設(shè)驅(qū)動(dòng)設(shè)備,比如觸控,充電,線性馬達(dá),存儲(chǔ),WIFI設(shè)備等,同樣存在需要更新固件的情況。在Linux系統(tǒng)中,設(shè)備驅(qū)動(dòng)程序處于內(nèi)核態(tài),而固件文件處于用戶態(tài),因此需要一個(gè)安全穩(wěn)定可靠的機(jī)制,用來(lái)確保設(shè)備驅(qū)動(dòng)程序成功加載固件文件。為了解決設(shè)備驅(qū)動(dòng)程序從內(nèi)核態(tài)穩(wěn)定加載用戶態(tài)固件文件的問(wèn)題,Linux系統(tǒng)提供了固件子系統(tǒng)。

二、Linux固件子系統(tǒng)實(shí)現(xiàn)機(jī)制

1. 流程簡(jiǎn)介:


Linux固件子系統(tǒng)基于sysfs 和uevent機(jī)制實(shí)現(xiàn)。
驅(qū)動(dòng)程序調(diào)用固件系統(tǒng)函數(shù)接口申請(qǐng)固件之后,固件子系統(tǒng)使用固件編譯內(nèi)核的方式去獲取固件;如果獲取失敗,就使用固件緩存的方式去獲取固件;如果仍然獲取失敗,就使用默認(rèn)路徑內(nèi)核直接查找的方式去獲取固件。如果還是獲取失敗,就通過(guò)上報(bào)uevent消息給init進(jìn)程。init進(jìn)程則接收到uevent消息,過(guò)濾出subsystem類型為firmware的消息。init進(jìn)程根據(jù)uevent消息內(nèi)指向的固件信息去查找固件,通過(guò)sysfs提供的文件節(jié)點(diǎn)接口,把獲取的固件內(nèi)容從用戶態(tài)寫入內(nèi)核態(tài),從而使驅(qū)動(dòng)程序,獲取到固件文件的數(shù)據(jù)。
Linux固件系統(tǒng)提供了多種在不同場(chǎng)景下獲取固件文件的方法。

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

2)固件緩存的方式;

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

4)通過(guò)init進(jìn)程來(lái)協(xié)助處理的方式;



2. 流程框圖:




3. 主要函數(shù)接口:


主要函數(shù)接口:?申請(qǐng)固件接口主要類型分為同步和異步。
通常申請(qǐng)固件的過(guò)程比較耗時(shí),以及處理固件升級(jí)的過(guò)程比較耗時(shí),因此可以采用異步函數(shù)接口實(shí)現(xiàn),或者在驅(qū)動(dòng)程序內(nèi)先創(chuàng)建工作隊(duì)列調(diào)用同步函數(shù)接口實(shí)現(xiàn)。?其中:

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

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



其中:

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

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




4.?實(shí)現(xiàn)過(guò)程:


(1)request_firmware實(shí)現(xiàn)流程:


request_firmware函數(shù)通過(guò)調(diào)用_request_firmware_prepare函數(shù),設(shè)置不同的標(biāo)志位,實(shí)現(xiàn)不同的差異功能。
a. _request_firmware_prepare函數(shù):
在打開(kāi)CONFIG_FW_LOADER宏開(kāi)關(guān)基礎(chǔ)上,首先通過(guò)調(diào)用fw_get_builtin_firmware函數(shù)的方式,判斷固件文件是否編譯到內(nèi)核。


接著調(diào)用fw_lookup_and_allocate_buf函數(shù),判斷全局fw_cache結(jié)構(gòu)內(nèi)鏈表是否記錄過(guò)當(dāng)前請(qǐng)求firmware的name。如果不存在當(dāng)前請(qǐng)求firmware的name,則動(dòng)態(tài)分配對(duì)應(yīng)的內(nèi)存空間并且添加當(dāng)前請(qǐng)求firmware的name到全局的fw_cache結(jié)構(gòu)內(nèi)的鏈表。
b. ?fw_get_filesystem_firmware函數(shù):
主要是通過(guò)內(nèi)核提供的默認(rèn)路徑去查找固件文件,調(diào)用kernel_read_file_from_path函數(shù)。如果沒(méi)有查找到固件文件,則通過(guò)標(biāo)志位FW_OPT_USERHELPER判斷,是否啟用USER_HELPER模式實(shí)現(xiàn)。
其中:

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



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


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個(gè)人覺(jué)得比較好的學(xué)習(xí)書(shū)籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書(shū)、實(shí)戰(zhàn)項(xiàng)目及代碼)? ?



(2) USER_HELPER模式:


在內(nèi)核打開(kāi)CONFIG_FW_LOADER_USER_HELPER之后,才支持該功能。主要功能就是通過(guò)kernel上報(bào)uevent消息給到init進(jìn)程,通過(guò)init進(jìn)程獲取固件信息寫入底層sysfs節(jié)點(diǎn)。
a. ?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)建一個(gè)目錄,該目錄使用設(shè)備名作為它的目錄名。
該目錄包含三個(gè)屬性:?

  • loading:

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

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

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


  • data:

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


  • device:

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


  • timeout:

默認(rèn)申請(qǐng)firmware通過(guò)uevent方式最大超時(shí)時(shí)間為60S,支持上層寫入超時(shí)時(shí)間。?b. ?_request_firmware_load函數(shù):
首先先禁用uevent上報(bào),通過(guò)調(diào)用device_add函數(shù)添加設(shè)備,觸發(fā)調(diào)用firmware_uevent函數(shù)。其中,填充uevent上報(bào)的信息格式,包括固件的名稱,超時(shí)時(shí)間,是否異步。


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


接著調(diào)用fw_state_wait_timeout函數(shù),在預(yù)設(shè)的超時(shí)時(shí)間內(nèi)等待上層ueventd的處理。
若超時(shí)時(shí)間達(dá)到或者收到完成量喚醒,則釋放之前申請(qǐng)的內(nèi)存,釋放device,class等內(nèi)存信息。

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


Ueventd是init進(jìn)程內(nèi)重要的模塊,它主要處理selinux,dev設(shè)備創(chuàng)建,監(jiān)聽(tīng)kernel上報(bào)uevent消息,firmware固件加載等內(nèi)容。
a. ?FirmwareHandler處理流程:
FirmwareHandler內(nèi)的HandleUevent方法主要是處理firmware固件加載和底層節(jié)點(diǎn)的交互流程。
首先先判斷uevent消息的subsystem類型是firmware字段才進(jìn)行處理,這個(gè)類型只有kernel內(nèi)firmware模塊才會(huì)上報(bào)。
HandleUevent主要是通過(guò)一個(gè)主線程創(chuàng)建不同的子線程,并行分別處理來(lái)自kernel的不同驅(qū)動(dòng)的firmware請(qǐng)求。


b. ?ProcessFirmwareEvent函數(shù):
首先是循環(huán)判斷ueventd支持的路徑內(nèi)檢索固件文件是否存在;若存在,則寫入底層loading屬性文件為1,同時(shí)拷貝獲取的固件文件,寫入到底層data文件。完成之后則寫入底層loading屬性文件為0。
至此,kernel就獲取到了用戶空間寫入的固件文件信息。


其中:

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

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




原文作者:內(nèi)核工匠





Linux固件子系統(tǒng)的實(shí)現(xiàn)機(jī)制簡(jiǎn)介的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
林甸县| 泗阳县| 保亭| 天峨县| 勐海县| 航空| 黄山市| 芒康县| 北辰区| 长治市| 离岛区| 大宁县| 西城区| 梁山县| 西乌| 铜梁县| 庄河市| 黔江区| 阿拉尔市| 出国| 新龙县| 淳化县| 长武县| 黄山市| 雷州市| 五家渠市| 嘉义县| 兴和县| 武乡县| 青川县| 新竹市| 栾城县| 平阳县| 怀安县| 开鲁县| 汨罗市| 东乌珠穆沁旗| 枝江市| 会宁县| 鹤岗市| 鸡东县|