hw module t 載入過程

2021-08-11 14:57:45 字數 4614 閱讀 6767



每乙個hal

模組都有乙個

id值,以這些

id值為引數來呼叫硬體抽象層提供的函式

hw_get_module

就可以將

指定的模組載入到記憶體來,並且獲得

乙個hw_module_t

介面來開啟相應的裝置。

函式hw_get_module

實現在hardware/libhardware/hardware.c

檔案中,如下所示: 1.

#define hal_library_path1 "/system/lib/hw"

2.#define hal_library_path2 "/vendor/lib/hw"

3.static

const

char*variant_keys = ;  

9.// 

由上面定義的字串陣列可知,

hal_variant_keys_count

的值為4

10.struct

constint hal_variant_keys_count = (sizeof

(variant_keys)/sizeof

(variant_keys[0]));  

11.

12.inthw_get_module(const

char*id,const

struct

hw_module_t **module)  

15.

16.inthw_get_module_by_class(const

char*class_id,const

char*inst,   

17.const

struct

hw_module_t **module);  

23.charpath[path_max];  

24.charname[path_max];  

25.// 

由前面呼叫函式可知,

inst 

=null

,執行else

部分,將硬體

id名拷貝到

name

陣列裡

26.if

(inst)  

27.snprintf(name, path_max, 「%s.%s」, class_id, inst);  

28.else

29.strlcpy(name, class_id, path_max);  

30.// i 迴圈5

次 31.

for

(i=0; i

32.if

(i

33.// 

從系統屬性裡依次查詢前面定義的

4個屬性的值,找其中乙個後,執行後面**,找不到,進入

else

部分執行

34.if

(property_get(variant_keys[i], prop, null) == 0)  

37.// 

找到乙個屬性值

prop

後,拼寫

path

的值為:

/vendor/lib/hw/

硬體id

名.prop.so

38.snprintf(path,sizeof

(path), 「%s/%s.%s.so」,  

39.hal_library_path2, name, prop);  

40.if

(access(path, r_ok) ==0)break

;   

// 如果

path

指向有效的庫檔案,退出

for迴圈

41.// 

如果vendor/lib/hw

目錄下沒有庫檔案,查詢

/system/lib/hw

目錄下有沒有:硬體id名

.prop.so

的庫檔案

42.snprintf(path,sizeof

(path), 「%s/%s.%s.so」,  

43.hal_library_path1, name, prop);  

44.if(access(path, r_ok) == 0)break

;  

45.}else

51.}  

52.status = -enoent;  

53.if

(i

54.status = load(class_id, path, module);  

// 難道是要載入前面查詢到的

so庫??

55.}  

56.return

status;  

57.}  

58.

函式hw_get_module_by_class

依次在目錄/system/lib /hw和/vendor/lib/hw中查詢乙個名稱為".variant.so"的檔案,其 中,是乙個模組id,而variant表 示"ro.hardware"、"ro.product.board"、"ro.board.platform"和"ro.arch"四個系統屬性值之一。例如,對於gralloc模組來說,函式hw_get_module依次在目錄/system/lib/hw和/vendor/lib/hw中檢查是否存在以下四個檔案:

gralloc..so

gralloc..so

gralloc..so

gralloc..so

只要其中的乙個檔案存在,函式hw_get_module就會停止查詢過程,並且呼叫另外乙個函式load來將這個檔案載入到

記憶體中來。另一方面,如果在/system/lib/hw和/vendor/lib/hw中均不存這些檔案,那麼函式hw_get_module就會在目錄

/system/lib/hw中查詢是否存在乙個名稱為gralloc.default.so的檔案。如果存在的話,那麼也會呼叫函式load將它載入到內

存中來,如下所示:

1.static

intload(const

char*id, counstchar*path,const

struct

hw_module_t **phmi)  

15.// 

將庫的控制代碼儲存到

hmi硬體物件的

dso成員裡

16.hmi->dso = handle;  

17.// 

將硬體物件位址送給

load

函式者,最終將硬體物件返回到了

hw_get_module

的呼叫者

18.*phmi = hmi;  

19.// 

成功返回

20.}  

在linux

系統中,字尾名為"so"的檔案為動態鏈結庫檔案,可能通過函式dlopen來載入到記憶體中。硬體抽象層模組編寫規範規定每

乙個硬體抽象層模組都必須匯出乙個符號名稱為hal_module_info_sym_as_str的符號,而且這個符號必須是用來描述乙個型別為

hw_module_t的結構體的。

hal_module_info_sym_as_str

是乙個巨集,定義在檔案hardware/libhardware/include/hardware/hardware.h檔案中,如下所示: 1.

#define hal_module_info_sym_as_str  "hmi"  

將模組載入到記憶體中來之後,就可以呼叫函式dlsym來獲得它所匯出的符號hmi。由於這個符號指向的是乙個hw_module_t結構體,

因此,最後函式load就可以強制地將這個符號轉換為乙個hw_module_t結構體指標,並且儲存在輸出引數phmi中返回給呼叫者。

spring bean載入過程

spring通過資源載入器載入相應的xml檔案,使用讀取器讀取資源載入器中的檔案到讀取器中,在讀取過程中,解析相應的xml檔案元素,轉化為spring定義的資料結beandefinition,把相應的beandefinition註冊到登錄檔中。登錄檔中包含的beandefinition的資料結構,沒...

UIViewController載入過程

uiviewcontroller是檢視和資料的橋梁,uiviewcontroller是所有controller的基類,ios內建了很多試圖控制器,如導航控制器,tableviewcontroller等。檢視控制本身包含乙個檢視,是view。uiscreen是連線物理螢幕的標示,uiwindow是為u...

類載入過程

類載入時機 1 new 靜態屬性,靜態方法呼叫 2 people.class 獲取class物件 3 載入子類時需提前載入父類 4 main函式所在的類需要載入 類載入器 也是一種類,可由其他類載入器載入 頂級父類載入器有c,c 寫成,不能由其他類載入器載入 載入類 雙親委派模型 從子類到父類依次查...