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


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驱动加载过程分析

文章插图

推荐阅读