每個硬體模組都有乙個包含hw_module_t(為第乙個成員)資料結構的例項,且例項的名字為:hal_module_info_sym,它本身是乙個巨集定義,其定義如下:
hardware.h (通用的東東都在hardware.h和hardware.c中)
[cpp]view plain
copy
/*** name of the hal_module_info
*/#define hal_module_info_sym hmi //.so中將乙個符號hmi,獲取此符號的位址,就獲取到了對應的hw_module_t位址
/*** name of the hal_module_info as a string
*/#define hal_module_info_sym_as_str "hmi"
從hal stub(.so)中獲取hw_module_t(即private_module_t)
呼叫函式int hw_get_module(const char *id, const struct hw_module_t **module),其中id為就是1中所講的gralloc_hardware_module_id,第二個引數為我們要獲取的hw_module_t。
下面以在framebuffernativewindow::framebuffernativewindow中的呼叫流程為例(framebuffernativewindow實現framebuffer的管理,它主要被su***ceflinger使用,也可以被opengl native程式使用。在本質上,它在framebuffer之上實現了乙個anativewindow,目前它只管理兩個buffers:front and back buffer.)
總結
1)hal通過hw_get_module函式獲取hw_module_t
2)hal通過hw_module_t->methods->open獲取hw_device_t指標,並在此open函式中初始化hw_device_t的包裝結構中的函式及hw_device_t中的close函式,如gralloc_device_open。
3)三個重要的資料結構:
a) struct hw_device_t: 表示硬體裝置,儲存了各種硬體裝置的公共屬性和方法
b)struct hw_module_t: 可用hw_get_module進行載入的module
c)struct hw_module_methods_t: 用於定義操作裝置的方法,其中只定義了乙個開啟裝置的方法open.
被中斷的系統呼叫
我們知道系統呼叫一旦阻塞,當訊號到來是會中斷此系統呼叫執行的,但是如下情況是不會對系統呼叫產生影響 1.單個程序阻塞訊號不會對後續系統呼叫產生中斷行為。2.執行緒中通過pthread sigmask阻塞訊號後,對該程序傳送的訊號是不影響該執行緒的系統呼叫的,會被傳送到其他執行緒處理。對於阻塞的訊號,...
呼叫函式和被呼叫函式的關係
1 當在乙個函式的執行期間呼叫另乙個函式時,在執行被呼叫函式之前,系統需要完成三件事情 1 將所有的實參 返回位址等資訊傳遞給被呼叫函式儲存 2 為被呼叫函式的區域性變數分配儲存區 3 將控制轉移到被調函式的入口。2 從被呼叫函式返回到呼叫函式之前,系統要做三件事情 1 儲存被調函式的計算結果 2 ...
probe 何時被呼叫
1 新裝置註冊後,匯流排先match device id,繫結合適的驅動後,呼叫驅動的probe 2 新驅動註冊後,匯流排先match device id,給驅動支援的,未繫結驅動的裝置繫結驅動,並把裝置新增到驅動支援的裝置鍊錶尾部.然後呼叫probe driver register bus add...