色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

淺析HarmonyOS驅動加載過程

電子工程師 ? 來源:HarmonyOS開發者 ? 作者:chenfeng,yuanbo ? 2021-05-18 11:55 ? 次閱讀

1

HarmonyOS驅動概述

HarmonyOS驅動框架采用C語言面向對象編程模型構建,通過平臺解耦、內核解耦,來達到兼容不同內核,統一平臺底座的目的,從而幫助開發者實現驅動的“一次開發、多系統部署”。 為了達成這個目標, HarmonyOS驅動框架提供了:1. 操作系統適配層(OSAL,operating system abstraction layer):提供內核操作相關接口進行統一封裝,屏蔽不同系統操作接口。

2.平臺驅動接口:提供Board部分驅動(例如:I2C/SPI/UART總線等平臺資源)支持,同時對Board硬件操作接口進行統一的適配抽象,開發者只需開發新硬件抽象接口,即可獲得新增Board部分驅動支持。

3.驅動模型:面向器件驅動,提供常見的驅動抽象模型,主要達成兩個目的:

1)提供標準化的器件驅動,開發者無需獨立開發,通過配置即可完成驅動的部署。

2)提供驅動模型抽象,屏蔽驅動與不同系統組件間的交互,使得驅動更具備通用性。

為了進一步簡化HarmonyOS驅動開發,HarmonyOS驅動框架支持多種驅動加載方式:

1.支持驅動動態加載和靜態加載,解除驅動代碼和框架間的直接代碼依賴,使得驅動程序可以獨立編譯和部署;

2.支持按需動態加載方式,避免設備驅動全量加載,可有效降低系統資源的占用。 本文主要分析HarmonyOS驅動加載過程,在正式介紹之前,首先了解HarmonyOS驅動架構的組成、工作原理和機制,從而了解驅動加載的細節。

●官網相關介紹:

https://device.harmonyos.com/cn/docs/develop/drive/oem_drive_hdfdev-0000001051715456

2

HarmonyOS驅動架構介紹

2.1 HarmonyOS驅動架構組成

085f72c6-b567-11eb-bf61-12bb97331649.png

圖1 HarmonyOS驅動架構

HarmonyOS驅動架構主要由HDF驅動框架、驅動程序、驅動配置文件和驅動接口四個部分組成。

1)HDF驅動框架提供統一的硬件資源管理,驅動加載管理以及設備節點管理等功能。驅動框架采用的是主從模式設計,由Device Manager和Device Host組成。

Device Manager提供了統一的驅動管理,Device Manager啟動時根據Device Information提供驅動設備信息加載相應的驅動Device Host,并控制Host完成驅動的加載。

Device Host提供驅動運行的環境,同時預置Host Framework與Device Manager進行協同,完成驅動加載和調用。根據業務的需求Device Host可以有多個實例。

說明

◆ Device Host顧名思義就是驅動宿主,提供驅動運行的環境。

◆ 當驅動部署在用戶態時,Device Host可以由獨立的進程進行承載。

◆ 當驅動在部署在內核態時,Device Host僅表示邏輯隔離。

◆ Device Host的劃分原則:Device Host屬于一類設備聚合,如Camera、Audio、Display等。

◆ 驅動程序是部署在一個Device Host還是部署在不同的Device Host,主要考慮驅動程序之間是否存在業務耦合性,如果兩個驅動程序之間存在依賴,可以考慮將這部分驅動程序部署在統一Host。

2)驅動程序實現驅動的具體功能,每個驅動由一個或者多個驅動程序組成,每個驅動程序都對應著一個Driver Entry。Driver Entry主要完成驅動的初始化和驅動接口綁定功能。

3)驅動配置文件.hcs主要由設備信息(Device Information)和設備資源(Device Resource)組成。Device Information完成設備信息的配置,如配置接口發布策略,驅動加載的方式等。Device Resource完成設備資源的配置,如GPIO管腳、寄存器等資源信息的配置。

4)驅動接口HDI(Hardware Driver interface)提供標準化的接口定義和實現,驅動框架提供IO Service和IO Dispatcher機制,使得不同部署形態下驅動接口趨于形式一致。

當驅動部署在RTOS(Real-Time Operating System)輕量化操作系統時,驅動接口和驅動程序之間采用的是Function Call方式調用,因此驅動接口僅提供定義,驅動接口實現由驅動程序提供。

2.2 HDF驅動框架工作原理

0873dc7a-b567-11eb-bf61-12bb97331649.png

圖2 HDF驅動框架工作原理

Device Manager提供了統一的驅動加載管理機制和驅動接口發布機制。當Device Host環境加載完成時,Device Manager根據Device Information信息,請求Host加載相應的驅動程序,Device Host在收到請求時,進行以下操作:

1)根據請求加載設備信息,查找并加載指定路徑下驅動鏡像或從指定段地址(section)查找驅動程序入口;

2)查找驅動設備描述符,匹配對應的設備驅動;

3)當驅動匹配成功時,加載指定驅動程序鏡像;

4)Host Framework在驅動鏡像加載成功后,調用驅動程序(Driver Entry)的綁定接口和初始化接口,實現與驅動程序的服務對象綁定,同時初始化設備驅動程序;

5)當Device Information的配置中的服務策略要求對外暴露驅動接口時,驅動框架就將驅動程序的服務對象添加到對外發布的服務對象列表中,外部客戶端程序就可以通過此列表來查詢并訪問相應的服務接口。

2.3 驅動接口工作機制

08a5212c-b567-11eb-bf61-12bb97331649.png

圖3 驅動接口工作機制

驅動接口主要存在以下幾種實現:

?當驅動以內核組件部署時,客戶端程序訪問驅動程序需要通過system call方式調用,驅動接口通過IO Service請求將消息通過system call方式調用到內核,并將消息分發到IO Dispatcher處理。

?當驅動以用戶態服務形式部署時,客戶端進程訪問驅動進程需要通過IPC方式通信,IO Service完成IPC通信的客戶端消息請求封裝,IO Dispatcher完成驅動服務端消息請求封裝,客戶端消息通過IPC通信到達服務端并分發給IO Dispatcher處理。

為了使客戶端和服務端驅動調用方式基本一致,驅動框架提供IO Service和IO Dispatcher機制屏蔽了調用消息傳遞方式的差異。

驅動接口實現統一采用遠程調用方式,客戶端驅動接口函數將請求序列化成內存數據,通過驅動框架提供的IO Service將消息發送到服務端處理,服務端在收到請求消息時通過IO Dispatcher機制將消息分發給消息處理函數處理,處理函數將反序列化內存數據解析成相應的請求。這樣做的好處是,開發者只需重點關注接口的定義,無需過多關注如何實現不同平臺上接口適配。

3

驅動加載過程分析

HarmonyOS驅動根據部署的不同方式,存在兩種驅動加載方式:?動態加載方式:采用傳統的so(共享庫) 加載方式,驅動程序通過指定Symbol找到驅動函數入口進行加載。?靜態加載方式:采用將驅動程序通過Scatter編譯方式,編譯到指定的Section,再通過訪問指定Section對應的地址,找到驅動函數入口進行加載。 下面結合一個Sample示例代碼,講解驅動加載過程,重點分析靜態加載方式下內核態驅動加載過程。

3.1 實現驅動程序初始化接口

在HDF驅動框架中,HdfDriverEntry對象被用來描述一個驅動實現。

struct HdfDriverEntry { int32_t moduleVersion; const char *moduleName; int32_t (*Bind)(struct HdfDeviceObject *deviceObject); int32_t (*Init)(struct HdfDeviceObject *deviceObject); void (*Release)(struct HdfDeviceObject *deviceObject);};

(左右滑動查看更多)

編寫一個簡單的驅動,首先需要實現驅動程序(Driver Entry)入口中的三個主要接口:?Bind接口:實現驅動接口實例化綁定,如果需要發布驅動接口,會在驅動加載過程中被調用,實例化該接口的驅動服務并和DeviceObject綁定。?Init接口:實現驅動的初始化,返回錯誤將中止驅動加載流程。?Release接口:實現驅動的卸載,在該接口中釋放驅動實例的軟硬件資源。

int SampleDriverBind(struct HdfDeviceObject *deviceObject){ HDF_LOGE(“SampleDriverBind enter!”); static struct IDeviceIoService testService = { .Dispatch = SampleServiceDispatch, .Open = NULL, .Release = NULL, }; deviceObject-》service = &testService; return HDF_SUCCESS;} int SampleDriverInit(struct HdfDeviceObject *deviceObject){ HDF_LOGE(“SampleDriverInit enter”); return HDF_SUCCESS;} void SampleDriverRelease(struct HdfDeviceObject *deviceObject){ HDF_LOGE(“SampleDriverRelease enter”); return;} struct HdfDriverEntry g_sampleDriverEntry = { .moduleVersion = 1, .moduleName = “sample_driver”, .Bind = SampleDriverBind, .Init = SampleDriverInit, .Release = SampleDriverRelease,}; HDF_INIT(g_sampleDriverEntry);

(左右滑動查看更多)

3.2 導出驅動程序入口符號

實現驅動程序初始化后,需要將驅動程序入口通過驅動聲明宏導出,這樣驅動框架才能在啟動時識別到驅動程序的存在,驅動才能被加載:

#define HDF_INIT(module) HDF_DRIVER_INIT(module)

(左右滑動查看更多)

這里將HDF_INIT宏展開:

#define HDF_SECTION __attribute__((section(“.hdf.driver”)))#define HDF_DRIVER_INIT(module) const size_t USED_ATTR module##HdfEntry HDF_SECTION = (size_t)(&(module))

(左右滑動查看更多)

下面是實現原理:

08d92828-b567-11eb-bf61-12bb97331649.png

圖4 Driver Entry內存分布

可以看到HDF_INIT宏是定義了一個“驅動模塊名+HdfEntry”的符號放到“.hdf.driver” 所在section,該符號指向的內存地址即為驅動程序入口結構體的地址。這個特殊的section將用于開機啟動時查找設備驅動。

3.3 添加設備配置

在設備對應的device_info.hcs添加sample驅動的配置:

sample_host :: host { hostName = “sample_host”; sample_device :: device { device0 :: deviceNode { policy = 2; priority = 100; preload = 1; permission = 0664; moduleName = “sample_driver”; serviceName = “sample_service”; } }}

(左右滑動查看更多)

在配置中定義的device將在加載過程中產生一個設備實例,通過moduleName字段指定設備對應的驅動名稱,從而將設備與驅動關聯起來。其中,設備與驅動可以是一對多的關系,即可以實現一個驅動支持多個同類型設備。

3.4 驅動啟動過程

我們添加的驅動是如何被執行的呢?簡單來說,在系統啟動時,驅動框架先啟動,通過解析配置文件獲取到設備列表,通過讀取“.hdf.driver”段讀取到驅動程序(Driver Entry)列表,然后遍歷設備列表與驅動程序列表進行匹配,并加載匹配成功的驅動。

驅動框架有兩大核心管理者:?DeviceManager:負責設備的管理,包括設備加載、卸載和查詢等設備相關功能。?DeviceServiceManager:負責管理設備發布的接口服務,提供接口服務的發布和查詢等功能。

驅動加載主要由DeviceManager主導,首先DeviceManager要解析配置文件中的Host列表,根據Host列表中的信息來實例化對應的Host對象。Host解析配置文件獲取到關聯的設備列表,遍歷設備列表去獲取與之匹配的驅動程序名稱,然后基于驅動程序名稱遍歷前面提到的“.hdf.driver” section獲得驅動程序地址。

下面介紹具體過程。

3.4.1 獲取設備列表

0902f0ae-b567-11eb-bf61-12bb97331649.png

圖5 設備列表結構

配置文本編譯后會變成二進制格式的配置文件,其中設備相關信息被存放在一個用“hdf_manager”標記的device_info配置塊中,host的內容以塊的形式在device_info塊中依次排列,host塊中記錄了host名稱、啟動優先級和設備列表信息。設備信息中的moduleName字段將用于和驅動程序入口中的moduleName進行匹配,從而為設備匹配到正確的驅動程序。

3.4.2 獲取驅動程序列表

091ba69e-b567-11eb-bf61-12bb97331649.png

圖6 驅動程序(DriverEntry)內存布局

HDF驅動框架通過驅動程序入口符號的地址集中存放到一個特殊的section來實現對驅動的索引,這個section的開頭和末尾插入了_hdf_drivers_start、_hdf_drivers_end兩個特殊符號,用于標記這個section的范圍,兩個特殊符號之間的數據即為驅動實現指針。

3.4.3 驅動程序加載流程

09381dce-b567-11eb-bf61-12bb97331649.png

圖7 HDF驅動加載流程

Device Manager遍歷設備列表,當查找到對應驅動實現時,為設備創建Device對象實例,如果設備配置中的policy字段為需要對外發布驅動接口(SERVICE_POLICY_CAPACITY),那么驅動的Bind接口將首先被調用,用于關聯設備和服務實例。然后驅動的Init接口將被調用,用于完成驅動的相關初始化工作。如果驅動被卸載或者因為硬件等原因Init接口返回失敗,Release將被調用,用于釋放驅動申請的各類資源。

4

總結

本次和大家分享了HarmonyOS驅動的主要設計思想,重點分析了內核態驅動加載的過程,關于HarmonyOS驅動其他內容,后續會有更多技術文章向大家持續分享,敬請期待。

作者:chenfeng,yuanbo,華為驅動工程師

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 驅動接口
    +關注

    關注

    0

    文章

    10

    瀏覽量

    2618
  • HarmonyOS
    +關注

    關注

    79

    文章

    1974

    瀏覽量

    30158
  • HDF框架
    +關注

    關注

    0

    文章

    9

    瀏覽量

    2768
  • OpenHarmony
    +關注

    關注

    25

    文章

    3717

    瀏覽量

    16288

原文標題:HarmonyOS驅動加載過程分析

文章出處:【微信號:HarmonyOS_Dev,微信公眾號:HarmonyOS開發者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    HarmonyOS Web頁面加載的原理和優化方法

    在移動互聯網時代,應用的頁面渲染速度對于用戶體驗至關重要。相對于原生頁面,Web頁面的性能存在多方面的技術挑戰。本文以HarmonyOS的ArkWeb組件為基礎,介紹了Web頁面加載中的影響因素以及對應的優化方案。
    的頭像 發表于 12-05 15:14 ?214次閱讀
    <b class='flag-5'>HarmonyOS</b> Web頁面<b class='flag-5'>加載</b>的原理和優化方法

    技術科普 | 芯片設計中的LEF文件淺析

    技術科普 | 芯片設計中的LEF文件淺析
    的頭像 發表于 11-13 01:03 ?241次閱讀
    技術科普 | 芯片設計中的LEF文件<b class='flag-5'>淺析</b>

    龍門式蔡司三坐標測量機無法加載驅動的原因和解決方法

    運行大型龍門機MMZ系列設備時,如果Z軸碰撞保護無法激活,會導致驅動無法正常加載。這里給大家提供以下方法,為您排憂解難。圖片中的箭頭標記綠燈無法點亮,導致驅動無法正常加載。解決方法Z軸
    的頭像 發表于 10-30 14:11 ?358次閱讀
    龍門式蔡司三坐標測量機無法<b class='flag-5'>加載</b><b class='flag-5'>驅動</b>的原因和解決方法

    SoC的數字簽名加解密過程

    SoC的數字簽名驗證是指在系統啟動或固件更新等關鍵時刻,對加載的固件或軟件進行數字簽名的驗證過程。通過驗證數字簽名,系統可以確保所加載的固件或軟件是經過授權和信任的,從而防止惡意代碼的執行和系統啟動
    的頭像 發表于 10-21 14:52 ?229次閱讀

    AWR294x主引導加載程序和輔助引導加載程序

    電子發燒友網站提供《AWR294x主引導加載程序和輔助引導加載程序.pdf》資料免費下載
    發表于 09-06 09:47 ?0次下載
    AWR294x主引導<b class='flag-5'>加載</b>程序和輔助引導<b class='flag-5'>加載</b>程序

    linux驅動程序如何加載進內核

    ,需要了解Linux內核的基本概念和API。以下是一些關鍵概念: 1.1 內核模塊:Linux內核模塊是一種動態加載和卸載的代碼,可以在不重新啟動系統的情況下加載和卸載。驅動程序通常以內核模塊的形式實現。 1.2 設備模型:Li
    的頭像 發表于 08-30 15:02 ?454次閱讀

    labview實現DBC在界面加載配置

    labview實現DBC在界面加載配置
    發表于 08-19 14:27 ?27次下載

    【AWTK使用經驗】加載和釋放外部圖片

    AWTK是基于C語言開發的跨平臺GUI框架?!禔WTK使用經驗》系列文章將介紹開發AWTK過程中一些常見問題與解決方案,例如:如何加載外部資源?如何設計自定義進度條?這些都會在系列文章進行解答。加載
    的頭像 發表于 04-26 08:25 ?471次閱讀
    【AWTK使用經驗】<b class='flag-5'>加載</b>和釋放外部圖片

    HarmonyOS開發案例:【新聞數據加載

    基于ArkTS的聲明式開發范式實現的樣例,主要介紹了數據請求和touch事件的使用。
    的頭像 發表于 04-22 17:22 ?556次閱讀
    <b class='flag-5'>HarmonyOS</b>開發案例:【新聞數據<b class='flag-5'>加載</b>】

    HarmonyOS開發案例:【首選項】

    基于HarmonyOS的首選項能力實現的一個簡單示例。
    的頭像 發表于 04-19 16:20 ?1243次閱讀
    <b class='flag-5'>HarmonyOS</b>開發案例:【首選項】

    STM32F401VC USB枚舉成自定義HID,為什么每臺設備連接到同一臺電腦上都要有一個加載驅動過程?

    我的項目用的是STM32[i]F401VC,USB枚舉成自定義HID.生產過程中每臺設備都要連接電腦下載數據.現在的問題是每臺設備連接到同一臺電腦上都要有一個加載(尋找)驅動過程(約
    發表于 04-01 06:17

    2024款鴻蒙OS 最新HarmonyOS Next_HarmonyOS4.0系列教程分享

    鴻蒙的出現,標志著中國科技的崛起。HarmonyOS就是我們說的華為鴻蒙系統,截止到2023年8月4日已有超過7億臺設備搭載了鴻蒙OS系統。據多家媒體報道,2024年國內有21所985大學都開設
    發表于 02-28 10:29

    通過Ethernet收到Flash驅動后,如何去加載使用這個驅動

    請教各位,通過Ethernet收到Flash 驅動后,如何去加載使用這個驅動?以及如何生成這個驅動?
    發表于 02-05 06:26

    在BF707開發過程中向Flash燒寫一段代碼,然后斷電進行加載,發現并未加載成功如何解決?

    在BF707開發過程中向Flash中燒寫過一段代碼,然后斷電進行加載,發現并未加載成功,當進行如下操作卻失敗】 1.利用CCES仿真器,在debug情況下對JTAG進行Test結果為OK的,但當
    發表于 01-12 06:03

    harmonyos和安卓的區別

    HarmonyOS是由華為開發的一款全場景分布式操作系統,而安卓(Android)則是由谷歌開發的移動操作系統。雖然兩者都是操作系統,但它們在很多方面存在明顯的區別。下面是關于HarmonyOS和安
    的頭像 發表于 01-10 17:55 ?3516次閱讀
    主站蜘蛛池模板: 免费韩伦影院在线观看| 东北老妇xxxxhd| 永久免费毛片| 亚洲免费大全| 亚洲精品国产拍在线观看| 无码人妻丰满熟妇区五十路久久 | 国产 有码 无码 电影| sm主人调教揉花蒂H| 凹凸精品视频分类视频| 边做边爱免费视频| 成人亚洲精品| 刮伦人妇A极一片| 国产精品久久久久久亚洲毛片 | 91popny蜜桃臀| 91精品一区二区综合在线 | 午夜精品久久久久久久爽牛战| 特级毛片AAAAAA| 无码国产欧美日韩精品| 小向美奈子厨房magnet| 亚洲精品国产第一区第二区| 亚洲视频在线观看免费| 一线高清视频在线播放| 91麻豆精品国产一级| avove主播| 福利啪啪吧| 国产三级视频在线| 精品一区二区三区高清免费观看| 久久视频在线视频| poronovideos动物狗猪| 成年人深夜福利| 国产精品视频yy9099| 寂寞夜晚免费观看视频| 美女被男人撕衣舔胸| 日韩经典欧美一区二区三区| 小萝ar视频网站| 中文字幕 亚洲 有码 在线| caoporn 免费视频| 国产精品久久久久久久久99热 | 国产免费内射又粗又爽密桃视频| 国拍自产精品福利区| 免费国产足恋网站|