Linux Kernel ccflags/Android 12 GKI

2023-05-16

ccflags

Makefile笔记
外部模块头文件的检索:当编译的目标模块依赖多个头文件时,kbuild对头文件的搜索位置有这样的规定:

(1) 直接放置在 Makefile 同在的目录下,在编译时当前目录会被添加到头文件搜索目录。
(2) 放置在系统目录,这个系统目录是源代码目录中的 include,注意是源代码目录而不是系统目录的。
(3) 与通用的 Makefile 一样,使用 -I$ (DIR) 来指定,不同的是,编译选项的变量固定为 ccflag,当前 Makefile 是镶嵌到 Kbuild 系统中,ccflags-y += -I$(DIR)/include,kbuild就会将 $(DIR)/include 目录添加到编译时的头文件搜索目录中。一般使用"+="来进行追加赋值,各个Makefile中加的只影响自己的编译。

以源码中linux-source-4.15.0为例

模块A:
~/linux-source-4.15.0/linux-source-4.15.0/drivers/staging/most/hdm-usb/
hdm_usb.c Kconfig Makefile

模块B:
~linux-source-4.15.0/linux-source-4.15.0/drivers/staging/most/mostcore/
core.c  Kconfig  Makefile  mostcore.h

若模块A需要调用模块B中的函数,则需要在模块A中的Makefile使用到ccflag-y,在头文件中引用模块B函数定义的头文件

模块A:
Makefile
obj-$(CONFIG_HDM_USB) += hdm_usb.o

ccflags-y += -Idrivers/staging/most/mostcore/
ccflags-y += -Idrivers/staging/most/aim-network/

hdm_usb.c
#include "mostcore.h"

static void wq_clear_halt(struct work_struct *wq_obj){
    ...
	most_stop_enqueue(&mdev->iface, channel);
	most_resume_enqueue(&mdev->iface, channel);

模块B:
mostcore.h
void most_stop_enqueue(struct most_interface *iface, int channel_idx);
void most_resume_enqueue(struct most_interface *iface, int channel_idx);

compile

如果ccflag的路径没有写对的话,去引用头文件则会报错,

fatal error: 'cam_sensor_io.h' file not found

如果显示如下ld 链接的时候未定义的符号引用问题

ld.lld: error: undefined symbol: cam_sensor_power_up

  因为在之前的高通平台上使用ccflags没有类似问题,起初是以为ccflags在内核版本变更上可能会有新特性,但没有找到类似的答案,接着就看了qcom camera kernel的变化,发现Android12下Makefile将camera编译成了camera.ko,
  尝试删除out/target/product/xxx/obj/kernel/msm-5.4/techpack/camera/drivers之前编译生成的产物,修改代码将camera目录下都使能obj-y编译后,则编译调用目前都还正常,obj-y生成built-in.o,Kbuild编译所有的obj-y文件,并调用”$(LD) -r”把所有这些文件合并到built-in.o文件。这个built-in.o会被上一级目录的Makefile使用,最终链接到vmlinux中,所以之前模块化后是没有链接到一起,所以导致报了ld的错误。看到都是ko的模块间调用可以使用EXPORT_SYMBOL 非static函数定义 + extern的方式,这个后续有时间我在尝试一下,需要注意模块间的加载顺序。

export CONFIG_SPECTRA_CAMERA=y

ifeq ($(CONFIG_SPECTRA_CAMERA),m)
$(info "SPECTRA CAMERA IS BUILT AS DLKM")
BOARD_VENDOR_KERNEL_MODULES +=  $(KERNEL_MODULES_OUT)/camera.ko
endif

那为什么Android12上会出现camera.ko这个的变化呢,主要是GKI的引入

后续这里有尝试了第二种方法,将我们的驱动以ko模块的方式编译,通过EXPORT_SYMBOL的方式传递接口

techpack/camera/drivers/cam_sensor_module/cam_sensor/cam_sensor_core.c
EXPORT_SYMBOL(cam_sensor_power_up);

drivers/ourdriver/ourdrvier.h
extern int cam_sensor_power_up(struct cam_sensor_ctrl_t *s_ctrl);

Makefile 需要注意多个.o编译成一个模块
obj-m += xxx.o
xxx-objs := xxx1.o xxx2.o  or  xxx-y := xxx1.o xxx2.o

GKI

通用内核映像
  Android内核中运行的代码中有多达 50% 是树外代码(并非来自上游 Linux 和 AOSP 通用内核),供应商通过修改内核源代码并添加设备驱动程序,添加了对 SoC 和外围设备的支持。几乎所有设备都具有自定义内核。这就导致了内核碎片化问题。
  通用内核映像 (GKI) 项目通过统一核心内核并将 SoC 和板级支持从核心内核移至可加载模块中,解决了内核碎片化问题。GKI 内核为内核模块提供了稳定的内核模块接口 (KMI),因此模块和内核可以独立进行更新。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux Kernel ccflags/Android 12 GKI 的相关文章

  • C 标准库函数与系统调用。哪个是“open()”?

    I know fopen 在C标准库中 所以我绝对可以调用fopen C 程序中的函数 我感到困惑的是为什么我可以打电话给open 功能也一样 open 应该是系统调用 所以它不是标准库中的C函数 因为我能够成功地调用open 函数 我调用
  • ImageView Android 内存

    我原来的后续question https stackoverflow com questions 5339883 android app ram usage 有没有一种方法可以在 Android 应用程序中使用 ImageViews 而不使
  • 在 Android 中从互联网链接获取数据

    我正在制作一个带有 URL 的应用程序 asp 扩展名 我们向其传递所需的参数并使用 POST 方法获取一些字符串结果 关于如何实现这一目标有什么建议吗 UPDATED 实际上我有一个 net 链接 它接受一些 POST 参数并给我一个结果
  • Android - 启用和禁用蓝牙 - SDK 3 (OS 1.5) - 以编程方式?

    我编写了代码来以编程方式启用和禁用各种功能 例如 Wifi 振铃模式 飞行模式 您将在电源切换小部件中看到的所有内容 我还没有找到如何做的一个是蓝牙 看来在 SDK level 3 OS 1 5 中没有漂亮的蓝牙管理器类 有没有人指出关于启
  • android新手需要了解“?android:attr/actionBarSize”

    我正在经历拉尔斯 沃格尔的教程 http www vogella com articles AndroidFragments article html在使用 Fragments 时 我遇到了以下代码 android layout margi
  • 垂直翻转 Android Canvas

    有没有一种简单的方法可以在 Android 中翻转画布 我似乎找不到任何可以让我垂直翻转它的东西 这样 y 轴上的零就是手机屏幕的底部而不是顶部 如果解决方案不是特别快也没关系 因为我没有对画布进行任何计算密集的操作 提前致谢 Try ca
  • Android 和 iOS 中的应用程序文件大小差异

    通过使用两个应用程序分发服务 Android 市场和 Apple 应用程序商店 我发现了一个谜团 Apple 应用程序的文件大小通常大于 Android 应用程序 我似乎找不到任何对这些差异的解释 而且这似乎是一个未触及的主题 我尝试过分配
  • Android 上 Java 库中的代码出现 NoClassDefFoundError

    我的用户经常遇到错误 应用程序在启动期间崩溃 当应该加载 MainActivity 时 VM 显然找不到该类 我不明白为什么 该应用程序的架构是 我的免费版和专业版都使用一个通用项目 不知道是否相关 请参阅下面的堆栈跟踪 有什么想法吗 ja
  • 带有内容提供商的小部件;无法使用ReadPermission?

    所以我刚刚为我的应用程序实现了一个小部件 它通过我的数据库从数据库获取数据ContentProvider 我在清单中定义了自己的读 写权限 声明我使用它们 似乎没有什么区别 并在内容提供程序中要求它们
  • gnutls_handshake() 失败:握手失败 GIT

    一切都工作正常 但突然我收到错误 致命 无法访问 https 电子邮件受保护 cdn cgi l email protection name repo name git gnutls handshake 失败 握手失败 我在我的计算机和 E
  • 无法在 Android 中使用自定义数组适配器进行搜索?

    我无法从以下位置搜索listview 我尝试了各种方法 但它对我不起作用 没有错误 我有其他方式进行搜索 但我想让这种方式成为可能 这是代码 public class MainActivity extends Activity implem
  • 如何更改蜂窝中儿童偏好屏幕的背景颜色

    过去几天我一直在寻找解决方案 但找不到 我需要更改右窗格的背景颜色 我知道如何更改左父首选项的颜色 我在清单文件中创建了一个新主题
  • 如何从Android webview下载文件?

    我下面的代码可以很好地加载 url 页面 并且在搜索歌曲后 当我单击下载链接时 它崩溃了 关于如何让下载管理器与网络视图一起工作的教程并不多 我究竟做错了什么 import java io File import android app A
  • 我可以告诉 Linux 不要交换特定进程的内存吗?

    有没有办法告诉 Linux 它不应该将特定进程的内存交换到磁盘 它是一个 Java 应用程序 所以理想情况下我希望有一种方法可以从命令行执行此操作 我知道您可以将全局交换性设置为 0 但这明智吗 您可以通过以下方式执行此操作姆洛克尔 2 h
  • Android RxJava 2 JUnit 测试 - android.os.Looper 中的 getMainLooper 未模拟 RuntimeException

    我在尝试为正在使用的演示者运行 JUnit 测试时遇到 RuntimeExceptionobserveOn AndroidSchedulers mainThread 由于它们是纯 JUnit 测试而不是 Android 仪器测试 因此它们无
  • 安卓独立包

    我有一个很大的 UI 大约 20 25 个屏幕 我应该如何组织我的代码 我应该按功能分成不同的包吗 我是否应该为所有 UI 类创建一个包 然后创建子包进行组织 或者我不应该创建单独的包并组织到文件夹中 任何帮助将不胜感激 当您创建文件夹时
  • 如何在没有 OpenCv Manager 的情况下运行 OpenCV 代码

    我正在使用 OpenCV4Android 版本 2 4 10 并在 Samsung Galayx GT I9300 上测试我的代码 我遇到的问题是 我必须从 Play 商店下载 Opencv Manager 以便我的 opencv 代码运行
  • Mongo:无法连接到服务器 127.0.0.1:27017 位于 src/mongo/shell/mongo.js:145

    当我尝试在 ubuntu 中的 shell 中运行 mongo 或打开 rockmongo 时 我看到以下错误 couldn t connect to server 127 0 0 1 27017 at src mongo shell mo
  • 如何在不下载子项的情况下从 Firebase 获取子项密钥?

    我有一个 Firebase 数据库 其中的节点 items 有很多子项 我想导入子项键的列表 由于每个子项都包含相当多我对此不感兴趣的数据 因此我想仅下载子项密钥 以最大程度地减少传输的数据量 为了便于说明 假设我有以下数据结构 然后我想获
  • 如何在 Android 的应用程序中使用 LDAP 身份验证?

    我想在我们的应用程序中添加 LDAP 身份验证 我在 Github 上搜索并找到了两个应用程序 但它们无法连接到服务器 通过ldap连接服务器的必要条件是什么 查看 UnboundID SDK 他们有一个适用于 Android 的套件 该应

随机推荐