HDF(硬件驱动程序基础)驱动程序框架为驱动器开发人员提供驱动程序框架功能,包括驱动器加载,驱动服务管理和驱动程序消息传递机制。它旨在构建一个统一的驱动器架构平台,为驾驶开发人员提供更准确,更高效的开发环境,并努力实现开发和多系统部署。
首先,Harmonyos Drive概述
HarmonyOS驱动程序框架采用C语言面向对象编程模型构建。内核解耦,内核解耦,达到与不同内核的兼容性,统一平台基础的目的,从而帮助开发人员实现“一度发展,多系统部署”。
为了实现这一目标,提供了HarmonyOS驱动程序框架:
1. osal,osal,操作系统抽象层:为统一包提供内核操作相关接口,屏蔽不同的系统操作接口。
2,平台驱动程序界面:提供板段驱动程序(例如,平台资源如I2C / SPI / UART总线),并统一板硬件操作界面,开发人员只需要开发新的硬件抽象接口,获取新的板份部分驱动支持。
3,驱动型号:方向驱动器,提供常见的驱动器抽象模型,主要达到了两个目的:
●提供标准化的设备驱动程序,开发人员不需要独立开发,通过配置完成驱动程序部署。
●提供驾驶模型抽象,屏蔽不同系统组件之间的驾驶和交互,使驱动器更加多功能性。
为了进一步简化HarmonyOS驱动开发,HarmonyOS驱动程序框支持多个驱动程序加载方法:
●支持驱动器动态加载和静态加载,减轻驱动程序代码和框架之间的直接代码依赖性,使驱动程序可以独立编译和部署;
●支持需求动态加载方法,避免了设备驱动程序的全部负载,有效地减少了系统资源的占用。
本文主要分析Harmonyos驾驶员装载过程。在正式介绍之前,首先了解HarmonyOS驱动架构的组成,工作原理和机制,从而了解驱动负荷的细节。
官方网站相关介绍:https://device.harmonyos.com/cn/docs/develop/drive/oem_drive_hdfdev-0000001051715456
二,Harmonyos驱动架构介绍
2.1 Handonyos驱动架构构成
图1 Harmonyos驱动架构
HarmonyOS驱动程序架构主要由HDF驱动程序框架,驱动程序,驱动器配置文件和驱动程序接口的四个部分组成。
1)HDF驱动程序框架提供统一的硬件资源管理,驱动器加载管理和设备节点管理。
驱动器框架由主从模式设计,由设备管理器和设备主机组成。
设备管理器提供统一的驱动程序管理。启动设备管理器时,根据设备信息加载驱动设备主机,并控制主机的加载以完成驱动程序。
设备主机提供驱动运行环境,而预设主机框架正在使用设备管理器协作,完成驱动程序加载和调用。需求相关的要求设备主机可以具有多个实例。
描述:
设备主机作为名称是驱动主机并提供驱动驱动的环境。
当在用户状态下部署驱动器时,设备主机可以由独立的过程携带。
当驱动器处于部署时,设备主机表示逻辑隔离。
设备主机的划分:设备主机是一类设备,如相机,音频,显示等。
驱动程序部署在设备主机中或在不同的设备主机中部署,主要考虑在驱动程序之间是否存在服务耦合,如果两个驱动程序之间存在依赖性,请考虑在统一主机中部署此部分驱动程序。
2)驱动程序实现驱动器的特定功能,每个函数由一个或多个驱动器组成,每个驱动程序对应于驱动程序条目。驱动程序条目主要完成驱动程序的初始化和驱动器接口绑定功能。
3)驱动型材。 HCS主要由设备信息和设备资源(设备资源)组成。
设备信息完成设备信息的配置,例如配置接口发布策略,驱动负载等。设备资源完成设备资源的配置,例如GPIO引脚的资源信息的配置,例如GPIO引脚。
4)驱动器接口HDI(硬件驱动程序接口)提供标准化的接口定义和实现,驱动程序框架提供IO服务和IO调度程序机制,以便驱动程序接口在不同的部署表单中是一致的。
当Drive部署在RTOS(实时操作系统)中轻量级时,驱动接口和驱动程序称为函数呼叫模式,因此驱动程序接口仅提供定义,驱动器接口由驱动程序实现。
2.2 HDF驱动程序框架工作原则
图2 HDF驾驶框架工作原理
设备管理器提供统一的驱动程序加载管理机制和驱动程序接口发布机制。
当加载设备主机环境时,设备管理器请求主机根据设备信息信息加载相应的驱动程序,并且设备主机在接收请求时执行以下操作:
1)根据请求加载设备信息来加载设备信息,并加载指定路径的镜像或从指定的段地址找到驱动程序条目(部分);
2)找到驱动器件描述符并匹配相应的设备驱动程序;
3)当驱动器匹配成功时,加载指定的驱动程序镜像;
4)主机框架驱动镜像加载后,调用驱动器(驱动程序条目)绑定界面和初始化接口,实现驱动程序的服务对象,同时初始化设备驱动程序;
5)当设备信息配置中的服务策略需要外部曝光到驱动器接口时,驱动程序框架将驱动程序的服务对象添加到外部已发布的服务对象列表中,外部客户端程序可以查询和访问相应的列表。服务界面。
2.3驱动接口工作机制
图3驱动接口工作机制
驱动程序接口主要具有以下实现:
●当驱动程序由内核组件部署驱动时,需要通过系统调用调用客户端程序访问驱动程序,并且通过IO服务将驱动程序接口调用到内核,并将消息分发给IO Dispatcher加工。
●当驱动程序部署在用户服务中时,客户端进程访问驱动程序进程需要通过IPC进行通信。 IO服务完成IPC通信客户端消息请求包,IO Dismacher完成了驱动程序消息请求包,通过IPC通信到达服务器并分发给IO Dixacher处理。
为了使客户端和服务器驱动器呼叫基本一致,驱动程序框架提供IO服务和IO调度程序机制来阻止调用消息传递的差异。
均匀采用驱动程序接口实现,客户端驱动程序接口功能将请求序列到内存数据,通过驱动程序框架提供的IO服务将消息发送到服务器处理,并且服务器将通过IO调度程序传递IO调度程序机制机制时收到请求消息。分发到消息处理功能处理,处理功能将反向存储器数据分析为相应的请求。这是一个好处,开发人员只需要专注于接口的定义,并且没有必要支付太多关注如何在不同平台上实现界面自适应。
第三,驱动加载过程分析
Harmonyos驱动程序以不同的部署方式存在:
●动态加载模式:使用传统的SO(共享库)加载模式,通过指定符号来查找驱动功能入口的驱动程序加载驱动程序。
●静态加载模式:使用驱动程序将驱动程序编译到指定的部分,然后通过访问与指定部分对应的地址来查找驱动程序条目。
接下来,组合样本示例代码,解释了驱动加载过程,专注于在静态加载模式下分析内核模式驱动程序加载过程。
3.1实现驱动程序的初始化界面
在HDF驱动程序框架中,HDFDriverEntry对象用于描述驱动器实现。
写一个简单的驱动程序,首先需要在驱动程序条目条目中需要三个主要接口:
■绑定界面:
实现驱动器接口实例化绑定,如果需要发布驱动器接口,将在驱动器负载期间调用,实例化驱动服务和DeviceObject绑定。
■init接口:
实现驱动器的初始化,返回错误将中止驱动器负载过程。
■发布界面:
实现驱动程序卸载,在此接口中释放驱动器实例的硬件和软件资源。
3.2导出驱动程序条目符号
在实现驱动程序的初始化之后,有必要通过驱动程序声明宏引导驱动程序条目,以便驱动器帧可以在启动时识别驱动程序的存在,可以加载驱动器:
以下是实施原则:
图4驱动程序条目内存分发
可以看出,HDF_INIT宏将“驱动模块名称+ hdfentry”符号定义为“.hdf.driver”部分,符号的存储器地址是驱动程序条目结构的地址。此特殊部分将在启动启动时找到设备驱动程序。
3.3添加设备配置
在与设备对应的设备中添加示例驱动器配置:
在配置中定义的设备将在加载过程期间生成设备实例,指定通过模态字段对应于设备的驱动名称,从而将设备与驱动程序相关联。其中,设备和驾驶员可以是一对关系,即,一个驱动器支持多个类似的设备。
3.4驱动启动过程
我们如何添加正在执行的驱动程序?简单地,当系统启动时,首先启动驱动程序帧,通过解析配置文件获取设备列表,读取“.hdf.driver”列表读取到驱动程序条目列表,并遍历设备列表并驱动驱动器程序列表匹配并加载成功的驱动程序。
驱动程序框架有两个核心管理人员:
●DeviceManager:负责管理设备的管理,包括与设备加载,卸载和查询相关的设备。
●DeviceServiceManager:负责设备发出的接口服务,提供接口服务和查询的发布。
驱动器负载主要由DeviceManager主导。首先,DeviceManager是在配置文件中解析主机列表,并根据主机列表中的信息实例化相应的主机对象。主机解析配置文件获取相关的设备列表,遍历设备列表以获取匹配的驱动程序名称,然后使用前面提到的“.hdf.driver”部分基于驱动程序名称获取驱动程序地址。
具体过程如下所述。
3.4.1获取设备列表
图5设备列表结构
在配置文本编译后,它将成为二进制格式配置文件,其中与“HDF_Manager”标记的“HDF_Manager”存储在Device相关信息中,并且主机内容以块的形式排列在Device_Info块中,并在主机块中录制。主机名,启动优先级和设备列表信息。设备信息中的模态名字段将匹配驱动程序条目中的模态名以将设备与正确的驱动程序匹配。
3.4.2获取驱动程序列表
图6驱动器(驱动器)内存布局
HDF驱动程序框架存储在驾驶员索引的特殊部分中。此部分的开头和结尾插入到_hdf_drivers_end两个特殊符号中,用于标记本节,两个特殊符号之间的数据是驱动器实现指针。
3.4.3驱动程序加载过程
图7 HDF驱动器负载过程
设备管理器遍历设备列表,为设备创建设备对象实例,如果设备配置中的策略字段是必需释放驱动器接口(Service_Policy_Capacity),则将首先调用驱动的BIND接口,用于相关设备和相关设备服务实例。然后将调用驱动的init接口来完成驱动程序的相关初始化。如果驱动器卸载或由于硬件,则init interface返回失败,将调用版本以释放驱动程序应用程序的各种资源。
第四,总结
这次和每个人都分享了Harmonyos驱动程序的主要设计理念,重点关注内核模式驱动程序加载的过程,关于HarmonyOS驱动程序的其他内容,后续将有更多的技术文章继续分享,所以保持调整。
举报/反馈