LWN: 监控kernel内部的ABI

2023.5.9工作问题记录————安卓GKI检测abi-check 安卓系统GKI abi-check 阅读详情
640
点击上方蓝色“Linux News搬运工”关注我们~

Monitoring the internal kernel ABI

By Jake Edge


LPC

在Linux Plumbers Conference 2019会议的Distribution Kernels microconference议题里,Matthias Männich 介绍了一下Android项目是如何监控kernel ABI的改动的。随着Android的kernel版本不断演进,经常会使用到kernel新版本里引入的新功能以及bug fix,所以Android希望能确保ABI保持不变,这样相关module仍然可以拿来就能正常工作。这个话题主要是介绍Android相关的工作,不过这里的技巧和工具也能用在其他的发行版上(例如商业发行版)。

Männich 是Google Andriod kernel团队的一员,不过他接触Linux kernel的时间并不长,他的背景主要在编译系统(build system)这方面。他专门强调他的演讲并不是指kernel暴露给user space的ABI,而是指kernel暴露给module的ABI、API。目标是能让Android kernel的生命周期里保持ABI不变。他知道有一些其他发行版多年来一直都是按照这个标准做的,不过Android kernel和build系统跟他们很不一样,解决方案也值得分享一下。

Out of tree

他说,有些情况下不可能把所有信息都放在代码tree里,这个现实情况导致了后面的一系列工作。ABI稳定就意味着能够把kernel和module的开发过程分隔开。最终目标是希望能通过通过给module生态环境提供统一的ABI来支持多种不同kernel版本,从而减少Android各种方案的碎片化。

640

从Android 8开始,Project Treble就把vendor相关的Android代码跟其他软件代码分离开了,不过vendor的driver还是和kernel公共代码混杂在一起,没有完全分隔开。在此之后,kernel部分就被塞到了generic kernel image(GKI)里,此外还有统一的GKI module,以及使用稳定的ABI/API访问GKI的硬件相关驱动程序。

稳定的接口在upstream mainline这边其实并不需要,而是要对基于长期稳定版本(LTS)的分支代码来做这件事情。Dhaval Giani问道是否目标是希望让4.9.x和4.14.x都有同样的接口,Männich澄清说目标只是在一个LTS branch内部保持稳定即可。也就是说所有运行4.19.x系列的Android kernel都可以互相兼容,而无法跟5.x kernel兼容。

K. Y. Srinivasan问了个问题,Google是否已经放弃了之前的强迫所有内部开发者把代码upstream的宗旨。Männich说公司仍然鼓励这么做。Greg Kroah-Hartman指出他很希望所有人都把代码推到mainline上来,大家应该去跟高通好好谈谈。而Android项目经常需要跟一些没有进行upstream的vendor合作,所以没法避免,这就是现实世界的麻烦之处,他也在想办法解决。Tim Bird问Greg是否计划在LTS branch上只合入满足某些前提条件的改动,Kroah-Hartman说没这个打算。

实现方法上来说,Android会需要找到一个kernel configuration能够让所有vendor都可用。目前Android还没有办法能让每次的build结果都可以复现(reproducible build),因为目前Android的kernel编译还是一个封闭系统,也就是说编译时使用的toolchain、依赖文件、工具(例如uname)等都是独立的包,跟Android其他模块的编译不是同一套工具。

为了减少影响范围,首先需要能定义清楚ABI包含哪些。这包括一些白名单以及一些黑名单,也还有一些其他机制来帮助。

目前,Android只支持android-4.19和andriod-5.x(还没定具体x是哪个版本)两个系列上的稳定ABI。kernel会有一个GKI configuration,不过每个体系架构上可能会有不同。只支持这个封闭编译环境里的Clang编译器,也就意味着编译器和相关工具不能随意跟着Android kernel版本来升级。

稳定ABI只会覆盖可见的ABI。也就是说并不会审查代码里的各个ABI,而只是确保kernel作为可执行二进制程序对外的ABI。开发者目前正在做白名单,不久之后symbole namespaces合入mainline之后就能够根据不同的namespace来定义有哪些稳定ABI是被支持的。

一位听众想知道其他发行版是否也关注这个稳定ABI的问题。其他几位听众回答说有些人确实在意,因为客户会在意这一点。Laura Abbott举了个例子,一个流行的显卡驱动,没有提供源代码,所以无法重新编译module来配合新升级的kernel。有很多不在kernel tree里的驱动程序,他们的开发者可以升级驱动程序,不过如果发行版供应商希望能确保这些驱动程序都能持续正常工作的话,就需要能确保ABI稳定不变。

libabigail

Android利用libabigail来分析kernel ABI。libabigail包含一个library库,也包含对应的一套工具软件。Android基本上只用这些工具来提取kernel和module二进制文件里的ABI描述,并进行序列化操作(serialize/deserialize)。本来libabigail只使用了ELF和DWARF信息,不过近来也支持了分析kernel里的ksymtab,而不仅仅是看ELF符号表了。它接着会在内存里生成数据结构,列出它找到的ABI。这个数据结构会被序列化成XML文件,直接跟其他版本的ABI xml文件对比即可。

Bird问这个工具是不是应该加到upstream kernel的Makefile里。Kroah-Hartman和Männich都觉得这会导致kernel编译会依赖一个第三方工具,很多人可能不喜欢这个做法。Männich觉得不如在kernel编译完之后直接调用这个工具,这样更加简单。

Giani问是否需要所有可见的ABI都要在两个版本之前完全一样。Männich指出这就是为什么需要有白名单和suppression(忽略名单)机制了。Giani建议完全可以仅依赖一个白名单来解决这个问题,因为Android项目知道所有的驱动程序以及硬件相关的需求信息。否则的话,今后支持的ABI可能会不断增长,其实并不需要比对这么多的ABI。

Männich说,Android kernel configuration其实并不算大。比起一些发行版的标准configuration其实小多了。此外他也希望symbol namespaces合入之后能大大简化选择哪些ABI的过程。另一位Android team成员补充说,如果仅仅只用一个白名单的话,那么某些ABI其实我们根本不关注,例如文件系统接口,不过这些接口可能定义了一些结构或者数据类型用在了其他地方。所以目前的工作流程是尽量能拿掉一些东西,来让稳定ABI的list变的更小。

Ben Hutchlings问道,有些ABI的改动其实是向后兼容的,这些是怎么处理的?Männich回答其中一些仍然在处理。libabigail维护者Dodji Seketeli回答说有个suppression机制可以用,有点类似Valgrind中的相同机制。Suppression机制可以指明哪些改动已知不会产生ABI兼容性问题。

Sasha Levin问道,有些内核改动不会被视为ABI改动,例如锁的管理API。这些也会被跟踪对比吗?Männich说目前这些还没处理好,正在进行中。他举了一个例子是untagged enum值被作为作为函数的整数返回值,假如enum的值定义被重新调整过了,那么ABI其实已经变了,不过libabigail不会报出来。Seketeli认为应该把所有type都加到这个工具对ABI的跟踪列表里,而不应该只是跟踪函数定义。不过目前没这么做,主要是希望能降低内存占用。

另一位Android项目开发者指出,通常来说,像锁获取这些定义在LTS branch上一般不会有改变。如果你希望确保锁获取这些ABI稳定,那么就需要关心所有的ABI,这其实有可能会有一些其他问题,目前只能依靠开发者自己来识别这些问题,毕竟工具目前还无法提供这方面的帮助。

时间不多了,Männich快速介绍了一下ABI相关的工具是怎么集成到Android编译流程里的。任何人如果编译Android kernel都会在repo sync更新代码tree的时候拿到toolchain和工具,包括libabigail。在完整编译过程中,就会自动生成ABI列表,并跟基准ABI比对过。所有对ABI进行的改变都会在Android使用的Gerrit代码review系统上着重显示出来。这些工具很通用,应该会很容易集成到其他项目的工作流程里。

[I would like to thank LWN's travel sponsor, the Linux Foundation, for travel assistance to Lisbon for LPC.]

全文完

LWN文章遵循CC BY-SA 4.0许可协议。

极度欢迎将文章分享到朋友圈 
热烈欢迎转载以及基于现有协议修改再创作~

长按下面二维码关注:Linux News搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~

640?wx_fmt=jpeg

abi-compliance-checker 理解 文章目录简介社区依赖使用用法一:借用abi-dumper命令用法二:原始用法三:创建ABI DUMPS测试hello1hello2生成so库文件生成abi报表小结 简介 ABI Compliance Checker (ABI合规性检测器,ABICC) 是一种用于检查 C/C++ 软件库的向后二进制和源代码级兼容性的工具。 该工具分析 API/ABIABI=API+编译器 ABI)中可能破坏二进制兼容性和/或源代码兼容性的更改:调用堆栈的更改、v-table 更改、删除的符号、重命名的字段等。 该工具可以创 阅读详情

相关推荐

Linux Kernel 之一 内核架构、源码文件、API/ABI 介绍、FHS

内核架构主要有 宏内核(Monolithic Kernel)、微内核(Micro kernel)和混合内核(Hybrid kernel) 三种。Linux 系统的 Kernel 属于宏内核,而 Windows 系统的内核 Windows NT 和 macOS 的内核 XNU 都属于混合内核。

技术干货 4567

kernel-abi-whitelists-3.10.0-327.el7.noarch.rpm

离线安装包,亲测可用

Kernel: module接口ABI相关问题分析的思路;__GENKSYMS__;

但是为什么RHEL里还要留着,而且需要特殊的宏。增加了看代码的不畅快感。下面这个commit给genksyms 添加了 -T选项,会将module使用的相关接口符号,连同类型定义(-T type)一块导出到一个文件,方便版本之间做接口对比。最近看RHEL的代码发现有好多跟这个__GENKSYMS__相关的代码。但是从Kernel的git源码里搜确没搜出几个。其实Redhat这种方式有点取巧了。可能是为了避免某些个问题?这个工具的源码再kernel源码里,需要自己build出来。

mzhan017的博客 971

libabigail-1.7.tar.gz

动态库、静态库兼容性分析必备工具; 编译安装后可以使用工具abidiff; 最新的源码包; 编译步骤: ./configure make make install

Rust-GPU/Rust-CUDA 核心知识点:Kernel ABI 详解

在 GPU 编程中,理解如何正确地向内核函数传递参数至关重要。本文将深入探讨 Rust-GPU/Rust-CUDA 项目中的 Kernel ABI(应用二进制接口),帮助开发者掌握参数传递的正确方式。 ## 基本概念 Kernel ABI 定义了 CPU 端如何向 GPU 内核传递参数。在 Rust-GPU/Rust-CUDA 中,所有内核函数都必须使用 `extern "C"` 调用约定,这

gitblog_00417的博客 494

极简Linux手册--1

acl访问控制列表,指的是针对文件和目录的权限控制,属于常规文件权限的超集。可以针对每一个用户,每一个组单独设置权限。attr往XFS文件系统中对象添加或者删除扩展属性auditlinux记账系统,有点像日志信息,但没有日志信息那么多,但比较重要autofs用于自动挂载文件系统,如SMB,NFS,U盘等babeltrace处理进程调试跟踪的库,工具等bash最流行的linux命令解释器binuti...

weixin_40870382的博客 445

LWN: Facebook使用BPF的情况以及其他

点击上方蓝色“Linux News搬运工”关注我们~BPF at Facebook (and beyond)ByJonathan CorbetKernel Recipe...

Linux News搬运工 693

LWN:KRSI与propprietary BPF program!

关注了就能看到更多这么棒的文章哦~KRSI and proprietary BPF programsByJonathan CorbetJanuary 17, 2020原文来自:htt...

Linux News搬运工 847

C语言为何仍是操作系统内核开发的首选?内存管理与硬件交互的绝对优势

在计算机系统编程领域,内存管理和硬件交互是两大核心基础概念。内存管理涉及程序如何分配、使用和释放内存资源,直接关系到程序的性能和稳定性;硬件交互则决定了软件能否直接、高效地控制底层硬件设备。这些底层技术原理构成了操作系统、驱动程序和嵌入式系统等关键基础设施的基石,其技术价值在于实现对计算资源的极致控制和高效利用。在操作系统内核、嵌入式固件、高性能中间件等对性能、资源消耗和确定性要求极高的应用场景中,开发者需要一种能够提供直接内存访问、最小运行时开销和高效硬件抽象的语言。C语言凭借其指针操作、内存布局控制和贴

android_mylove的专栏 433

Linux内核分层与各层通信、调用及调试全解析

层清晰,接口明:每层职责单一,接口标准化。回调多,抽象强:多用回调和结构体实现多态。调试全,定位快:每层都有专用工具和日志。优化稳,扩展易:分层带来高性能和可扩展性。Linux内核分层结构将复杂系统拆解为若干独立但协作的模块,各层通过接口、回调、注册、事件等机制高效通信。分层不仅提高了系统的灵活性和可扩展性,还为调试和优化提供了有力保障。掌握每层的通信方式、接口调用和调试工具,是深入Linux内核开发和系统性能优化的必经之路。如需针对某一层级或通信机制深入源码级分析,欢迎继续提问!

IT技术学习与工作笔记分享 1230

如何确认是否存在KABI异常

就是驱动不用重新编译的情况下,就可以在新的内核上安装使用。如果驱动用到的接口都是兼容的,那么驱动就可以不用重新编译就可以在新版本上安装使用。从上面可以看出,在修改了struct v4l2_fh结构体内,新增了mutex subscribed_lock时,导致了KABI问题,该字段会影响video_devdata这个symbol函数。比较完之后,如果在console终端有输出时,会出现详细的调用情况,并且会说明是由于什么原因导致的KABI问题,这样就能基本确认问题并解决问题。如何快速确认KAPI异常点。

changcheng00的博客 1425

二进制兼容性分析方法

在软件工程领域,二进制兼容性(Binary Compatibility)是一个核心概念,它指的是一个计算系统能够运行为另一个系统编译的可执行代码(通常是机器码)的能力,而无需重新编译 。这与源代码兼容性(Source Compatibility)形成对比,后者意味着代码需要在目标系统上重新编译或解释才能运行 。二进制兼容性,尤其是向后兼容性(Backward Compatibility),意味着新版本的软件或硬件可以无缝执行为旧版本构建的二进制文件 。 这种兼容性对于软件生态系统的健康发展至关重要,特别是

weixin_39145568的博客 1124

谈谈Linux应用程序 ABI兼容性

背景 最近工作中遇到个问题,就是多个系统跑着不同版本的内核,不同架构的ARM芯片,上层的业务程序能否二进制归一(共镜像)。 根据自己对Linux的了解,glibc是否可以在ABI层面做到向前兼容。那个整个系统能否做到呢?这勾起了我的分析和思考。 ABI兼容依赖什么 试想一下,一个程序从源代码到最终的二进制,有哪些组件参与了编译和链接过程,大概如下: 内核导出用户态头文件 gcc编译器,gcc...

hk78787878的专栏 1428

【Note】Linux Kernel 之 内核架构、源码文件、API/ABI 、FHS

项目内容说明架构单体 + 模块化可抢占内核代码结构以子系统为单元目录组织API / ABI用户空间接口兼容,内核空间接口可变FHS按照标准结构挂载虚拟与持久文件系统。

YZJincsdn的博客 1362

黄东升: Linux中形形色色的接口API和ABI

今天我们来看看Linux中形形色色的接口前言如果将内核比作一座工厂,那么Linux中众多的接口就是通往这个巨大工厂的高速公路。这条路要足够坚固,禁得起各种破坏(Robus...

Linux阅码场 2503

仅限TOP 5%嵌入式团队掌握的C语言固件溯源技术:符号级依赖图谱构建+跨版本ABI一致性校验流程

破解固件供应链风险,提供可落地的C语言固件供应链检测流程。面向IoT/车载嵌入式场景,融合符号级依赖图谱构建与跨版本ABI一致性校验,精准识别恶意注入、影子库及不兼容更新。显著提升固件溯源深度与可信验证效率,值得收藏。

PoliSeed的博客 198

linux关于界面的API,linux系统基础知识(ABI和API)

对于linux而言,我们首先要明确一个核心观念,linux从严格意义上来讲,就是一个内核(Kernel)这个内核就是位于计算机硬件之上,对于用户来说,我们要和计算机打交道,必须要通过CPU来分配指令,那么作为用户,怎么直接和CPU对话?任何程序都是二进制格式的,运行程序一般有两种格式,一个是自行开机启动,另一个是用户自己启动,那用户要想运行程序,必须要通过程序来和CPU打交道,对于内核而言,这叫做...

weixin_39714528的博客 244
上一篇: LWN: glibc里的系统调用封装函数
下一篇: LWN: printk()的难点以及解决方案
LinuxNews搬运工
博客等级 码龄7年 419粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值