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

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

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

3天內不再提示

OpenHarmony系統HDF驅動框架概述

HarmonyOS開發者 ? 來源:HarmonyOS開發者 ? 作者:HarmonyOS ? 2021-09-03 09:29 ? 次閱讀

OpenHarmony系統HDF驅動框架概述

OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)系統 HDF 驅動框架采用 C 語言面向對象編程模型構建,通過平臺解耦、內核解耦,來達到兼容不同內核,統一平臺底座的目的,從而幫助開發者實現驅動一次開發,多系統部署的效果。

為了達成這個目標, OpenHarmony 系統 HDF 驅動框架提供了:

操作系統適配層(OSAL,Operating System Abstraction Layer):對內核操作相關接口進行統一封裝,屏蔽不同系統操作接口。

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

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

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

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

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

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

支持按需動態加載方式,避免設備驅動全量加載,可有效降低系統資源的占用。

本文主要分析 OpenHarmony 系統驅動加載過程,在正式介紹之前,首先了解 OpenHarmony 系統驅動架構的組成、工作原理和機制,從而了解驅動加載的細節。

OpenHarmony系統

HDF驅動框架介紹

OpenHarmony 系統 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 機制,使得不同部署形態下驅動接口趨于形式一致。驅動接口主要存在以下幾種實現:

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

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

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

Device Manager 提供了統一的驅動加載管理機制和驅動接口發布機制。

當 Device Host 環境加載完成時,Device Manager 根據 Device Information 信息,請求 Host 加載相應的驅動程序,Device Host 在收到請求時,進行以下操作:

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

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

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

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

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

對于驅動接口實現而言:

當驅動部署在內核態時,驅動接口部署在用戶態,驅動實現在內核態,驅動接口和驅動實現之間通過 syscall 調用方式實現調用交互。

當驅動部署在用戶態時,驅動接口和驅動實現分別部署在兩個進程中。驅動接口和驅動實現之間通過 IPC 調用方式實現調用交互。

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

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

驅動加載過程分析

OpenHarmony 系統驅動根據驅動程序部署的不同方式,存在兩種驅動加載方式:

動態加載方式:采用傳統的 so(共享庫)加載方式,驅動程序通過指定 Symbol 方式找到驅動函數入口進行加載。

靜態加載方式:采用將驅動程序通過 Scatter 編譯到指定的 Section,再通過訪問指定 Section 對應的地址,找到驅動函數入口進行加載。

下面結合一個 Sample 示例代碼,講解驅動加載過程,重點分析靜態加載方式下內核態驅動加載過程。 實現驅動程序初始化接口在 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);

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

#define HDF_INIT(module) HDF_DRIVER_INIT(module)

(左右滑動,查看更多)

這里將 HDF_INIT 宏展開:

#define HDF_SECTION __attribute__((section(".hdf.driver")))#define HDF_DRIVER_INIT(module) constsize_tUSED_ATTRmodule##HdfEntryHDF_SECTION=(size_t)(&(module))

(左右滑動,查看更多)

下面是其實現原理:

圖4 Driver Entry內存分布

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

添加設備配置

在設備對應的 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 字段指定設備對應的驅動名稱,從而將設備與驅動關聯起來,其中,設備與驅動可以是一對多的關系,即可以實現一個驅動支持多個同類型設備。 驅動啟動過程我們添加的驅動是如何被執行的呢?簡單來說,在系統啟動時,驅動框架先啟動,通過解析配置文件獲取到設備列表,通過讀取".hdf.drivers"段讀取到驅動程序(Driver Entry)列表,然后遍歷設備列表與驅動程序列表進行匹配,并加載匹配成功的驅動。驅動框架有兩大核心管理者:

DeviceManager 負責設備的管理,包括設備加載、卸載和查詢等設備相關功能。

DeviceServiceManager 負責管理設備發布的接口服務,提供接口服務的發布、查詢等功能。

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

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

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

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

總結

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

責任編輯:haq

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

    關注

    12

    文章

    1840

    瀏覽量

    85307
  • 框架
    +關注

    關注

    0

    文章

    403

    瀏覽量

    17500
  • HarmonyOS
    +關注

    關注

    79

    文章

    1977

    瀏覽量

    30227
  • OpenHarmony
    +關注

    關注

    25

    文章

    3723

    瀏覽量

    16337
收藏 人收藏

    評論

    相關推薦

    HarmonyOS NEXT應用元服務開發Intents Kit(意圖框架服務)本地搜索方案概述

    一、概述 本地搜索是在HarmonyOS歸一化搜索特性,開發者將應用/元服務內的功能和內容通過意圖框架共享到HarmonyOS,即可實現“一步搜索,內容直達”。 二、典型場景 以“音樂垂域”的“歌曲
    發表于 11-06 10:59

    基于ArkTS語言的OpenHarmony APP應用開發:HelloOpenharmony

    1、程序簡介該程序是基于OpenHarmony標準系統編寫的UI應用類:HelloOpenHarmony。本案例是基于API9接口開發。本案例已在OpenHarmony凌蒙派-RK35
    的頭像 發表于 09-15 08:09 ?402次閱讀
    基于ArkTS語言的<b class='flag-5'>OpenHarmony</b> APP應用開發:Hello<b class='flag-5'>Openharmony</b>

    Openharmony軟件評估指南-米爾瑞芯微RK3568開發板

    Openharmony軟件評估指南用于介紹在米爾的開發板上運行Openharmony系統下的核心資源與外設資源的測試步驟與評估方法。本文可作為前期評估指南使用,也可以作為通用系統開發的
    發表于 09-06 20:06

    【迅為RK3568開發板】OpenHarmony學習開發系列教程(第1期 北向基礎篇一)

    P1P0_先導課1:30 P2P1_OpenHarmony系統概述8:12 P3P2_OpenHarmony功能框架5:38 P4P3_
    發表于 08-16 15:27

    鴻蒙OpenHarmony南向/北向快速開發教程-迅為RK3568開發板

    4.1學習之旅了嗎?快來加入我們,一起探索鴻蒙4.1系統的無限魅力吧! 【北京迅為】OpenHarmony學習開發系列教程(第1期 北向基礎篇一) P0_先導課 P1_OpenHarmony
    發表于 07-23 10:44

    OpenHarmony之開機優化

    OpenHarmony已經支持了Bootchart工具,我們可以直接使用Bootchart工具,Bootchart工具介紹如下: 概述 Bootchart是一個用于系統啟動過程性能分析的開源軟件工具
    發表于 07-01 16:39

    OpenHarmony 成功亮相國際學術會議 ASPLOS 2024

    OpenHarmony的分布式特性、并發驗證框架及可信執行環境,并與來自全球各地的專家學者深入探討了其在移動操作系統、分布式系統系統架構設
    的頭像 發表于 05-16 09:28 ?444次閱讀
    <b class='flag-5'>OpenHarmony</b> 成功亮相國際學術會議 ASPLOS 2024

    鴻蒙開發:【OpenHarmony 4.0 Release指導】

    OpenHarmony 4.0版本如期而至,開發套件同步升級到API 10。相比3.2 Release版本,新增4000多個API,應用開發能力更加豐富;HDF新增200多個HDI接口,硬件適配更加便捷;我們持續優化圖形框架和方
    的頭像 發表于 05-14 09:59 ?1485次閱讀
    鴻蒙開發:【<b class='flag-5'>OpenHarmony</b> 4.0 Release指導】

    鴻蒙OpenHarmony【快速入門概述

    OpenHarmony是一款面向全場景的開源分布式操作系統,采用組件化設計,支持在128KiB到xGiB RAM資源的設備上運行系統組件,設備開發者可基于目標硬件能力自由選擇系統組件進
    的頭像 發表于 04-19 15:14 ?458次閱讀
    鴻蒙<b class='flag-5'>OpenHarmony</b>【快速入門<b class='flag-5'>概述</b>】

    鴻蒙開發實戰:【Hdf Framework】

    該倉主要存放OpenHarmony驅動系統核心源碼信息(包括驅動框架、配置管理、配置解析、驅動
    的頭像 發表于 03-21 20:29 ?523次閱讀
    鴻蒙開發實戰:【<b class='flag-5'>Hdf</b> Framework】

    【六】Purple Pi OH開發板帶你7天入門OpenHarmony

    原子開源基金會(OpenAtomFoundation)孵化及運營的開源項目,目標是面向全場景、全連接、全智能時代、基于開源的方式,搭建一個智能終端設備操作系統框架
    的頭像 發表于 03-14 08:31 ?553次閱讀
    【六】Purple Pi OH開發板帶你7天入門<b class='flag-5'>OpenHarmony</b>!

    介紹一種OpenAtom OpenHarmony輕量系統適配方案

    本文在不改變原有系統基礎框架的基礎上, 介紹了一種OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)輕量系統適配
    的頭像 發表于 03-05 09:24 ?1191次閱讀
    介紹一種OpenAtom <b class='flag-5'>OpenHarmony</b>輕量<b class='flag-5'>系統</b>適配方案

    OpenHarmony4.0源碼解析之媒體框架

    及 audio-source 插件調用音頻框架的播放及采集功能來實現音頻的播放與錄制;通過 surface-sink 調用圖形框架,video-decoder 調用解碼驅動
    的頭像 發表于 02-26 22:05 ?953次閱讀
    <b class='flag-5'>OpenHarmony</b>4.0源碼解析之媒體<b class='flag-5'>框架</b>

    OpenHarmony 之 NAPI 框架介紹

    環境中的 JS 變量與方法。 OpenHarmony 中的 NAPI OpenAtom OpenHarmony(以下簡稱 “OpenHarmony”)應用層基于 javascript 語言開發,而
    的頭像 發表于 02-01 17:34 ?710次閱讀
    <b class='flag-5'>OpenHarmony</b> 之 NAPI <b class='flag-5'>框架</b>介紹

    OpenHarmony社區運營報告(2023年12月)

    17.5 萬行(未包含 Flutter)。 ? 九聯開鴻:貢獻芯片內核驅動HDF 驅動系統、應用樣例等領域特性,新增 13 萬行。 ? 潤開鴻:貢獻芯片開發板、原生應用、ArkU
    發表于 01-10 15:44
    主站蜘蛛池模板: 男人的天堂MV在线视频免费观看| 国产成人综合视频| yellow在线观看免费观看大全| 久久99r66热这里有精品| 亚洲a视频在线| 国产三级在线观看免费| 视频一区精品自拍亚洲| 高清国产激情视频在线观看| 色橹| 国产高清视频青青青在线| 色偷偷男人天堂| 国产电影三级午夜a影院| 视频一区视频二区ae86| 国产成人免费观看| 午夜福利院电影| 黑丝美女被人操| 印度12 13free| 伦理片qvod| tobu中国日本高清| 日本黄色网站在线观看| 动漫美女被到爽了流| 脱女学小内内摸出水网站免费| 国产偷国产偷亚州清高| 亚洲中文字幕欧美自拍一区| 久久免费精彩视频| 99热热在线精品久久| 人妻精品久久无码专区| 国产成人h在线视频| 亚洲精品AV无码永久无码| 久久久久久久99精品免费观看| 69日本人xxxx16—18| 内射白嫩少妇超碰| 国产成人精品123区免费视频| 午夜色情影院色a国产| 极品 女神校花 露脸91| 2019一級特黃色毛片免費看| 欧美亚洲日韩欧洲不卡| 国产乱码卡二卡三卡4W| 一品探花论坛| 情欲.美女高潮| 国色精品VA在线观看免费视频|