【问题标题】:Manually building a Kernel source from Yocto build从 Yocto build 手动构建内核源
【发布时间】:2018-05-05 21:28:45
【问题描述】:

我有一个为 i.mx6 构建的 Yocto,我想修改它的内核。我想如果我在 Yocto 项目之外复制内核源代码并在不处理补丁的情况下进行修改,我可以显着加快速度。但问题是,我必须使用的内核源已经打了补丁,我想从那里获取并继续工作。我将处理已经打过补丁的源文件并重新安排它们是一个痛苦的过程。

首先,我的补丁工作正常,我可以使用bitbake fsl-image-multimedia-full 命令获得工作图像。我要使用的内核源是在此过程之后创建的。

我尝试在..../tmp/work-shared/imx6qsabresd/kernel-source 下复制源代码。尽管make zImagemake modules 顺利完成,但由于dtsi 文件中的错误(无法解析...),手动构建并未成功。当然,我检查了文件,没有语法错误。

另外,我检查了我复制的内核源文件,似乎补丁成功实现了。

我的补丁做错了吗?通过我的手动构建例程,我可以毫无错误地构建未打补丁的内核源代码。我确信这里有经验丰富的 Yocto 用户,他们有自己的解决方法来缩短这个过程。因此,任何帮助表示赞赏。提前致谢。

【问题讨论】:

    标签: linux linux-kernel yocto


    【解决方案1】:

    你也可以编辑tmp/work-shared/<machine>/kernel-source中的文件,然后用bitbake -C compile virtual/kernel编译修改后的内核

    【讨论】:

      【解决方案2】:

      我最喜欢在 Yocto 项目中进行内核开发的方法是创建一个 SDK 并在 Yocto 系统之外构建内核。这允许更快速的构建,因为make 只会构建新的更改,而 Yocto 中的内核构建总是从头开始。

      这是我在 Yocto 系统之外编译 Linux 内核的一些笔记。确切的路径将取决于您的确切配置和软件版本。在你的情况下,IMAGE_NAME=fsl-image-multimedia-full

      1. 运行bitbake -c populate_sdk ${IMAGE_NAME}。你会得到一个 自解压和自安装 shell 脚本。

      2. 运行 shell 脚本(对我来说是 tmp/deploy/sdk/${NAME}-glibc-i686-${IMAGE_NAME}-cortexa9hf-neon-toolchain-1.0.0.sh), 并同意默认的 SDK 位置(对我来说是 usr/local/oecore-i686)。

      3. 获取安装脚本生成的脚本。我用 按照帮助脚本加载 SDK,所以我不必保留 跟踪所涉及的路径。您每次都需要采购这个 你想使用 SDK。

      enable_sdk.sh

      #!/bin/bash
      if [[ "$0" = "$BASH_SOURCE" ]]
      then
          echo "Error: you must source this script."
          exit 1
      fi
      source /usr/local/oecore-i686/environment-setup-corei7-32-${NAME}-linux
      source /usr/local/oecore-i686/environment-setup-cortexa9hf-neon-${NAME}-linux-gnueabi
      
      1. defconfig 文件从 Yocto 目录复制到内核 目录(在 Yocto 树之外的某处签出)为 .config

      2. 在您的内核目录中运行make oldconfig,以便Linux 内核构建系统采用现有的.config

        注意:您可能需要回答有关配置选项的问题 未在.config 文件中设置。

        注意:启用 SDK 时,运行make menuconfig 会失败, 因为 SDK 没有设置 ncurses 库 正确。对于此命令,请在尚未安装的新终端中运行它 启用 SDK 以便它使用您的本地 ncurses-dev 包 已安装。

      3. 运行make -jN 构建内核。

      4. 要运行新内核,请将zImage${NAME}.dtb 文件复制到 您的 NFS/TFTP 共享或引导设备。我使用另一个脚本来加速 加快进程。

      update_kernel.sh

      #!/bin/bash
      set -x
      sudo cp /path-to-linux-source/arch/arm/boot/dts/${NAME}.dtb /srv/nfs/${DEVICE}/boot/
      sudo cp /path-to-linux-source/arch/arm/boot/zImage /srv/nfs/${DEVICE}/boot/
      set +x
      
      1. 您还可以在 .bb 中将 Yocto 指向您的本地 Linux 存储库 文件。这对于确保您的内核更改仍然有用 在 Yocto 中正确构建。

        SRC_URI = "git:///path-to-linux-source/.git/;branch=${KBRANCH};protocol=file"

      更新:一年多后,我意识到我完全错过了有关损坏补丁的问题。如果没有更多信息,我无法确定将内核源代码从 Yocto 复制到外部构建时出了什么问题。我建议为内核打开一个 Bitbake devshell 并在手动应用补丁后与外部目录进行比较以查看问题所在,或者只是将 devshell 内部的源代码复制到您的外部目录。 https://www.yoctoproject.org/docs/1.4.2/dev-manual/dev-manual.html#platdev-appdev-devshell

      当调试某些命令甚至只是编辑包时,devshell 可能是一个有用的工具。 当您调用 devshell 时,源文件将被提取到您的工作目录中并应用补丁

      【讨论】:

        【解决方案3】:

        由于无法解析,看来patch有问题。你如何修补设备树?您是否在 .bb 文件中对其进行修补?

        如果是这样,请检查您的补丁是否存在语法错误,很容易忽略设备树中的语法错误。您可以删除补丁并从bitbake -c devshell <kernel-name>手动执行

        如果没有,请尝试在那里执行并再次检查。如果其中任何一个对您有帮助,请分享结果。

        【讨论】:

        • 我已经多次检查了所谓的错误 dts 文件。如果补丁有问题,bitbake fsl-image-multimedia-full 不应该返回错误吗?过程成功完成,当我检查系统上的图像时,我看到补丁已成功应用。顺便说一句,我的自定义板有一个层,我使用 .bbappend 文件进行修补。
        猜你喜欢
        • 2021-10-20
        • 1970-01-01
        • 2017-06-02
        • 2012-12-11
        • 1970-01-01
        • 2016-07-03
        • 2015-01-01
        • 2021-12-13
        • 2018-04-11
        相关资源
        最近更新 更多