LWN:LPC 2020上安卓内核相关讨论!

RK3568平台 Android13 GKI架构开发方式_玩转android gki(1) GKI:Generic Kernel Image 通用内核映像。Android13 GMS和EDLA认证的一个难点是google强制要求要支持GKI。GKI通用内核映像,是google为了解决内核碎片化的问题,而设计的通过提供统一核心内核并将SoC和板级驱动从核心内核移至可加载模块中。核心内核为驱动模块提供了稳定的内核模块接口,模块驱动和核心内核可以独立进行更新。内核接口可以通过upstream的方式进行扩展。 阅读详情


关注了就能看到更多这么棒的文章哦~

Android kernel notes from LPC 2020

By Jonathan Corbet
September 10, 2020
LPC
原文来自:https://lwn.net/Articles/830979/
DeepL assisted translation

在 Android 项目的早期,它的 kernel 代码跟 kernel community 的代码有很大差异。这种情况后来有了很大的改善,但 Android kernel 和 mainline kernel 之间仍然存在差异。因此,无法直接用原生内核(vanilla kernel)来运行 Android。不过,情况仍在继续改善中。在 2020 年 Linux Plumbers Conference 的 Android microconference 上,就讲述了许多这方面的进展。这几个会议都展示了在统一 Android 和 mainline kernel 方面所取得的进展,以及还有什么需要做的工作。

The generic kernel image

Todd Kjos 首先介绍了 Android Generic Kernel Image(GKI)的工作。它的目的是为了从总体上减少 Android 的内核碎片化问题。这是现有的 Android Common Kernel 的更进一步的工作,Android Common kernel 在 mainline 的长期支持(LTS, long-term support)版本的基础上,额外添加了一些 patch。这些 patch 包括 Android 特有的、没有在 kernel tree 里的一些功能,也有从 mainline 正式发布版本中挑选出来的一些 fix patch 等。因此,Android Common Kernel 与它所基于的 LTS 版本还是有一定的差异。

后面的步骤让事情变得更糟。厂商会基于这个版本的 kernel,把他们自己的改动(通常是一些重要的、设计内核核心部分的改动)加上来,生成一个 vendor kernel 版本。而 OEM(original-equipment manufacturer)在基于 vendor 的芯片来开发具体产品时,首先会使用这个 vendor kernel,在此基础上添加他们自己的更改来得到一个 OEM kernel,该内核将随产品一起交付给消费者。所有这些补丁导致每种产品都有自己的内核,这意味着实际有数千种不同的 "Android " kernel 在流通。

Kjos 说,这套做法导致很多额外的工作。这种碎片化现象使我们更加难以确保所有设备都运行最新内核,甚至很难确保它们都能获得安全更新。新的平台发布时要求要用新的 Linux kernel,这就导致现有设备升级到新的 Android 版本时需要花费更多时间来升级。vendor 和 OEM 所做的 fix patch,通常也不会合入到 mainline,这让情况变得更糟。

Android 开发者希望解决这个碎片化的问题;实现这个目标的途径是提供一个所有设备都能使用的二进制形式(binary form)的通用内核,也就是所谓的 general kernel image, GKI。任何不在 mainline kernel 中的 vendor 代码或者设备特有的代码都需要以 kernel module 的形式加载到 GKI 中。Kjos 说,这意味着 Android 明确在鼓励 vendor module,这样能得到一个更干净的内核,避免现在许多设备上都在做的对内核核心代码的修改。

这个策略已经使得更多 vendor 在积极地将他们的代码推到 upstream。这些代码往往不符合 mainline 开发者的要求,有些甚至只是把一些 kernel symbol 给 export 出来。他说,这在开发社区中造成了一些争论和冲突。

最后,他说 Android 11 的发布要求所有设备都必须使用基于 Android Common Kernel 的内核。Android 12 将要求改用 GKI 出货。Tim Bird 问道,如果 vendor 必需的一些 patch 没有集成到 mainline 或 Android Common Kernel 中时,厂商应该如何应对。Kjos 回答说,目前的计划是通过 tracepoints 添加 vendor hook。不过细节还没有制定出来。

ABI enforcement

之后,Matthias Männich 谈到了 GKI ABI enforcement,这个工作的目的是确保供 module 使用的 ABI 要稳定不变,这样 GKI 的更新就不会破坏已经发布的设备。这不是一个简单的任务,内核 ABI 非常多,很难及时发现某一部分发生了变化。他强调,这项工作绝不是要固定 mainline kernel ABI,也不是要固化 LTS kernel 的 API。其实它只是想让 kernel ABI 在给定的 Android 版本中要保持稳定。

虽然在 GKI 更新时不期望有任何 ABI 改动,但只要不改变 module 所能看到的接口,那其实还是可以改变的。kernel 和 module 都是使用同样的编译工具,经过 "hermetic build,即不受外界条件影响的编译" 的过程来编译生成的,也就是说,其中所有需要的用到的库都不会使用进行这次编译的 PC 上的本地环境的。而编译器的更新会被仔细检查,来确保它们不会导致任何 ABI 变化。他说,Android 宁可不升级也不会冒出问题的风险。

在 ABI 内部,需要确保保持所有可被看到的 API 都稳定。因此,如果这些可以被看到的 API 集合能尽量小,这个任务显然会更容易。在这方面,kernel symbol namespaces(https://lwn.net/Articles/760045/ )就会很有帮助。同时,kernel symbol namespaces 也有助于防止内核符号不小心地用到。通过观察 vendor module 实际使用到的 kernel symbol,就可以建立起一套 kernel-module interface,这些符号自然要 export 出来。不过还要把后来发现没有用到的 API,都从 GKI 中拿掉,让它无法被调用到。当厂商需要一个新的 symbol 时,就需要向 Android Open Source Project 提出请求,只要这个请求是合理的,那么这个 symbol 就会出现在后续的 GKI 更新中。

Android on mainline

Sumit Semwal 介绍的话题是关于如何在 mainline kernel 上启动 Android 系统的。结果发现,在一般的场景下,目前只需要一个 patch 就可以了:anonymous VMA naming(https://lwn.net/ml/linux-kernel/20200901091901.19779-1-sumit.semwal@linaro.org/ )。安卓内核还需要 inline encryption,但这一个功能在 5.9 版本中已经合入 mainline 了。

当然,在真实硬件上,情况会变得更加复杂。对于使用骁龙 845 SoC 的设备来说,需要一些 out-of-tree drivers。其中,Pixel 3 设备上使用的 lt9611 HDMI bridge driver 已经排入 5.10 合并窗口了。小米的 Pocophone F1 只需在 5.9-rc1 kernel 的基础上打上一些触摸屏、WiFi 和音频设备的 patch,就能正常运行了。

他说,理论上来说,Android 系统可能只需要一个 mainline kernel patch 就能启动,但 Android kernel 在 5.9-rc kernel 的基础上仍然额外增加了 485 个 patch。其中约 30 个目前正在讨论合入 mainline,78 个有计划 upstream。另外 25 个正在由 Linaro 进行开发调整也希望让它们进入 upstream。有 54 个 patch 最终会被其他替代方案取代,包括人们讨论很多次的 ION memory allocator。这样就剩下 260 个补丁目前还没有明确看到推进 upstream 的计划。其中许多 patch 与 GKI build 或 configuration change 有关。有十个补丁可以考虑 upstream,但它们也需要 upstream user 才行。

目前围绕 upstream 工作最活跃的讨论集中在 inline encryption(已经合并了)和 incremental filesystem(增量文件系统,下文将进一步讨论)等功能上。anonymous VMA naming 最早是由 Colin Cross 在 2013 年提出来进行 review 的,但现在仍未合并,目前正在进行一些努力来希望真正能合入。DMA-buf heaps 作为 ION 的替代者正在继续推进中。

还未进入 upstream 的工作也包括 DRM notifiers,在 kernel 里面没有地方会用到它(lack an in-kernel user),因此不会考虑合入 mainline,DRM notifier 的 patch 也没有提出来 review。要想能完全取代 ION,那么还需要更多 DMA-buf heap provider 才行,可是这些工作这些也缺乏 in-knerle user。要改变这种情况,就需要 vendor 把要用到这些功能的驱动程序推到 upstream 上。

Incremental filesystem

增量文件系统(incremental filesystem)是一项重要的 Android 功能,目前还没有在 mainline 上看到太多讨论。Paul Lawrence 专门为这功能举行了一次简短的会议。增量文件系统的目的是允许新下载的应用能立即启动,哪怕应用下载到设备的过程还没有完成。为了实现这一点,正在下载的文件需要显得好像它们已经存在于设备上一样,如果在从这个文件读取时所需的 block 已经下载好了,就可以成功读取出来;否则的话应用程序只能继续等待,直到这些区块可以读到。

增量文件系统上的文件是只读的,但文件系统本身不是只读的。某个文件的各个 block 可能不是按顺序准备好的,文件系统需要相应地跟踪好这些信息。这个功能是通过 stacking filesystem 的方式来实现的,也就是说,在文件最终存储的位置底层还有一个 "real"文件系统。大部分的目录操作都会直接传递到底层的文件系统,而读取时则需要分析这个文件并返回预期的数据(当然是等到相应的部分数据已经可用才行)。写入操作(只有在创建文件时才可写入)是通过一个特殊的 ioctl()调用来完成的。

这项工作在 2019 年首次发布到 mailing list 中,但它尚未得到太多的有意义回复。预计在不久的将来会有新的版本提出来,因为 Android project 正在努力将这项功能纳入 mainline kernel。

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

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

GKI 介绍 Google Android Kernel Team 经过多年准备,开始在Android 11的研发版本推行GKI (Generic Kernel Image,通用内核镜像)设计,旨在消除AOSP社区的碎片化。类似GSI(Generic System Image,通用系统镜像)的设计理念,由Google 统一发布boot.img给全球用户。从Android 11开始,Google 强制要求Kernel5.4 及以上版本进行GKI认证。 阅读详情

相关推荐

安卓添加vendor hook

在include/trace/hooks/目录下,创建头文件xxx.h。定义hook函数。

xuanfengwuxiang的博客 2447

GKI改造原则、机制和方法

Google在android11-5.4分支上开始要求所有下游厂商使用Generic Kernel Image(GKI),需要将SoC和device相关的代码从核心内核剥离到可加载模块中...

内核工匠 3万+

【Android】 Generic Boot Partition

在 Android 12 中,通用boot映像称为 通用内核映像 (GKI),包含通用 ramdisk 和 GKI 内核。对于搭载 Android 13 的设备,通用 ramdisk 将从boot.img中删除并放置在单独的init_boot.img中。此更改使boot.img仅包含 GKI 内核。

weixin_41028159的博客 1997

Android KGI (Generic Kernel Image)

GKI(通用内核映像)就是 Google 为了集权而推出的标准。它把内核分为“Google 管的通用部分”和“厂商管的硬件驱动部分”。通过这种解耦,Google 成功将 Android 内核从“碎片化”的泥潭中拉了出来,实现了类似 iOS 的统一内核维护模式,让 Android 系统更安全、更新更及时。

weixin_42065195的博客 1496

谷歌Android增量文件系统incfs(Incremental File System )

Incremental FS(IncFS)是谷歌在2019年提出的一个计划用于Android应用下载更新的文件系统[2]。IncFS不允许直接写入文件,并且追加写后的内容也永不改变。它允许在大型Android应用程序的二进制文件和资源没有完全加载到Android设备上之前运行。如果应用读取的内容尚未加载,它需要等待数据块被提取,但是在大多数情况下是热块可以预先加载,并且应用程序几乎可以立即流畅运行。

古苏的博客 1446

Android13 GKI架构开发方式

GKI:Generic Kernel Image 通用内核映像。Android13 GMS和EDLA认证的一个难点是google强制要求要支持GKI。GKI通用内核映像,是google为了解决内核碎片化的问题,而设计的通过提供统一核心内核并将SoC和板级驱动从核心内核移至可加载模块中。核心内核为驱动模块提供了稳定的内核模块接口,模块驱动和核心内核可以独立进行更新。内核接口可以通过upstream的方式进行扩展。

weixin_49303682的博客 4333

LWN:Android上使用KVM!

关注了就能看到更多这么棒的文章哦~KVM for AndroidBy Jake EdgeNovember 11, 2020KVM Forum(https://lwn.net/Archiv...

Linux News搬运工 1万+

立创星火计划:基于STM32H743VIH6的Maverick_H743_MK1.0高性能开源飞控硬件全解析

本文详细解析了基于STM32H743VIH6核心的Maverick_H743_MK1.0高性能开源飞控硬件设计。重点阐述了采用双IMU冗余设计、高精度气压计、多路独立电源管理以及丰富接口(如CAN总线)的考量,旨在为穿越机、科研无人机等平台提供强大、可靠的飞行控制解决方案。

weixin_28787801的博客 197

android 单独编译lk,1. 快速编译lk、kernel、vendor命令

kk:全编:./m v28d_v2.1_72kk_qhd_k31_b1b5 eng单编内核./mk kst72_cwet_kk r k bootimage零、命令解释:make -j8// 八个线程 - 根据cpu几核几线程make pl// 编译preloadermake lk// 编译lkmake kernel// 编译kernelmake bootimage// 打包boot.img(包含k...

weixin_36326243的博客 4260

电源完整性之仿真设计原理

电源完整性(Power Integrity),简称为PI,也就是大家平常听说的PI。PCB板上的电源设计也是非常重要的,不当的设计也会引起很重要的影响。所以电源完整性PI和信号完整性SI,是我们互连设计人员应该同等重视的问题。今天整理本人接触的电源完整性PI的一些原理,从不的角度去看PI,会有不同的理解,下面开始喽!!! 提到互连的电源设计,可能首先想到的电源分配网络(Power Distribution Nets),因为互连电源会有许多种,直流DC和交流AC,还有不同的电压调节模块(VRM)与不同的负载端

刘小同学的博客 7369

第1章:Zephyr 开发环境搭建与 Hello World

📝【摘要】本文是Zephyr RTOS开发入门指南的第一章,详细介绍了从环境搭建到首个应用运行的完整流程。主要内容包括:1️⃣ Zephyr项目结构解析与west工具链部署;2️⃣ 开发环境配置(Linux/WSL)及SDK安装;3️⃣ 两种实践路径——官方HelloWorld样例与自定义应用开发;4️⃣ 实际硬件部署方法(nRF/STM32)及常用west命令速查;5️⃣ 典型问题解决方案。通过qemu_x86模拟器演示了基础打印功能实现,为后续深度开发奠定基础。

hemoparrot的专栏 1360

Android系统开发(六):从Linux到Android:模块化开发,GKI内核的硬核科普

它的目标是通过统一内核架构,减少Android设备的碎片化,提升内核的可维护性和兼容性。从触摸屏到GPU再到音频驱动,每一步都结合了实际的开发需求,提供了完整的代码实现和验证方法。以下是三个基于GKI与KMI的实践案例,涵盖触摸屏驱动、GPU模块和音频驱动的开发与优化。它提供了标准化的接口,所有硬件相关功能都由供应商模块实现,而GKI则负责处理更高层次的通用逻辑。为一款基于I2C通信的触摸屏硬件开发驱动模块,并通过KMI接口适配GKI内核,实现触摸事件的捕获与传递。,还显著降低了厂商的研发成本。

刘 争 5856

【kafka】控制台默认不能发送大数据 4096 4095 4129

1.概述 因为某些原因,需要做一个测试,然后我想往topic中,发送一条消息,然后再消费它。但是消息有点大,一条消息是36K. 消费者 [root@1 kafka]# bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic xxx.devicealarm | grep 网络攻击 生产者,生产者发送了一个消息消息是一个json,json中有这个数据特征 网络攻击 [root@1 kafka]# bin/kafka-console-p

九师兄 586

Android GKI 2.0

Google 定义 KMI 接口把 GKI 以外的其他 module(包括 kernel 原生 module 和 vendor 自定义 module)以 ko 等形式全部分离到 GKI 以外,模块和内核可以独立更新,真正做到了 kernel core 和 driver module 的去耦合化,大幅降低了更新 kernel core 和 driver 的 efforct,同时也会大幅降低未来 SOC/OEM 升级 kernel 大版本时的工作量。选择每月发布候选后,**新的更改将不会被接受到该月的发布中。

笔记 3443

硬件基础知识-电机知识

步进电机存在空载启动频率,所以步进电机可以低速正常运转,但若高于一定速度时就无法启动,并伴有尖锐的啸叫声;在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数。给电机两根线供电,电机就可以旋转,给正电压,电机正转,给相反电压,电机反转;电压越大,电机转得越快,电压越小,转速也变小。是一种直流电机,有刷电机的定子上安装有固定的主磁极和电刷,转子上安装有电枢绕组和换向器。控制器:使用专用的电子控制器来监测和控制电机的转速、电流和方向。线圈电流方向的交替变化是随电机转动的换相器和电刷来完成的。

weixin_46969363的博客 2294

零基础基于U-Net网络实战眼底图像血管提取

文章目录1 前言2 血管提取任务概述3 U-Net架构简介4 眼底图像血管分割代码5 结果评估可视化(ROC曲线)6 改进U-Net网络完成眼底图像血管提取任务思路 1 前言 本文基于U-Net架构完成了视网膜血管的提取任务,基于Keras框架更简单的实现分割,网络、工具类、训练和预测的代码一目了然

NJU phd 在读。 5201

万字解析Hungtask原理及分析(上)

Linux系统在运行过程中,可能发生各种各样的卡死情况。有的表现为某个或某些CPU无法调度其他进程或无法响应中断,如正在CPU上运行的进程禁止了抢占或禁止了本地中断后,但其需要的资源一直无法获得(如发生了死锁等情况),而一直占据着CPU;

youzhangjing_的博客 789

AgentScope 实战训练营-构建元规划智能体(Meta Planner Agent)—— 从 0 到 1 完整实现

本文介绍了基于AgentScope框架开发的元规划智能体(Meta Planner Agent)系统。该系统通过任务拆解和子代理编排机制,实现复杂任务的自动化处理。核心架构分为用户层、规划器层和子代理层,其中规划器作为"项目经理"负责任务分解、创建子代理并协调执行流程。关键技术包括AgentScope多智能体框架、DashScope大语言模型、PlanNotebook计划管理工具等。

program哲学 358

Linux2.6.38内核启动流程分析

Linux 启动的第一阶段 Uboot最后带着三个参数跳转到内核入口这三个参数分别是: r0 = 0, r1 = machine type number discovered in (3) above. r2 = physical address of tagged list in system RAM. Linux运行的第一个文件是 arch/arm/boot/compress

玩意儿的专栏 1026

如何在 UniApp 中接入讯飞语音听写功能 文末附vue3+vue2完整代码

在开发过程中,我遇到了讯飞接口返回空数据的问题。通过仔细检查传送的每一帧数据,我发现问题出在第一帧的配置信息以及 Base64 数据的切片。确保每一帧的数据正确且符合接口要求,问题就能够得到解决。希望这个过程能帮助你在项目中顺利对接讯飞语音识别。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 995

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android Kernel 编译:Bazel 编译 GKI 内核

Bazel 是 Google 开源的​​快速、可靠、可扩展的构建系统​​,最初由 Google 内部使用(名为 Blaze),后于2015年开源。它专门设计用于解决大规模代码库的构建问题,支持多种语言(Java、C++、Go、Python、Android、iOS等)和平台。

weixin_48728558的博客 1445

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LWN:让vma的匿名页不再匿名!

关注了就能看到更多这么棒的文章哦~Not-so-anonymous virtual memory areasBy Jonathan CorbetSeptember 3, 2021DeepL...

Linux News搬运工 951

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

基于高通SM6225平台GKI 2.0 小结

第一个GKI 2.0的项目已经完结,做一些总结。GKI 1.0 的时候,我们添加的设备驱动还是编译到boot.img中,在做XTS测试时刷google的boot.img.GKI 2.0 在高通平台无论userdebug版本还是user版本boot.img都为google的boot.img,除了google的东西,任何第3方的驱动都以ko的形式存在。

wn541200的博客 9943

android 制作自己的vendor

customize/customer_cfg/sp6820a/res/androidboard.mk会被拷贝到 目录 /vendor/sprd/hsdroid/ Android源码使用一个可定制的编译系统来生成 特定的,针对自己硬件平台的Android系统,比如不使用缺省的out/target/prodect/generic目录,本文档简单介绍了这个编译系统,并做一个针对自己硬件平台的An

Nio96的专栏 2208

安卓内核开发实战:手把手教你用vendor hook实现客制化功能(附完整代码示例)

本文深入解析安卓内核开发中的vendor hook机制,提供实战指南。通过手把手教学和完整代码示例,详细阐述如何在不修改内核源码的前提下,利用vendor hook实现客制化功能,有效平衡了内核稳定性与开发灵活性,是安卓底层开发者的实用参考。

408
上一篇: LWN:Lua in the kernel!
下一篇: LWN:GCC也支持BPF了!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值