转载地址:https://source.android.google.cn/devices/architecture/kernel/ion_abi_changes?hl=zh_cn

搭载内核 4.14 及更高版本的设备受到一项对 Ion 内核模块的重大重构的影响,许多供应商图形内存分配器 (gralloc) 硬件抽象层 (HAL) 实现会通过调用该模块来分配共享内存缓冲区。本文提供了有关如何将旧版供应商代码迁移到新版 Ion 的指导,并讨论了未来可能出现的应用二进制接口 (ABI) 中断问题。

关于 Ion

Ion 是上游内核正在开发中的状态树的一部分。在生产前调试阶段,Ion 的用户空间到内核 ABI 可能会在主要内核版本之间产生中断。尽管 Ion ABI 中断不会直接影响普通应用或已发布的设备,但如果供应商迁移到新的主要内核版本,可能会遇到影响对 Ion 的供应商代码调用的变更。此外,随着 Android 系统团队与上游合作将 Ion 迁出状态树,未来也可能会出现 ABI 中断问题。

android-4.14 中的变化

内核 4.12 大幅度重构了 Ion 内核代码,清理并移除了 lon 中与其他内核框架重叠的部分。因此,许多旧版 Ion ioctl 不再有存在的意义,也已经被移除了。

移除了 Ion 客户端和句柄

在内核 4.12 之前,打开 /dev/ion 会分配一个 Ion 客户端。IOC_ION_ALLOC ioctl 分配了一个新的缓冲区,并将其作为 Ion 句柄(仅对分配它的 Ion 客户端有意义的不透明整数)返回至用户空间。如需将缓冲区映射到用户空间或与其他进程共享缓冲区,可使用 IOC_ION_SHARE ioctl 将 Ion 句柄重新导出为 dma-buf fd。

在内核 4.12 中,IOC_ION_ALLOC ioctl 可直接输出 dma-buf fd。中间 Ion 句柄状态以及所有使用或生成 Ion 句柄的 ioctl 均已移除。由于 dma-buf fd 并未与特定的 Ion 客户端相关联,因此不再需要 IOC_ION_SHARE ioctl,并且所有 Ion 客户端基础架构均已移除。

添加了缓存一致性 ioctl

在内核 4.12 之前,Ion 提供了一个 ION_IOC_SYNC ioctl 来使文件描述符与内存实现同步。此 ioctl 的相关记录不完整,并且不够灵活。因此,许多供应商实现了自定义 ioctls 来执行缓存维护。

内核 4.12 将 ION_IOC_SYNC 替换成了 linux/dma-buf.h 中定义的 DMA_BUF_IOCTL_SYNC ioctl。在每次 CPU 访问开始和结束时调用 DMA_BUF_IOCTL_SYNC,并通过标记来指明这些访问为读取和/或写入。尽管与 ION_IOC_SYNC 相比,DMA_BUF_IOCTL_SYNC 更为冗长,但它可以使用户空间更好地控制底层缓存维护操作。

DMA_BUF_IOCTL_SYNC 是内核的稳定 ABI 的一部分,适用于所有 dma-buf fd,无论它们是否由 Ion 分配。

将供应商代码迁移至 android-4.12+

对于用户空间客户端,Android 系统团队强烈建议使用 libion,而不是对 ioctl() 调用进行开放编码。从 Android 9 开始,libion 会在运行时自动检测 Ion ABI,并尝试掩盖内核之间的任何差异。但是,在内核 4.12 之后,生成或使用 ion_user_handle_t 句柄的任何 libion 函数都无法再继续使用。您可以使用 dma-buf fd 上的以下等效操作(适用于到目前为止的所有内核版本)替换这些函数。

旧版 ion_user_handle_t 调用
ion_alloc(ion_fd, …, &buf_handle) ion_alloc_fd(ion_fd, ..., &buf_fd)
ion_share(ion_fd, buf_handle, &buf_fd) 不适用(dma-buf fd 不需要此调用)
ion_map(ion_fd, buf_handle, ...) mmap(buf_fd, ...)
ion_free(ion_fd, buf_handle) close(buf_fd)
ion_import(ion_fd, buf_fd, &buf_handle) 不适用(dma-buf fd 不需要此调用)
ion_sync_fd(ion_fd, buf_fd) If (ion_is_legacy(ion_fd))

ion_sync_fd(ion_fd, buf_fd);

else

ioctl(buf_fd, DMA_BUF_IOCTL_SYNC, ...);

对于内核中客户端,由于 Ion 不再导出任何面向内核的 API,因此,以前将内核中 Ion 内核 API 与 ion_import_dma_buf_fd() 结合使用的驱动程序必须转换为将内核中 dma-buf API 与 dma_buf_get() 结合使用。

未来的 Ion ABI 中断问题

在将 Ion 移出状态树之前,未来的内核版本可能需要再次中断 Ion ABI。Android 系统团队并不希望这些变更影响到搭载下一个 Android 版本的设备,但此类变更可能会影响到搭载后续 Android 版本的设备。

例如,上游社区已提议将单个 /dev/ion 节点拆分为多个按堆划分的节点(例如 /dev/ion/heap0),从而使设备能够针对各个堆应用不同的 SELinux 政策。如果在未来的内核版本中实现此变更,可能会中断 Ion ABI。

Ion ABI 变更相关推荐

  1. DPDK Release 22.11

    新功能 添加了初始LoongArch架构支持. 添加了对 LoongArch 架构的 EAL 实现.在 Loongson 3A5000, Loongson 3C5000 和 Loongson 3C50 ...

  2. 大话ion系列(一)

    点击上方"LiveVideoStack"关注我们 作者 | 王朋闯 本文为王朋闯老师创作的系列ion文章,LiveVideoStack已获得授权发布,未来将持续更新. 一.为什么用 ...

  3. Android 11 变更及适配攻略

    终于开始了Android 11的适配工作.记录一下,供需要的人参考. 1. 准备工作 老规矩,首先将我们项目中的 targetSdkVersion 改为 30.或者使用兼容性调试工具,后面我会说到. ...

  4. android源代码 abi,Android内核源码Abi目录学习笔记

    好记性不如烂笔头,今天要学习的是Android中Abi目录下的代码.下面是基本的学习的笔记的汇总. 首先是include中的头文件的说明. 在cxxabi的头文件中主要需要掌握下面的几个点: 1.这个 ...

  5. 怎么进u8系统服务器网址,服务器地址变更后如何进入u8

    服务器地址变更后如何进入u8 内容精选 换一换 当您拥有一台专属主机后,您可以在专属主机上创建相应规格族的云服务器.在专属主机上创建云服务器前,您必须先完成以下工作:购买专属主机如果不使用系统自动创建 ...

  6. 在CentOS 6.6 64bit上编译安装LLVM3.7,Clang,Libc++和libc++abi

    一.简介 LLVM LLVM(之前称为低级虚拟机Low Level Virtual Machine)是一种非常强大的编译器基础架构框架,专门为使用您喜爱的编程语言编写的程序的编译时.链接时和运行时优化 ...

  7. php 变更 obj,PHP: 不向后兼容的变更 - Manual

    不向后兼容的变更 PHP 核心中不向后兼容的变更 以数组形式访问非数组 尝试以数组方式访问 null,bool, int,float 或 resource (例如 $null["key&qu ...

  8. Android Q 变更和新特性

    安全和隐私变更 隐私保护是Android Q重要的主题之一,Android Q带来了一系列增强用户隐私保护的变更. 1 应用文件存储空间限制 应用访问限制是Android Q影响最大变更之一.在And ...

  9. 六个最佳的软件工程实践(持续的质量验证、变更管理)

    昨天图文介绍了基于构件的体系结构以及可视化建模,今天我们介绍六个最佳工程实践的最后两个,持续的质量验证以及变更管理.持续的质量验证是伴随迭代化开发而进行的不断验证,且每次迭代的测试集合都是不断递增的. ...

最新文章

  1. 我招了个“水货”程序员
  2. Castle ActiveRecord 泛型应用
  3. 关于字符串计算size的方法比较
  4. 简单记事本及目录树形图的Java实现
  5. Input类,Vector3实例
  6. movzbl和movsbl
  7. python实现监控电脑打开网页_Python轻松实现动态网页爬虫(附详细源码)
  8. 试图加载格式不正确的程序
  9. 多维柔性作业调用_摆脱困境:从预定作业中调用安全方法
  10. 前端常用 JavaScript 方法封装
  11. UE4中Bebavior Tree中Delay及其后面代码失效的原因
  12. GNS3 1.5.2 无法上传文件的解决办法
  13. Java接口的实现源代码_Comparable接口的实现:源代码
  14. Sqlserver2014 迁移数据库
  15. 怎样学好计算机——计算机达人成长之路(23)
  16. java判断简体和繁体字_java获取系统语言(区分简体中文和繁体中文)
  17. 荣耀6plus+android5.1,荣耀6Plus Emui3.1-Android5.1.1 Root教程
  18. 场景法、流程分析法、错误推断法
  19. 计算机一点桌面显示删除,电脑开机后任意点击桌面图标后不停出现删除文件窗口?...
  20. 排队服务系统仿真研究计算机模拟,基于蒙特卡洛方法排队系统性能的仿真优化研究...

热门文章

  1. 计算机自动化专业学什么,机械制造计算机综合自动化是学什么的专业
  2. main函数的汇编代码
  3. RocketMQ报No route info of this topic错误解决办法
  4. python语言能做游戏吗_python语言能做什么
  5. Parallel的使用 之Parallel.for
  6. “永恒之蓝”勒索病毒安全事件应急指导手册(附工具包)
  7. linux下普通用户执行root权限脚本
  8. (数据结构)二叉树后序遍历
  9. iOS 探讨之 设置文件iCloud不同步
  10. 网络抓包与流量在线分析系统的设计与实现-基于libpcap在MacOS上实现 记录这愉快(DT)的一周