久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

linux firmware的含義是什么

177次閱讀
沒有評論

共計 3171 個字符,預計需要花費 8 分鐘才能閱讀完成。

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

在 linux 中,firmware 是指“固件”,是硬件設備自身執行的一段程序,一般存放在設備 flash 內。在 Linux 系統中,設備驅動程序處于內核態,而固件文件處于用戶態,因此需要一個安全穩定可靠的機制,用來確保設備驅動程序成功加載固件文件。

linux firmware 是什么

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

Linux 內核開發過程中,開發人員調試外設驅動設備,比如觸控,充電,線性馬達,存儲,WIFI 設備等,同樣存在需要更新固件的情況。在 Linux 系統中,設備驅動程序處于內核態,而固件文件處于用戶態,因此需要一個安全穩定可靠的機制,用來確保設備驅動程序成功加載固件文件。

為了解決設備驅動程序從內核態穩定加載用戶態固件文件的問題,Linux 系統提供了固件子系統。

Linux 固件子系統流程簡介

Linux 固件子系統基于 sysfs 和 uevent 機制實現。

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

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

1)直接編譯到內核的方式;

2)固件緩存的方式;

3)直接根據內核指定路徑的方式:

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

Linux 固件子系統流程框圖

Linux 固件子系統主要函數接口

主要函數接口:

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

通常申請固件的過程比較耗時,以及處理固件升級的過程比較耗時,因此可以采用異步函數接口實現,或者在驅動程序內先創建工作隊列調用同步函數接口實現。

其中:

內核申請固件文件調用 request_firmware 函數實現。

內核獲取固件文件后調用 release_firmware 釋放相關的內存。

其中:

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

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

Linux 固件子系統實現過程

request_firmware 實現流程

request_firmware 函數通過調用_request_firmware_prepare 函數,設置不同的標志位,實現不同的差異功能。

_request_firmware_prepare 函數:

在打開 CONFIG_FW_LOADER 宏開關基礎上,首先通過調用 fw_get_builtin_firmware 函數的方式,判斷固件文件是否編譯到內核。

接著調用 fw_lookup_and_allocate_buf 函數,判斷全局 fw_cache 結構內鏈表是否記錄過當前請求 firmware 的 name。如果不存在當前請求 firmware 的 name,則動態分配對應的內存空間并且添加當前請求 firmware 的 name 到全局的 fw_cache 結構內的鏈表。

fw_get_filesystem_firmware 函數

主要是通過內核提供的默認路徑去查找固件文件,調用 kernel_read_file_from_path 函數。如果沒有查找到固件文件,則通過標志位 FW_OPT_USERHELPER 判斷,是否啟用 USER_HELPER 模式實現。

其中:

Firmware 系統內默認路徑如下:

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

USER_HELPER 模式

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

fw_load_from_user_helper 函數:

先調用 fw_create_instance 函數創建 device 設備,class 文件和屬性文件,以及分配 firmware_priv 結構體。

接著在 /sys/class/firmware 下將創建一個目錄,該目錄使用設備名作為它的目錄名。

該目錄包含三個屬性:

loading:

設置為 1:該屬性由負責裝載固件的用戶空間設置 1 開始;

設置為 0:當裝載過程完畢;

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

data:

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

device:

/sys/devices 下相應入口的符號鏈接。

timeout:

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

_request_firmware_load 函數:

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

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

接著調用 fw_state_wait_timeout 函數,在預設的超時時間內等待上層 ueventd 的處理。

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

ueventd 相關 firmware 處理流程

Ueventd 是 init 進程內重要的模塊,它主要處理 selinux,dev 設備創建,監聽 kernel 上報 uevent 消息,firmware 固件加載等內容。

FirmwareHandler 處理流程:

FirmwareHandler 內的 HandleUevent 方法主要是處理 firmware 固件加載和底層節點的交互流程。

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

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

ProcessFirmwareEvent 函數

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

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

其中:

ueventd 默認支持搜索固件的路徑:

來自 ueventd.rc 文件內指定的 firmware_directory。

linux firmware 的含義是什么

關于“linux firmware 的含義是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注丸趣 TV 行業資訊頻道,丸趣 TV 小編每天都會為大家更新不同的知識點。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-12發表,共計3171字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 镇江市| 岫岩| 西安市| 二手房| 三明市| 沙田区| 奇台县| 龙南县| 女性| 阳高县| 胶南市| 沈阳市| 巴马| 玉龙| 安多县| 清丰县| 绩溪县| 崇州市| 香河县| 静宁县| 沁源县| 繁昌县| 靖安县| 唐海县| 巍山| 阳春市| 吉首市| 静安区| 宜兴市| 闽侯县| 朝阳区| 陇南市| 连江县| 米林县| 孝昌县| 陇南市| 奇台县| 南丹县| 青河县| 天柱县| 安吉县|