小编分享HarmonyOS工具链

HDF(Hardware Driver Foundation)驱动框架,为驱动开发者提供驱动框架能力,包括驱动加载、驱动服务管理和驱动消息机制。旨在构建统一的驱动架构平台,为驱动开发者提供更精准、更高效的开发环境,力求做到一次开发,多系统部署。

HarmonyOS工具链 HarmonyOS驱动加载过程分析

一、HarmonyOS驱动概述

HarmonyOS驱动框架采用C语言面向对象编程模型构建,通过平台解耦、内核解耦,来达到兼容不同内核,统一平台底座的目的,从而帮助开发者实现驱动的“一次开发,多系统部署”。

为了达成这个目标, HarmonyOS驱动框架提供了:

1、操作系统适配层(OSAL,operating system abstraction layer):提供内核操作相关接口进行统一封装,屏蔽不同系统操作接口。

2、平台驱动接口:提供Board部分驱动(例如:I2C/SPI/UART总线等平台资源)支持,同时对Board硬件操作接口进行统一的适配抽象,开发者只需开发新硬件抽象接口,即可获得新增Board部分驱动支持。

3、驱动模型:面向器件驱动,提供常见的驱动抽象模型,主要达成两个目的:

● 提供标准化的器件驱动,开发者无需独立开发,通过配置即可完成驱动的部署。

● 提供驱动模型抽象,屏蔽驱动与不同系统组件间的交互,使得驱动更具备通用性。

为了进一步简化HarmonyOS驱动开发,HarmonyOS驱动框架支持多种驱动加载方式:

● 支持驱动动态加载和静态加载,解除驱动代码和框架间的直接代码依赖,使得驱动程序可以独立编译和部署;

● 支持按需动态加载方式,避免设备驱动全量加载,可有效降低系统资源的占用。

本文主要分析HarmonyOS驱动加载过程,在正式介绍之前,首先了解HarmonyOS驱动架构的组成、工作原理和机制,从而了解驱动加载的细节。

官网相关介绍:https://device.harmonyos.com/cn/docs/develop/drive/oem_drive_hdfdev-0000001051715456

二、HarmonyOS驱动架构介绍

2.1 HarmonyOS驱动架构组成

HarmonyOS工具链 HarmonyOS驱动加载过程分析

图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驱动框架工作原理

HarmonyOS工具链 HarmonyOS驱动加载过程分析

图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 驱动接口工作机制

HarmonyOS工具链 HarmonyOS驱动加载过程分析

图3 驱动接口工作机制

驱动接口主要存在以下几种实现:

● 当驱动以内核组件部署时,客户端程序访问驱动程序需要通过system call方式调用,驱动接口通过IO Service请求将消息通过system call方式调用到内核,并将消息分发到IO Dispatcher处理。

● 当驱动以用户态服务形式部署时,客户端进程访问驱动进程需要通过IPC方式通信,IO Service完成IPC通信的客户端消息请求封装,IO Dispacher完成驱动服务端消息请求封装,客户端消息通过IPC通信到达服务端并分发给IO Dispacher处理。

为了使客户端和服务端驱动调用方式基本一致,驱动框架提供IO Service和IO Dispatcher机制屏蔽了调用消息传递方式的差异。

驱动接口实现统一采用远程调用方式,客户端驱动接口函数将请求序列化成内存数据,通过驱动框架提供的IO Service将消息发送到服务端处理,服务端在收到请求消息时通过IO Dispatcher机制将消息分发给消息处理函数处理,处理函数将反序列化内存数据解析成相应的请求。这样的做到好处是,开发者只需重点关注接口的定义,无需过多的关注如何实现不同平台上接口适配。

三、驱动加载过程分析

HarmonyOS驱动根据部署的不同方式,存在两种驱动加载方式:

● 动态加载方式:采用传统的so(共享库)加载方式,驱动程序通过指定Symbol找到驱动函数入口进行加载。

● 静态加载方式:采用将驱动程序通过Scatter编译方式,编译到指定的Section,再通过访问指定Section对应的地址,找到驱动函数入口进行加载。

下面结合一个Sample示例代码,讲解驱动加载过程,重点分析静态加载方式下内核态驱动加载过程。

3.1 实现驱动程序初始化接口

HarmonyOS工具链 HarmonyOS驱动加载过程分析

在HDF驱动框架中,HdfDriverEntry对象被用来描述一个驱动实现。

编写一个简单的驱动,首先需要实现驱动程序 (Driver Entry)入口中的三个主要接口:

■ Bind接口:

实现驱动接口实例化绑定,如果需要发布驱动接口,会在驱动加载过程中被调用,实例化该接口的驱动服务并和DeviceObject绑定。

■ Init接口:

实现驱动的初始化,返回错误将中止驱动加载流程。

■ Release接口:

HarmonyOS工具链 HarmonyOS驱动加载过程分析

实现驱动的卸载,在该接口中释放驱动实例的软硬件资源。

3.2 导出驱动程序入口符号

实现驱动程序初始化后,需要将驱动程序入口通过驱动声明宏导出,这样驱动框架才能在启动时识别到驱动程序的存在,驱动才能被加载:

HarmonyOS工具链 HarmonyOS驱动加载过程分析

下面是实现原理:

HarmonyOS工具链 HarmonyOS驱动加载过程分析

图4 Driver Entry内存分布

可以看到HDF_INIT宏是定义了一个“驱动模块名+HdfEntry”的符号放到“.hdf.driver” 所在section,该符号指向的内存地址即为驱动程序入口结构体的地址。这个特殊的section将用于开机启动时查找设备驱动。

3.3 添加设备配置

在设备对应的device_info.hcs添加sample驱动的配置:

HarmonyOS工具链 HarmonyOS驱动加载过程分析

在配置中定义的device将在加载过程中产生一个设备实例,通过moduleName字段指定设备对应的驱动名称,从而将设备与驱动关联起来。其中,设备与驱动可以是一对多的关系,即可以实现一个驱动支持多个同类型设备。

3.4 驱动启动过程

我们添加的驱动是如何被执行的呢?简单来说,在系统启动时,驱动框架先启动,通过解析配置文件获取到设备列表,通过读取“.hdf.driver”段读取到驱动程序(Driver Entry)列表,然后遍历设备列表与驱动程序列表进行匹配,并加载匹配成功的驱动。

驱动框架有两大核心管理者:

● DeviceManager:负责设备的管理,包括设备加载、卸载和查询等设备相关功能。

● DeviceServiceManager:负责管理设备发布的接口服务,提供接口服务的发布和查询等功能。

驱动加载主要由DeviceManager主导,首先DeviceManager要解析配置文件中的Host列表,根据Host列表中的信息来实例化对应的Host对象。Host解析配置文件获取到关联的设备列表,遍历设备列表去获取与之匹配的驱动程序名称,然后基于驱动程序名称遍历前面提到的“.hdf.driver” section获得驱动程序地址。

下面介绍具体过程。

3.4.1 获取设备列表

HarmonyOS工具链 HarmonyOS驱动加载过程分析

图5 设备列表结构

配置文本编译后会变成二进制格式的配置文件,其中设备相关信息被存放在一个用“hdf_manager”标记的device_info配置块中,host的内容以块的形式在device_info块中依次排列,host块中记录了host名称、启动优先级和设备列表信息。设备信息中的moduleName字段将用于和驱动程序入口中的moduleName进行匹配,从而为设备匹配到正确的驱动程序。

3.4.2 获取驱动程序列表

HarmonyOS工具链 HarmonyOS驱动加载过程分析

图6 驱动程序(DriverEntry)内存布局

HDF驱动框架通过驱动程序入口符号的地址集中存放到一个特殊的section来实现对驱动的索引,这个section的开头和末尾插入了_hdf_drivers_start、_hdf_drivers_end两个特殊符号,用于标记这个section的范围,两个特殊符号之间的数据即为驱动实现指针。

3.4.3 驱动程序加载流程

HarmonyOS工具链 HarmonyOS驱动加载过程分析

图7 HDF驱动加载流程

Device Manager遍历设备列表,当查找到对应驱动实现时,为设备创建Device对象实例,如果设备配置中的policy字段为需要对外发布驱动接口(SERVICE_POLICY_CAPACITY),那么驱动的Bind接口将首先被调用,用于关联设备和服务实例。然后驱动的Init接口将被调用,用于完成驱动的相关初始化工作。如果驱动被卸载或者因为硬件等原因Init接口返回失败,Release将被调用,用于释放驱动申请的各类资源。

四、总结

本次和大家分享了HarmonyOS驱动的主要设计思想,重点分析了内核态驱动加载的过程,关于HarmonyOS驱动其他内容,后续会有更多技术文章向大家持续分享,敬请期待。

本文来自网络投稿,来自作者春天。不代表酷牛教程立场,如若转载,请注明出处:https://www.xukn.com/488899.html

(0)
春天春天
上一篇 2023-07-14 22:32
下一篇 2023-07-14 22:33

相关推荐

  • 我来分享画图工具怎么取色

    在电脑系统中,都自带了一款画图工具,画图工具的功能还是蛮强大的,可以帮助我们做一些简单的图片处理工作。有用户在使用画图工具进行图片处理的时候,不知道该怎么取色。下面一起来看看画图工...

    2023-06-18 PC教程
    0250
  • 教你360浏览器如何管理扩展工具

    360浏览器如何管理扩展工具?很多时候我们都会用到浏览器的扩展工具,可以启动和停用一些浏览辅助工具,下面就给大家分享360浏览器如何管理扩展工具的具体步骤。 1、首先我们运行360...

    2023-06-24
    0220
  • 小编分享怎么用windows画图工具绘制心形

    怎么用windows画图工具绘制心形?windows自带的画图工具是一款小巧简单的画图软件。想要用windows画图工具绘制一个心形图形,该怎么绘制?本篇主要介绍用用windows...

    2023-06-24 PC教程
    0270
  • 教你KMS激活工具安全吗

    为何通过KMS激活的系统成了盗版?KMS激活工具不安全?为何同样是Windows系统还存在盗版之说?微软上任CEO鲍尔默曾痛批中国电脑安装的Windows中,90成都是盗版,他们是...

    2023-06-18 PC教程
    0180
  • 小编分享word中找到工具具体操作方法。

    很多word的新用户,不了解其中的工具在什么位置?在此文章内就打来了word中找到工具的具体操作方法,感兴趣的快去下文看看吧! 首先找到右上方的箭头图标,点击后就能将隐藏的工具栏打...

    2023-06-07
    0220
  • 我来分享Win10系统中directx工具如何使用

    我们在使用Win10系统时,难免会遇到一些无法正常启动的情况,可以选择使用directx修复工具来解决,还可以根据系统不同,自动调节设置,有些小伙伴不知道Win10系统中direc...

    2023-07-19
    0160
  • sai绘图软件魔棒工具使用教程分享。

    最近很多新手朋友表示自己才接触sai绘图软件,还不会使用该软件里的魔棒工具,那么话说sai绘图软件魔棒工具如何使用呢?这里小编给大家分享sai绘图软件魔棒工具使用教程,一起来看看吧...

    2023-08-08 其他教程
    0180
  • 教你WPS画图工具在哪里。

    WPS(Word Processing System),是金山公司推出的一款国内办公软件。特点体积小,而且功能不比微软的Microsoft Office差,基本都是差不多的!但是,...

    2023-06-14
    0180
  • 我来分享小米系统广告工具开启还是关闭。

    小米系统广告工具开启还是关闭?小米手机系统推出的广告让不少网友们感到十分的苦恼,那么接下来乖乖小编就为大家带来小米系统广告工具介绍的相关内容,希望能够帮到大家,感兴趣的小伙伴不妨来...

    2023-08-13
    0170
  • 经验分享iOS 11.3.1宣告越狱工具现已爆出,ios 11.4越狱。

    苹果正式发布了iOS 12开发者预览版及Mac OS Mojave等一系列系统新版本,这也意味着iOS 11时代将进入倒计时。不过就在此时,国外黑客忽然放出iOS 11.3.1的越...

    2023-07-30
    0230
  • 小编分享如何利用PS透视裁剪工具矫正图片

    如何利用PS透视裁剪工具矫正图片?很多小伙伴在网上找到一些自己喜欢的图片,却发现其中角度外泄,该怎么办呢?下面,小编就为大家介绍下利用PS透视裁剪工具矫正图片方法。 打开Photo...

    2023-06-24
    0140
  • 小编分享Win10自带的清理工具怎么使用

    我们在Windows系统里清理垃圾一般都会选择使用第三方清理工具来清理,但是大家知道吗?Win10系统有自己的系统清理工具,完全不需要使用第三方工具帮助用户清理软件了。下面就让小编...

    2023-07-17 PC教程
    0160
  • 小编教你Windows7系统画图工具怎么打开。

    在我们使用的Windows7系统中,有一个画图工具,经过微软的完善,该工具已经变得越来越强大了。如果说只需要进行简单的图片编辑,那么这款工具是完全可以胜任的。下面将给大家介绍怎么打...

    2023-06-16 PC教程
    0230
  • 我来分享Win系统自带的网络诊断工具怎么用

    Win系统自带的网络诊断工具怎么用?将电脑联网,有时网络适配器会出现问题、从而无法正常上网,此时我们可以利用Windows系统自带的网络诊断工具进行诊断修复。下面,小编就为大家介绍...

    2023-06-27
    0140
  • 我来教你如何用PS内容识别工具来修复图片

    如何用PS内容识别工具来修复图片?进行图片处理时发现图上有小的瑕疵,我们可以借助PS内容识别工具来修复。下面,小编就为大家介绍下用PS内容识别工具来修复图片的方法。 打开Photo...

    2023-06-27
    0130

发表回复

登录后才能评论