整体架构
从上至下:
framework:C到java的转换,服务的封装;
HAL:定义了标准的硬件接口,N之前是 hw_module_t,N之后还要实现HIDL framework和service,优先使用绑定式, 严格来说要实现这步。
Android 11 中引入了AIDL 来实现HAL功能,以此来替代HIDL。
linux:设备节点的创建供上层调用。
SystemService
参考:Android系统服务(SystemService)简介
内核与用户空间通信方式
一般来说用户空间和内核空间的通信方式有三种:/proc、ioctl、Netlink。Linux针对不同的情况提供了多种方法实现内核态和用户态的交互。包括
内核启动参数:
模块参数;
sysfs:(虚拟文件系统,节点必须挂着/sys下)、将一些原本在 procfs 中的,关于设备和驱动的部分,独立出来,以 “设备树” 的形式呈现给用户。
sysctl:运行时配置内核参数、主要是被用来修改内核的运行时参数,使用/proc/sys
netlink:linux提供的用于内核和用户态进程之间的通信方式,可实现双工通信。有点类似创建socket;参考:Netlink通信机制
内核用 netlink_kernel_create 创建socket,第四个参数input:为内核模块定义的netlink消息处理函数,发送单播消息 netlink_unicast,发送广播消息 netlink_broadcast
socket | netlink | 备注 |
---|---|---|
recv/send | msg_flags | |
readv/writev | msg_iov | |
recvfrom/sendto | msg_name | |
recvmsg/sendmsg | msg_control | 包含以上三点功能 |
procfs:是 进程文件系统 的缩写,它本质上是一个伪文件系统。不占用外部存储空间,只是占用少量的内存,通常是挂载在 /proc
目录下。输出的数据一般是只读的。
seq_file:序列文件,加入了内核缓冲功能,适用于内核与用户空间传递大数据。
debugfs和relayfs,除此之外,还有其他的一些,比如信号,内存映射机制等等。
HAL与驱动的联动可参考:audio HAL与kernel联动过程中几个关键的函数分析
===========
HAL、HIDL发展
主要是就是将以前那种 Java-> Jni -> Hal -> Kernel 的结构变成了
Java -> Jni -> Binder 客户端 ====== Binder 通信 ======> Binder 服务端 -> Hal -> Kernel
将 framework 与 Hal 之间的交互变成了 CS 结构了。
参考:
linux 用户态与内核态通信:Linux用户态与内核态通信的几种方式