日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 的用户层 uevent处理机制

發布時間:2025/3/17 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 的用户层 uevent处理机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

摘錄幾篇android研發日志

1 http://blog.csdn.net/linweig/archive/2010/06/01/5640697.aspx

Firmware 加載原理分析----分析的比較透徹,我在wifimodule調試時遇到的問題幾乎跟這個一樣,不過我采取了另外一個方法,直接用kernel的read和write了,沒有使用request_firmware,有空小結下。

前言 ?????

????????????? 前段時間移植 wifi 驅動到 android 的內核上,發現 firmware 的加載始終出錯,問了幾個人,都不是很了解,沒辦法,只好自己研究一下。

原理分析

??? 從本質上來說, firmware 需要做的事情包括兩件:

1,? 通知用戶態程序,我需要下載 firmware 了;

2,? 用戶態程序把用戶態的數據 copy 到內核層;

3,? 內核把內核態的數據寫到設備上,比如 wifi 模塊里;

其中第三步應該不難,關鍵是看看, linux 里面是如何實現第一、二步的;

實現機制

????????????? 簡單的說,它的機制分成以下幾部分:

1,? 通過一定的方式,通知用戶態程序,比如 init 程序,如圖所示:

??????

?????? 顯然是通過 kobject_uevent 的方式通知的 應用層,它的機制我有空再詳細解釋,簡單的說,就是往一個 socket 廣播一個消息,只需要在應用層打開 socket 監聽 NETLINK_KOBJECT_UEVENT 組的消息,就可以收到了。

????????? 用戶態的 init 是如何做的?

?????? 可以看到 init 程序打開了一個 socket ,然后綁定它, 最后通過 select 來監聽 socket 上來的數據,最后調用 handle_device_fd 來處理收到的消息;當內核發送一個 KOBJ_ADD 的消息上來的時候,經過過 濾,判斷是否是 firmware 要被加載的消息,然后調用

????????????? handle_firmware_event 來處理;

2,? 用戶態的數據如何下載到內核;

?????? 本質上它是內核創建了兩個文件,一個文件 A 用來標志下載的開始和結 束,另外一個文件 B 用來接收用戶層傳下來的數據,當用戶態的程序往 A 文件寫入 1 的時候,標志用戶態程序已經往里面寫程序來,而往里面寫入 0 的時候,就標志下載成功結束,如果寫入 -1 就表示下載失敗了;下面 看看這兩個文件是如何被創建的 , 以及數據是如何寫到內核的,請看圖:

????????????????????????????????????????????????? ??????

?????? 這個圖基本上就是兩個文件被創立的過程,以及當這兩個文 件被用戶態程序訪問的時候將要被調用的函數,比如對于標志文件,如果往里面寫入數據,將會觸發函數 firmware_loading_store 函數,如果往 bin 文件里面寫入數據將會觸發 bin 文件類型的 write 函數;

?????? 用戶態寫數據的過程大約是這樣的:當用戶態收到 KOBJ_ADD 消息的時候 最終將會調用 handle_firmware_event 的函數;

??????

??????

?

??????

????????????????????? 它的過程就是:

a, 先往標志文件里面寫 1

b, 從用戶空間讀取數據;

c, 往內核創建的文件里面寫數據;

d, 如果成功寫入 0 ,否則寫入 -1

?

下面看看內核是如何接受這些文件的,前面提到內核創建了一個 bin 文件,用來接收用戶態的數據,下面看 看這個過程:

??????? 對于 SYSFS_KOBJ_BIN_ATTR 屬 性的文件,在 inode 初始化的時候,將會被賦予 bin_fops 的文件操作函數集,于是當上層調用 write 的時候,將會走到內核的 bin_fops.write 函數;這個函數干的事情很簡單,就是把用戶態的數據 copyright bb->buffer ,而 bb->buffer 其 實是在 open 的 時候分配的空間,這樣的話,就實現了用戶態的數據到內核的 copy ;過程是不是完了?

還有一個步驟,這個 bb->buffer 本身是如何與 wifi 驅動交互的呢?這只是一個中間層,它的數據必須要寫到 wifi 的驅動才應該算完整,而這一步其實 就是通過 flush_write 來完成的,下面看看這個過程:

這里可以清楚的看到, flush_write 做的事情就是把 bb->buffer 的內容 copy wifi driver 分配的空間 fw->data 里面去了,至此,用戶態的數據已經完整的寫到了 wifi driver 空間了;

?

3,? 內核態的數據到 wifi 模塊

???????????????????????????????????????????????????????? 這個就比較簡單了,通過函數 sdio_writesb 利用 sdio 總線把數據寫到模塊 里面去了;

?

?

總結

????????????? ??? Firmware 的加載主要是利用了 uevent 的通訊機制實現用戶態和內核 態的交互,另外還涉及了 sys 文件系統里的文件創建 , 我加載 wifi firmware 始終出錯的原因是 android 的文件系統要求把 wifi firmware helper 放到 /etc/firmware 里面,而把真正 的 firmware sd8686.bin 放到 /etc/firmware/mrvl 里面,估計是 marvel 修改后的結果,結論就是,這個設計真丑;

?

轉載于:https://blog.51cto.com/dongyulong/389159

總結

以上是生活随笔為你收集整理的Android 的用户层 uevent处理机制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。