手机版

鸿蒙系统工具链鸿蒙系统驱动加载过程分析

时间:2021-08-31 来源:互联网 编辑:宝哥软件园 浏览:

HDF(硬件驱动基础)驱动框架为驱动开发者提供驱动框架能力,包括驱动加载、驱动服务管理和驱动消息机制。目的是搭建统一的驱动架构平台,为驱动开发者提供更加精准高效的开发环境,努力实现一次开发、多系统部署。

HarmonyOS驱动加载过程分析

  一、HarmonyOS驱动概述

鸿蒙系统驱动框架采用C语言的面向对象编程模型构建,通过平台解耦和内核解耦,兼容不同内核和统一的平台库,帮助开发者实现“一次开发、多系统部署”。

为了实现这一目标,鸿蒙系统驱动框架提供:

1.操作系统抽象层(OSAL):提供内核操作相关接口进行统一封装,屏蔽不同的系统操作接口。

2.平台驱动接口:为板卡部分驱动(如I2C/SPI/UART总线等平台资源)提供支持,对板卡硬件操作接口进行统一适配抽象。开发人员只需开发新的硬件抽象接口,即可获得新板部分驱动支持。

3.驱动模型:面向设备,提供通用的驱动抽象模型,主要达到两个目的:

提供标准化的设备驱动,无需独立开发即可通过配置部署。

提供驱动模型抽象,屏蔽驱动与不同系统组件的交互,使驱动更加通用。

为了进一步简化鸿蒙系统驱动的开发,鸿蒙系统驱动框架支持多种驱动加载方式:

支持驱动动态加载和静态加载,消除驱动代码与框架之间的直接代码依赖,使驱动可以独立编译和部署;

支持按需动态加载,避免设备驱动满载,有效减少系统资源占用。

本文主要分析了鸿蒙系统驱动程序的加载过程。在正式介绍之前,我们先了解一下鸿蒙系统驱动架构的组成、工作原理和机制,从而了解驱动加载的细节。

官网相关介绍:https://device.harmonyos.com/cn/docs/develop/drive/OEM _ drive _ hdfdev-000001051715456

  二、HarmonyOS驱动架构介绍

  2.1 HarmonyOS驱动架构组成

HarmonyOS驱动加载过程分析

图1鸿蒙系统驱动程序架构

鸿蒙系统驱动架构主要由HDF驱动框架、驱动、驱动配置文件和驱动接口组成。

1)HDF驱动框架提供统一的硬件资源管理、驱动加载管理和设备节点管理。

驱动框架采用主从式设计,由设备管理器和设备主机组成。

设备管理器提供统一的驱动程序管理。设备管理器启动时,根据设备信息提供的驱动信息,加载相应的驱动设备主机,控制主机完成驱动加载。

设备主机为驱动程序运行提供了一个环境。同时预设的主机框架配合设备管理器完成驱动的加载和调用。根据业务需求,设备主机可以有多个实例。

  说明:

顾名思义,设备主机是驱动程序主机,为驱动程序运行提供环境。

当驱动程序以用户模式部署时,设备主机可以由独立的进程托管。

当驱动程序以内核模式部署时,设备主机仅代表逻辑隔离。

设备主机的划分原则:设备主机属于设备聚合的一种,如摄像头、音频、显示器等。

驱动程序是部署在一台设备主机上还是部署在不同的设备主机上,主要关注驱动程序之间是否存在业务耦合。如果两个驱动程序之间存在依赖关系,可以考虑将这些驱动程序部署在统一的主机中。

2)驱动实现驱动的具体功能,每个驱动由一个或多个驱动组成,每个驱动对应一个驱动入口。驱动入口主要完成驱动的初始化和驱动接口的绑定。

3)驱动程序配置文件。hcs主要由设备信息和设备资源组成。

设备信息完成设备信息的配置,如配置接口发布策略、驱动加载模式等。设备资源完成设备资源的配置,如GPIO引脚、寄存器和其他资源信息。

4)硬件驱动接口(HDI)提供标准化的接口定义和实现,驱动框架提供IO Service和IO Dispatcher机制,使得不同部署模式下的驱动接口在形式上趋于一致。

当驱动部署在RTOS(实时操作系统)轻量级操作系统中时,驱动接口和驱动是通过Function Call模式调用的,所以驱动接口只提供定义,驱动提供驱动接口的实现。

  2.2 HDF驱动框架工作原理

HarmonyOS驱动加载过程分析

图2 hdf驱动框架的工作原理

设备管理器提供了统一的驱动加载管理机制和驱动接口发布机制。

当加载设备主机环境时,设备管理器根据设备信息请求主机加载相应的驱动程序。当接收到请求时,设备主机执行以下操作:

1)根据加载设备信息的请求,在指定路径下查找并加载驱动程序映像或从指定的段中查找驱动程序条目;

2)搜索驱动设备描述符,匹配对应的设备驱动;

3)当驱动匹配成功时,加载指定的驱动映像;

4)驱动镜像加载成功后,4)主机框架调用驱动入口的绑定接口和初始化接口,与驱动的服务对象绑定,同时初始化设备驱动;

5)当设备信息配置中的服务策略要求驱动接口对外公开时,驱动框架将驱动的服务对象添加到已发布的服务对象列表中,外部客户端程序可以通过该列表查询访问相应的服务接口。

  2.3 驱动接口工作机制

HarmonyOS驱动加载过程分析

图3驱动接口工作机理

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

当驱动作为内核组件部署时,客户端程序需要通过系统调用调用驱动,驱动接口通过IO Service请求通过系统调用将消息调用到内核,并将消息分发到IO Dispatcher进行处理。

当驱动以用户模式服务的形式部署时,客户端进程需要通过IPC进行通信才能访问驱动进程。IO Service完成IPC通信的客户端消息请求封装,IO dispatcher完成驱动服务器的消息请求封装,客户端消息通过IPC通信到达服务器,分发到IO dispatcher进行处理。

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

驱动程序接口采用远程调用方式。客户端驱动接口功能将请求序列化为内存数据,通过驱动框架提供的IO Service将消息发送给服务器进行处理。服务器收到请求消息后,通过IO Dispatcher机制将消息分发到消息处理功能进行处理,处理功能将反序列化后的内存数据解析为对应的请求。这样做的好处是开发者只需要关注接口的定义,不需要过多关注如何在不同平台上适配接口。

  三、驱动加载过程分析

根据不同的部署模式,鸿蒙系统驱动程序有两种加载模式:

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

静态加载模式:通过散点将驱动编译到指定的Section,然后通过访问指定Section对应的地址找到要加载的驱动函数入口。

以下是解释驱动程序加载过程的示例代码,重点分析静态加载模式下的内核驱动程序加载过程。

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

HarmonyOS驱动加载过程分析

在HDF驱动框架中,HdfDriverEntry对象用于描述驱动实现。

要编写一个简单的驱动程序,我们首先需要在驱动程序条目中实现三个主要接口:

绑定接口:

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

初始化界面:

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

释放界面:

HarmonyOS驱动加载过程分析

实现驱动卸载,在此界面释放驱动实例的软硬件资源。

  3.2 导出驱动程序入口符号

实现驱动初始化后,需要通过驱动声明宏导出驱动入口,这样驱动框架在启动时就可以识别驱动的存在,并加载驱动:

HarmonyOS驱动加载过程分析

  下面是实现原理:

HarmonyOS驱动加载过程分析

图4驱动程序条目内存分布

可以看到,HDF_INIT宏定义了一个“驱动模块名HdfEntry”的符号,放在“. hdf.driver”所在的节中,符号指向的内存地址就是驱动入口结构的地址。这一特殊部分将用于在引导时查找设备驱动程序。

  3.3 添加设备配置

在设备对应的device_info.hcs中添加示例驱动程序的配置:

HarmonyOS驱动加载过程分析

配置中定义的设备将在加载过程中生成一个设备实例,通过moduleName字段指定设备对应的驱动程序名称,设备将与驱动程序相关联。其中,设备和驱动可以有一对多的关系,即一个驱动可以支持多个同类型的设备。

  3.4 驱动启动过程

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

驱动框架中有两个核心经理:

设备经理:负责设备管理,包括设备的加载、卸载和查询。

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

驱动加载主要由DeviceManager主导。首先,设备管理器应该解析配置文件中的主机列表,并根据主机列表中的信息实例化相应的主机对象。Host解析配置文件以获得关联的设备列表,遍历设备列表以获得匹配的驱动程序名称,然后遍历前面提到的“. hdf.driver”部分以基于驱动程序名称获得驱动程序地址。

下面描述具体过程。

  3.4.1 获取设备列表

HarmonyOS驱动加载过程分析

图5设备列表结构

编译配置文本后,会变成二进制格式的配置文件,其中设备相关信息存储在标有“hdf_manager”的device_info配置块中,主机的内容以块的形式依次排列在device_info块中,主机名、启动优先级和设备列表信息记录在主机块中。设备信息中的模块名称字段将用于匹配驱动程序条目中的模块名称,以便为设备匹配正确的驱动程序。

  3.4.2 获取驱动程序列表

HarmonyOS驱动加载过程分析

图6硬盘驱动器的内存布局

HDF驱动程序框架将驱动程序入口符号的地址集存储在一个特殊的部分中,以索引驱动程序。两个特殊符号_hdf_drivers_start和_hdf_drivers_end插在本节的开头和结尾,用来标记本节的范围,两个特殊符号之间的数据就是驱动程序实现指针。

  3.4.3 驱动程序加载流程

HarmonyOS驱动加载过程分析

图7 HDF驱动程序加载过程

设备管理器遍历设备列表,当找到相应的驱动程序实现时,它会为设备创建一个设备对象实例。如果设备配置中的策略字段是SERVICE_POLICY_CAPACITY,将首先调用驱动程序的Bind接口,将设备与服务实例相关联。然后调用驱动的Init接口,完成驱动的初始化。如果由于硬件等原因导致驱动卸载或者Init接口无法返回,将调用Release释放驱动请求的各种资源。

  四、总结

这次和大家分享了鸿蒙系统驱动的主要设计思路,重点分析了内核模式驱动的加载过程。至于鸿蒙系统驱动的其他内容,以后会有更多的技术文章持续与大家分享,敬请期待。

版权声明:鸿蒙系统工具链鸿蒙系统驱动加载过程分析是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。

相关文章推荐