Android Common Kernel(ACK)

Android Common Kernel(ACK)
Photo by Gabriel Heinzer / Unsplash

Android Kernel基于Linux Long Term Supported(LTS) kernel,并在此基础上添加了很多Android定制的Patch,形成了Android Common Kernels(ACKs)。

5.10及以上版本的ACK也被称为Generic kernel images(GKI) kernel。

GKI内核聚合了硬件无关的通用核心代码以及GKI模块,与Vendor模块分隔开来。

GKI为Vendor模块提供的接口,借助Kernel Module Interface(KMI)完成,KMI包含了一系列Vendor模块所需的函数和全局数据符号组成。

GKI kernel and vendor module architecture

KMI的作用

ABI工具:https://android.googlesource.com/kernel/build/+/refs/heads/main-kernel/abi/

一直以来,Linux Kernel对主线内核维护一套稳定内核ABI的想法不屑一顾,因为面临不同的工具链、内核配置和快速发展的Linux主线内核,要在主线中保持稳定的ABI是非常困难的。

而Google为了解决Kernel碎片化引起的兼容性与安全性问题,就必须在GKI的基础之上,提供一个稳定的KMI给芯片、供应商(Vendor)开发自己的内核模块,提供独有的系统能力。

注意:KMI是ABI的一个子集,KMI定义的符号,用于Vendor内核模块的开发。此外ABI符号列表最终被编译到二进制stgKMI符号以文本形式放到文件中

Google通过以下方式来提供稳定的KMI:

  • 内核使用通用的Config(gki_defconfig)来进行GKI内核构建,这样核心内核函数以及全局数据结构的符号数量将会固定下来。
  • KMI仅在同一LTS内核版本以及同一Android版本保持稳定。一旦Android版本或LTS内核版本有一个发生变化,都不保证KMI稳定性。
  • AOSP自身提供特定版本的Clang工具链用于构建内核和内核模块。
  • 强制Vendor模块必须使用KMI符号列表中的符号开发内核模块,如果发现使用非KMI符号,将会在运行时加载失败。
  • 一旦KMI分支冻结,修改内核时无法再修改KMI符号列表中的符号定义,一旦改变将构建失败,并进行提示。

如何扩展KMI符号

https://source.android.com/docs/core/architecture/kernel/howto-symbol-lists
  1. 修改GKI内核功能
    1. 在KMI冻结之前,可以修改内核函数、数据结构,并通过Update the reference ABI representation流程更新ABI和KMI符号列表。修改需要提交给ACK,审批通过后生效。
    2. 在KMI冻结之后,依旧可以修改内核函数、数据结构,但是不能影响之前冻结的ABI。修改需要提交给ACK,审批通过后生效。
  2. 在GKI添加桩函数。修改需要提交给ACK,审批通过后生效。
  3. 在KMI增加已有的符号。修改需要提交给ACK,审批通过后生效。

如何确保Vendor模块和KMI、GKI兼容

使用目标ACK代码来开发内核或模块,将内核、ABI、KMI改动同步到ACK,并将开发完成的代码迁移回Byte的代码库。(如果项目Vendor部分已经和ACK进行或者有计划进行同步,可以直接用项目Vendor代码开发内核模块和内核功能)

Read more

香港银行开户指南

香港银行开户指南

注意:本文所有内容,都是需要前往香港的情况下才能使用! 本文主要介绍2家实体银行和3家虚拟银行! 实体银行包含: * 中国银行(香港) * 汇丰银行(香港),该银行也被称为“香港上海汇丰银行” 虚拟银行包含: * 众安银行 * 天星银行 * 蚂蚁银行 1、各银行所需资料和办理方式 银行名称 办理方式 所需材料 & 要求 备注 汇丰银行(香港) 提前预约,线下到营业点办理 (如果没预约,只能很早排队取线下号,不一定能取到) 必备证件: 1. 港澳通行证 2. 入境海关小票 3. 身份证 投资证明: 1. 证券App近三月股票交割单 2. 中国结算近三月交割单 3. 银行近三月流水单 4. 支付宝投资流水 资产证明: 1. 银行资产证明 2.

By 夕元
C++协程(Coroutines)

C++协程(Coroutines)

原文链接:https://ovea-y.cn/cpp_coroutine_20/ C++协程(Coroutines) 1. 简单介绍协程 协程可以简单的理解为,它是一个可以随时“中断”,并再次恢复执行的函数。 C++协程框架的特点: * 无栈协程 * 非对称设计(开发者可以自行设计协程调度器,做成对称设计) 2. 协程和函数的区别 函数:函数调用是线性、同步、一次性的执行模式,调用者必须等待被调用方法执行完成后返回。 协程:协程可以异步执行,调用者不需要等待协程完成,可以在协程挂起时继续做其他事情。在执行过程中通过特定的语法(co__yield_和_co__await)暂停执行,并在之后的某个时刻恢复执行。 2.1 普通函数的执行过程 一个普通函数在执行的时候,主要包含两个操作,分别是调用(call)和返回(return)

By 夕元
GitHub Workflows

GitHub Workflows

原文链接:https://ovea-y.cn/github_workflows/ 本文介绍GitHub工作流的创建和作用。 工作流创建方式 在git项目下,创建.github/workflows文件夹,里面编写的任何yml文件都是工作流的一部分。 secrets的创建方式 secrets.GITHUB_TOKEN是GitHub自动创建的,不需要自己创建。 secrets.SERVER_HOST这个的来源,需要在GitHub对应的项目的设置中设置。 readme的构建标签 配置好Branch、Event类型后,把下面这段内容复制到markdown文档里,就会自动显示自动化流程状态了。其实就是一张图片,由GitHub自动生成提供。 一. 自动构建网站并推送到远程服务器 自动构建hugo,并更新远程服务器的静态网站内容。 自动化流程文件 name: Deploy Hugo Site # 当推送到main分支时触发部署流程 on: push: branches: - main

By 夕元
代码版本管理工具(git/gerrit/repo)

代码版本管理工具(git/gerrit/repo)

原文链接:https://ovea-y.cn/code_version_control_tools__git_gerrit_repo/ 一、版本控制工具的历史 1.1 版本控制雏形 在版本控制软件出现之前,就具备diff与patch工具来对源码进行比较和打补丁了,在CVS出来的一段时间里,Linus一直在使用diff与patch工具管理着Linux的代码。diff与patch也是源码版本控制中最基本的概念。 1.1.1 diff —— 用于比较两个文件或目录之间的差异 -u 表示使用 unified 格式 -r 表示比较目录 -N 表示将不存在的文件当作空文件处理,这样新添加的文件也会出现在patch文件中 diff -urN a.c b.c > c.patch 1.1.2 patch —— 用于应用差异修改 通过patch可以将原始文件变成目标文件,

By 夕元