嵌入式系統(tǒng)結(jié)構(gòu)與操作系統(tǒng)課件chapter11android hal層_第1頁
嵌入式系統(tǒng)結(jié)構(gòu)與操作系統(tǒng)課件chapter11android hal層_第2頁
嵌入式系統(tǒng)結(jié)構(gòu)與操作系統(tǒng)課件chapter11android hal層_第3頁
嵌入式系統(tǒng)結(jié)構(gòu)與操作系統(tǒng)課件chapter11android hal層_第4頁
嵌入式系統(tǒng)結(jié)構(gòu)與操作系統(tǒng)課件chapter11android hal層_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

2023/3/5武漢科技大學(xué)Page1第11章AndroidHAL層【學(xué)習(xí)目標(biāo)】了解HAL層的概念熟悉HAL層的實(shí)現(xiàn)原理2023/3/5武漢科技大學(xué)Page2第11章AndroidHAL層

初識(shí)HAL層11.1HAL層的實(shí)現(xiàn)原理11.2小結(jié)11.32023/3/5武漢科技大學(xué)Page311.1初識(shí)HAL層HAL(HardwareAbstractionLayer)層又被稱為硬件抽象層,是建立在Linux驅(qū)動(dòng)上的一套程序庫,主要作用是對(duì)Linux內(nèi)核驅(qū)動(dòng)程序的封裝,向上提供接口,屏蔽底層的實(shí)現(xiàn)細(xì)節(jié)。HAL層運(yùn)行在用戶空間,屬于Linux內(nèi)核層之上的應(yīng)用層。Google這樣設(shè)計(jì)的原因,主要是為了保護(hù)各硬件廠商的利益。也正是因?yàn)槿绱?,Android被踢出了Linux內(nèi)核主線代碼樹。Linux內(nèi)核采用了GPL協(xié)議,這要求Linux內(nèi)核在發(fā)布時(shí)必須公布所有源代碼。如果把對(duì)硬件的支持邏輯放在Linux驅(qū)動(dòng)層,則在公布源代碼的時(shí)候把硬件的相關(guān)參數(shù)和實(shí)現(xiàn)也同時(shí)公開了,這設(shè)計(jì)到了技術(shù)專利和商業(yè)秘密,會(huì)對(duì)硬件廠商的利益造成很大的損害。正是為了保護(hù)這些廠商的利益,Google才決定將對(duì)硬件的支持分為了硬件抽象層和內(nèi)核驅(qū)動(dòng)層。2023/3/5武漢科技大學(xué)Page411.1初識(shí)HAL層在Android系統(tǒng)中,業(yè)務(wù)邏輯代碼通常放在硬件抽象層中,Linux內(nèi)核層只保留與寄存器交互的代碼。也就是說,Linux驅(qū)動(dòng)相當(dāng)于一個(gè)空殼,僅提供簡(jiǎn)單的硬件訪問邏輯,例如讀寫硬件寄存器的通道,至于從硬件中讀到了什么值或者寫了什么值到硬件中的邏輯,都放在硬件抽象層中去了。有了硬件抽象層后,AndroidFramework與LinuxKernel被分隔開來,Android不至于過度依賴LinuxKernel,因此達(dá)成了KernelIndependent的概念,AndroidFramework的開發(fā)也能夠在不考慮驅(qū)動(dòng)程序的前提下進(jìn)行發(fā)展。硬件抽象層提供了簡(jiǎn)單的設(shè)備驅(qū)動(dòng)程序接口,應(yīng)用程序使用設(shè)備驅(qū)動(dòng)程序與底層硬件進(jìn)行通信,另外,硬件抽象層的應(yīng)用程序接口和ANSIC標(biāo)準(zhǔn)庫結(jié)合在一起,用戶可以使用C語言函數(shù)來訪問Android文件系統(tǒng)。2023/3/5武漢科技大學(xué)Page511.1初識(shí)HAL層總之,Google為Android加入HAL主要有如下目的:統(tǒng)一硬件的調(diào)用接口。由于HAL有標(biāo)準(zhǔn)的調(diào)用接口,所以可以利用HAL屏蔽Linux驅(qū)動(dòng)復(fù)雜、不統(tǒng)一的接口。解決了GPL版權(quán)問題。由于Linux內(nèi)核基于GPL協(xié)議,而Android基于ApacheLicense2.0協(xié)議。因此Google玩了個(gè)“穿越”,將原本位于Linux驅(qū)動(dòng)中的敏感代碼向上移了一個(gè)層次。這樣這些敏感代碼就擺脫了GPL協(xié)議的束縛,那些不想開源的Linux驅(qū)動(dòng)作者也就沒必要開源了。針對(duì)一些特殊的要求。對(duì)于有些硬件,可能需要訪問一些用戶空間的資源,或在內(nèi)核空間不方便完成的工作以及特殊需求。在這種情況下,可以利用位于用戶空間的HAL代碼來輔助Linux驅(qū)動(dòng)完成一些工作。2023/3/5武漢科技大學(xué)Page611.2HAL層的實(shí)現(xiàn)原理HAL層的架構(gòu)HALmodule分析2023/3/5武漢科技大學(xué)Page711.2.1HAL層的架構(gòu)早期的AndroidHAL架構(gòu)如圖4-1所示。該架構(gòu)比較簡(jiǎn)單,通過鏈接庫模塊實(shí)現(xiàn),在“hardware/libhardware_legacy/”目錄中,它需要將HAL實(shí)現(xiàn)為一個(gè)*.so的共享庫,然后在Runtime中通過函數(shù)直接調(diào)用HALModule來操作驅(qū)動(dòng)程序;如果使用C++編寫應(yīng)用程序,也可以直接通過dlopen來加載制定的*.so庫。由于采取直接調(diào)用的方式,可被多個(gè)進(jìn)程使用,但會(huì)被映射到多個(gè)進(jìn)程空間中,從而造成資源浪費(fèi),同時(shí)需要考慮代碼能否安全沖入的問題(threadsafe)。2023/3/5武漢科技大學(xué)Page811.2.1HAL層的架構(gòu)新版本的Android系統(tǒng)將如下圖(左)所示的HAL架構(gòu)修改成了如下圖(右)所示的HAL架構(gòu)。2023/3/5武漢科技大學(xué)Page911.2.1HAL層的架構(gòu)在如圖4-2所示的HAL架構(gòu)中,HALstub模式是一種代理人(proxy)的概念,雖然stub仍以“*.so”檔的形式存在,但是HAL已經(jīng)將“*.so”檔隱藏了。Stub向HAL提供了功能強(qiáng)大的操作函數(shù)(operation),而Runtime則從HAL獲取特定模塊(stub)的函數(shù),然后再毀掉這些操作函數(shù)。這種以IndirectFunctionCall模式的架構(gòu),讓HALstub變成了一種“包含”關(guān)系,也就是說在HAL里包含了許多stub(模塊)。Runtime只要說明moduleID(類型)就可以取得操作函數(shù)。在當(dāng)前的HAL模式中,Android定義了HAL層結(jié)構(gòu)框架,這樣通過接口訪問硬件時(shí)就形成了統(tǒng)一的調(diào)用方式。2023/3/5武漢科技大學(xué)Page1011.2.2HALmodule分析在HALmodule中有三個(gè)重要的數(shù)據(jù)結(jié)構(gòu):structhw_module_tstructhw_module_methods_tstructhw_device_t2023/3/5武漢科技大學(xué)Page1111.2.2HALmodule分析這三個(gè)結(jié)構(gòu)的繼承關(guān)系如圖所示。2023/3/5武漢科技大學(xué)Page1211.2.2HALmodule分析結(jié)構(gòu)體hw_device_t表示硬件設(shè)備,存儲(chǔ)了各種硬件設(shè)備的公共屬性和方法,如果需要移植或者添加新硬件,那么都需要使用該結(jié)構(gòu)體進(jìn)行注冊(cè),其中的tag必須初始化,其定義如下。typedefstructhw_device_t{/**tagmustbeinitializedtoHARDWARE_DEVICE_TAG*/uint32_ttag;uint32_tversion;/**referencetothemodulethisdevicebelongsto*/structhw_module_t*module;/**paddingreservedforfutureuse*/uint32_treserved[12];/**Closethisdevice*/int(*close)(structhw_device_t*device);}hw_device_t;2023/3/5武漢科技大學(xué)Page1311.2.2HALmodule分析結(jié)構(gòu)體hw_module_t在進(jìn)行加載的時(shí)候用于判斷屬于哪一個(gè)module,其定義代碼如下。typedefstructhw_module_t{uint32_ttag;uint16_tmodule_api_version;#defineversion_majormodule_api_versionuint16_thal_api_version;#defineversion_minorhal_api_versionconstchar*id;constchar*name;constchar*author;structhw_module_methods_t*methods;void*dso;uint32_treserved[32-7];}hw_module_t;2023/3/5武漢科技大學(xué)Page1411.2.2HALmodule分析結(jié)構(gòu)體hw_module_methods_t用于定義操作設(shè)備的方法operations,這里只定義了一個(gè)打開設(shè)備的方法open(),其定義代碼如下。typedefstructhw_module_methods_t{/**Openaspecificdevice*/int(*open)(conststructhw_module_t*module,constchar*id,structhw_device_t**device);}hw_module_methods_t;2023/3/5武漢科技大學(xué)Page1511.2.2HALmodule分析如果要執(zhí)行打開設(shè)備等操作可以使用“module->methods->open(module,LED_HARDWARE_MODULE_ID,(structhw_device_t**)device);”。在這三個(gè)結(jié)構(gòu)體中,hw_module_t最先被使用,然后通過hw_module_t.methods找到hw_module_methods_t.open函數(shù),并調(diào)用該函數(shù)。這個(gè)open函數(shù)相當(dāng)于HAL模塊的入口,主要作用是打開設(shè)備文件、初始化hw_device_t結(jié)構(gòu)體以及一些控制硬件設(shè)備的函數(shù)。2023/3/5武漢科技大學(xué)Page1611.2.2HALmodule分析在編寫HAL模塊時(shí)首先要考慮的是hw_module_t和hw_device_t兩個(gè)結(jié)構(gòu)體。HAL規(guī)范建議不直接使用hw_module_t和hw_device_t,而是重新定義這兩個(gè)結(jié)構(gòu)體,將hw_module_t和hw_device_t分別作為新的結(jié)構(gòu)體的第一個(gè)變量的數(shù)據(jù)類型。對(duì)于C語言來說,當(dāng)父結(jié)構(gòu)體是子結(jié)構(gòu)體的第一個(gè)變量的數(shù)據(jù)類型時(shí),在hw_module_t或者_(dá)hw_device_t作為參數(shù)的地方可以直接傳入子結(jié)構(gòu)體。這要做主要是為了擴(kuò)展的需要。因?yàn)闉榱耸笻AL模塊保持獨(dú)立性,HAL模塊中的方法只能使用hw_device_t和hw_module_t作為參數(shù)類型。而如果不使用hw_device_t和hw_module_t的子結(jié)構(gòu)體,就意味著無法添加自定義的函數(shù)指針,這個(gè)HAL模塊也就無法向外部提供與其交互的接口。2023/3/5武漢科技大學(xué)Page1711.2.2HALmodule分析在hw_get_module函數(shù)中,Android系統(tǒng)首先在系統(tǒng)屬性中查找硬件定義,然后通過該函數(shù)的參數(shù)id和查找到的模塊的路徑(path)加載相應(yīng)硬件HAL大的特定模塊so庫文件。如果在系統(tǒng)屬性中未定義硬件屬性,則使用默認(rèn)硬件HAL對(duì)應(yīng)模塊的so

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論