Android HAL的被呼叫流程

2021-06-18 20:48:23 字數 1299 閱讀 9737

每個硬體模組都有乙個包含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...