每乙個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 寫成,不能由其他類載入器載入 載入類 雙親委派模型 從子類到父類依次查...