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的范围,两个特殊符号之间的数据即为驱动实现指针 。

推荐阅读