Android幀緩沖區(Frame Buffer)硬件抽象層(HAL)模塊Gralloc的實現原理分析(2)...

?? 函數load也是實現在文件hardware/libhardware/hardware.c文件中,如下所示:

  1. static?int?load(const?char?*id,??
  2. ????????const?char?*path,??
  3. ????????const?struct?hw_module_t?**pHmi)??
  4. {??
  5. ????int?status;??
  6. ????void?*handle;??
  7. ????struct?hw_module_t?*hmi;??
  8. ??
  9. ????/*?
  10. ?????*?load?the?symbols?resolving?undefined?symbols?before?
  11. ?????*?dlopen?returns.?Since?RTLD_GLOBAL?is?not?or'd?in?with?
  12. ?????*?RTLD_NOW?the?external?symbols?will?not?be?global?
  13. ?????*/??
  14. ????handle?=?dlopen(path,?RTLD_NOW);??
  15. ????if?(handle?==?NULL)?{??
  16. ????????char?const?*err_str?=?dlerror();??
  17. ????????LOGE("load:?module=%s\n%s",?path,?err_str?err_str:"unknown");??
  18. ????????status?=?-EINVAL;??
  19. ????????goto?done;??
  20. ????}??
  21. ??
  22. ????/*?Get?the?address?of?the?struct?hal_module_info.?*/??
  23. ????const?char?*sym?=?HAL_MODULE_INFO_SYM_AS_STR;??
  24. ????hmi?=?(struct?hw_module_t?*)dlsym(handle,?sym);??
  25. ????if?(hmi?==?NULL)?{??
  26. ????????LOGE("load:?couldn't?find?symbol?%s",?sym);??
  27. ????????status?=?-EINVAL;??
  28. ????????goto?done;??
  29. ????}??
  30. ??
  31. ????/*?Check?that?the?id?matches?*/??
  32. ????if?(strcmp(id,?hmi->id)?!=?0)?{??
  33. ????????LOGE("load:?id=%s?!=?hmi->id=%s",?id,?hmi->id);??
  34. ????????status?=?-EINVAL;??
  35. ????????goto?done;??
  36. ????}??
  37. ??
  38. ????hmi->dso?=?handle;??
  39. ??
  40. ????/*?success?*/??
  41. ????status?=?0;??
  42. ??
  43. ????done:??
  44. ????if?(status?!=?0)?{??
  45. ????????hmi?=?NULL;??
  46. ????????if?(handle?!=?NULL)?{??
  47. ????????????dlclose(handle);??
  48. ????????????handle?=?NULL;??
  49. ????????}??
  50. ????}?else?{??
  51. ????????LOGV("loaded?HAL?id=%s?path=%s?hmi=%p?handle=%p",??
  52. ????????????????id,?path,?*pHmi,?handle);??
  53. ????}??
  54. ??
  55. ????*pHmi?=?hmi;??
  56. ??
  57. ????return?status;??
  58. }??
? ? ? ? 在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"??

?? ? ? 將Gralloc模塊加載到內存中來之后,就可以調用函數dlsym來獲得它所導出的符號HMI。由于這個符號指向的是一個hw_module_t結構體,因此,最后函數load就可以強制地將這個符號轉換為一個hw_module_t結構體指針,并且保存在輸出參數pHmi中返回給調用者。調用者獲得了這個hw_module_t結構體指針之后,就可以創建一個gralloc設備或者一個fb設備。

?? ? ? 模塊Gralloc實現在目錄hardware/libhardware/modules/gralloc中,它導出的符號HMI定義在文件hardware/libhardware/modules/gralloc/gralloc.cpp文件中,如下所示:

  1. static?struct?hw_module_methods_t?gralloc_module_methods?=?{??
  2. ????????open:?gralloc_device_open??
  3. };??
  4. ??
  5. struct?private_module_t?HAL_MODULE_INFO_SYM?=?{??
  6. ????base:?{??
  7. ????????common:?{??
  8. ????????????tag:?HARDWARE_MODULE_TAG,??
  9. ????????????version_major:?1,??
  10. ????????????version_minor:?0,??
  11. ????????????id:?GRALLOC_HARDWARE_MODULE_ID,??
  12. ????????????name:?"Graphics?Memory?Allocator?Module",??
  13. ????????????author:?"The?Android?Open?Source?Project",??
  14. ????????????methods:?&gralloc_module_methods??
  15. ????????},??
  16. ????????registerBuffer:?gralloc_register_buffer,??
  17. ????????unregisterBuffer:?gralloc_unregister_buffer,??
  18. ????????lock:?gralloc_lock,??
  19. ????????unlock:?gralloc_unlock,??
  20. ????},??
  21. ????framebuffer:?0,??
  22. ????flags:?0,??
  23. ????numBuffers:?0,??
  24. ????bufferMask:?0,??
  25. ????lock:?PTHREAD_MUTEX_INITIALIZER,??
  26. ????currentBuffer:?0,??
  27. };??

?? ? ??HAL_MODULE_INFO_SYM也是一個宏,它的值是與宏HAL_MODULE_INFO_SYM_AS_STR對應的,它也是定義在文件hardware/libhardware/include/hardware/hardware.h文件中,如下所示:
圖1 private_module_t結構體定義

?? ?結構體private_module_t的第一個成員變量base指向一個gralloc_module_t結構體,而gralloc_module_t結構體的第一個成員變量common又指向了一個hw_module_t結構體,這意味著,指向一個private_module_t結構體的指針同時可以用作一個gralloc_module_t或者hw_module_t結構體提針來使用。事實上,這是使用C語言來實現的一種繼承關系,等價于結構體private_module_t繼承結構體gralloc_module_t,而結構體gralloc_module_t繼承hw_module_t結構體。這樣,我們就可以把在Gralloc模塊中定義的符號HAL_MODULE_INFO_SYM看作是一個hw_module_t結構體。

? ? ? ? hw_module_t結構體有一個重要的成員變量methods,它的類型為hw_module_methods_t,它用來描述一個HAL模塊的操作方法列表。結構體hw_module_methods_t只定義有一個操作方法open,用來打開一個指定的設備。在Gralloc模塊中,用來打開指定設備的函數被指定為gralloc_device_open,通過這個函數就可以打開Gralloc模塊中的gralloc或者fb設備,后面我們再詳細分析。





本文轉自 Luoshengyang 51CTO博客,原文鏈接:http://blog.51cto.com/shyluo/967062,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286905.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286905.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286905.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Win8消費者預覽版下載地址 包含中文下載地址及中文手冊

Win8消費者預覽版下載地址(32位英文版): http://ak.or.esd.microsoft.com/pr/WCPDL/8A9D4FDFF736C5B1DBF956B89D6C8FDFD925DACD2/Windows8-ConsumerPreview-32bit-English-x1794225.esd Win8消費者預覽版下載地址(64位英文版&…

VS2019社區版(Community)試用30天過期的有效解決辦法

VS2019社區版是免費的,前提是你得登陸自己的賬戶,如果一開始安裝時沒有登陸,那么就會只有30天有效期。此時,需要我們登陸微軟賬號,重新驗證即可。 登陸微軟賬號,即可繼續免費試用。

【萬字長文】使用 LSM Tree 思想實現一個 KV 數據庫

目錄設計思路內存表WALSSTable 的結構SSTable 元素和索引的結構SSTable Tree內存中的 SSTable數據查找過程何為 LSM-Treee參考資料整體結構實現過程文件壓縮測試插入測試加載測試查找測試SSTable 結構SSTable 文件結構SSTable Tree 結構和管理 SSTable 文件讀取 SSTable 文件SS…

linux之安裝mysql提示Error: Unable to find a match: mysql-community-server

1 問題 在centos系統下安裝mysql,命令如下 yum -y install mysql-community-server 提示錯誤如下 [root@iZm5e6dk6exl71zbx327zvZ mysql]# yum -y install mysql-community-server MySQL Connectors Community …

記錄部件中GetFieldControlByFieldName(字段值樣式設置)用法

度量快速開發平臺中,記錄部件上,不單是字段名稱可以設置樣式,要填入內容的方框也可以設置樣式。通過獲取記錄部件上某一個字段的輸入控件,在二次開發中不常用。該方法只有一個參數,即要獲取對象的字段,需要…

C/C++/Linux工程師學習資料干貨路線這都有,從入門到實戰!【CSDN寶藏資料圖鑒第二期】

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我,若你是真心學習可以送你書籍,指導你學習,給予你目標方向的學習路線,無套路,博客為證。 前言 CSDN 是全球知名的開發者社區,創建于1999年&#xff…

你要的來了:ArcGIS空間插值分析方法權威解讀

插值問題的提出??? 一、趨勢面 Trend is a global polynomial interpolation that fits a smooth surface defined by a mathematical function (a

Socket解決粘包問題2

在AsynServer中對接收函數增加接收判斷,如果收到客戶端發送的請求信息,則發送10個測試包給發送端,否則繼續接收,修改后的接收代碼如下: private void AsynReceive(){byte[] data new byte[1024];//接收緩存string rec…

C# WebBrowser 取 window.open 新窗口 url的方法

System.Windows.Forms.WebBrowser wb; //WebBrowser 對象wb.NewWindow new CancelEventHandler(wb_NewWindow);wb.DocumentCompleted delegate{ #region 處理window.open新開窗口的問題System.Windows.Forms.HtmlElement html wb.Document.CreateElemen…

linux之rpm

1、rpm Linux rpm 命令用于管理套件 -a  查詢所有套件。-b<完成階段><套件檔>+或-t <完成階段><套件檔>+  設置包裝套件的完成階段,并指定套件檔的文件名稱。-c  只列出組態配置文件,本參數需配合"-l"參數使用。-d  只列出文本文件,…

保姆級的HTML零基礎教程少見吧?這是第一節(1)

作者簡介 作者名&#xff1a;1_bit 簡介&#xff1a;CSDN博客專家&#xff0c;2020年博客之星TOP5&#xff0c;藍橋簽約作者。15-16年曾在網上直播&#xff0c;帶領一批程序小白走上程序員之路。歡迎各位小白加我咨詢我相關信息&#xff0c;迷茫的你會找到答案。 目錄 HTML基…

WPF 通用權限開發框架 (ABP)

前言對于大部分.NET 開發者來說, 都比較熟悉目前流行的ABP框架, 基于開源的ABP框架, 可以自己進行二次開發, 無需重新開發一些基礎功能,例如: 用戶角色管理、權限、組織、多租戶等等。但是對于ABP框架來說, 提供給.NET開發者的可選項非常少, 目前也僅僅是提供了基于Web的解決方…

甘肅省事業單位公考招聘考試權威復習資料---GIS專業綜合復習題(一)

1. 數字城市 以計算機技術、多媒體技術和大規模存儲技術為基礎,以寬帶網絡為紐帶,運用遙感、全球定位系統、地理信息系統、遙測、仿真-虛擬等技術,對城市進行多分辨率、多尺度、多時空和多種類的三維描述,即利用信息技術手段把城市的過去、現狀和未來的全部內容在網絡上進…

MongoDB 3.0 新增特性一覽

引言 在歷經版本號修改&#xff08;2.8版本直接跳到3.0版本&#xff09;和11個rc版本之后&#xff0c;MongoDB3.0于2015年3月3日正式發布。可以毫不夸張的說&#xff0c;該版本的新增特性標志著MongoDB這款典型的NoSQL數據庫已經進入了一個全新的發展階段。本文以下內容會逐個盤…

[華清遠見]FPGA公益培訓

本套視頻教程為華清遠見 網絡公益培訓活動&#xff0c;主講人&#xff1a;姚遠老師&#xff0c;華清遠見高級講師。 ---------------------------------------------------------------------------------------- “紅色颶風FPGA普及行動” 課程內容&#xff1a; 第一講、FPGA設…

單一職責原則--設計模式系列

定義 一個類只負責一項職責 職責擴散 什么叫職責擴散&#xff0c;就是職責再進行細化&#xff0c;就拿公司來說&#xff0c;好比客戶的需求&#xff0c;需求是不斷變化的&#xff0c;而且存在極大的不確定性&#xff0c;說不定哪天上司找到你要重新細化某個需求 所以最好在職責…

淘寶網的技術發展史(一)——個人網站時代

《天下網商經理人》十月刊開始將連載系列文章《淘寶網的技術發展史》&#xff0c;為讀者描述淘寶網在整個發展過程中&#xff0c;所有的主動和被動的技術變革的前因后果。 文/淘寶技術大學培訓專家 子柳 前言 11月11日&#xff0c;這個棍子最多的日子被網民自我調侃變成了一個…

linux之徹底卸載mysql

1 問題 在centos系統下徹底卸載mysql 2 操作方式 1)、查看mysql的信息 rpm -qa | grep -i mysql mysql57-community-release-el7-10.noarch mysql-errmsg-8.0.17-3.module_el8.0.0+181+899d6349.x86_64 mysql-8.0.17-3.module_el8.0.0+181+899d6349.x86_64 mysql-server-8.…

使用 Vscode 編寫 HTML 文檔竟然可以自動寫代碼(2)

作者簡介 作者名&#xff1a;1_bit 簡介&#xff1a;CSDN博客專家&#xff0c;2020年博客之星TOP5&#xff0c;藍橋簽約作者。15-16年曾在網上直播&#xff0c;帶領一批程序小白走上程序員之路。歡迎各位小白加我咨詢我相關信息&#xff0c;迷茫的你會找到答案。 目錄 HTML基…

甘肅省事業單位公考招聘考試權威復習資料---GIS專業全真模擬題(一)

一、單選 1. 以下那個可以從像元級別、特征級別進行&#xff08; &#xff09;。 A.增強 B.銳化 C.重采樣 D.裁剪 2. 1:10000比例尺地形圖的格網大小是&#xff08; &#xff09;。 A.30m B.100m C.10m D.5m 3. 電子地圖中加載矢量數據屬于&#xff08; &…