Andrew Geissler | f034379 | 2020-11-18 10:42:21 -0600 | [diff] [blame] | 1 | .. SPDX-License-Identifier: CC-BY-SA-2.0-UK |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 2 | |
| 3 | ************ |
| 4 | Introduction |
| 5 | ************ |
| 6 | |
| 7 | .. _kernel-dev-overview: |
| 8 | |
| 9 | Overview |
| 10 | ======== |
| 11 | |
| 12 | Regardless of how you intend to make use of the Yocto Project, chances |
| 13 | are you will work with the Linux kernel. This manual describes how to |
| 14 | set up your build host to support kernel development, introduces the |
| 15 | kernel development process, provides background information on the Yocto |
| 16 | Linux kernel :term:`Metadata`, describes |
| 17 | common tasks you can perform using the kernel tools, shows you how to |
| 18 | use the kernel Metadata needed to work with the kernel inside the Yocto |
| 19 | Project, and provides insight into how the Yocto Project team develops |
| 20 | and maintains Yocto Linux kernel Git repositories and Metadata. |
| 21 | |
| 22 | Each Yocto Project release has a set of Yocto Linux kernel recipes, |
| 23 | whose Git repositories you can view in the Yocto |
| 24 | :yocto_git:`Source Repositories <>` under the "Yocto Linux Kernel" |
| 25 | heading. New recipes for the release track the latest Linux kernel |
| 26 | upstream developments from http://www.kernel.org> and introduce |
| 27 | newly-supported platforms. Previous recipes in the release are refreshed |
| 28 | and supported for at least one additional Yocto Project release. As they |
| 29 | align, these previous releases are updated to include the latest from |
| 30 | the Long Term Support Initiative (LTSI) project. You can learn more |
| 31 | about Yocto Linux kernels and LTSI in the ":ref:`Yocto Project Kernel |
| 32 | Development and Maintenance <kernel-big-picture>`" section. |
| 33 | |
| 34 | Also included is a Yocto Linux kernel development recipe |
| 35 | (``linux-yocto-dev.bb``) should you want to work with the very latest in |
| 36 | upstream Yocto Linux kernel development and kernel Metadata development. |
| 37 | |
| 38 | .. note:: |
| 39 | |
| 40 | For more on Yocto Linux kernels, see the " |
| 41 | Yocto Project Kernel Development and Maintenance |
| 42 | section. |
| 43 | |
| 44 | The Yocto Project also provides a powerful set of kernel tools for |
| 45 | managing Yocto Linux kernel sources and configuration data. You can use |
| 46 | these tools to make a single configuration change, apply multiple |
| 47 | patches, or work with your own kernel sources. |
| 48 | |
| 49 | In particular, the kernel tools allow you to generate configuration |
| 50 | fragments that specify only what you must, and nothing more. |
| 51 | Configuration fragments only need to contain the highest level visible |
| 52 | ``CONFIG`` options as presented by the Yocto Linux kernel ``menuconfig`` |
| 53 | system. Contrast this against a complete Yocto Linux kernel ``.config`` |
| 54 | file, which includes all the automatically selected ``CONFIG`` options. |
| 55 | This efficiency reduces your maintenance effort and allows you to |
| 56 | further separate your configuration in ways that make sense for your |
| 57 | project. A common split separates policy and hardware. For example, all |
| 58 | your kernels might support the ``proc`` and ``sys`` filesystems, but |
| 59 | only specific boards require sound, USB, or specific drivers. Specifying |
| 60 | these configurations individually allows you to aggregate them together |
| 61 | as needed, but maintains them in only one place. Similar logic applies |
| 62 | to separating source changes. |
| 63 | |
| 64 | If you do not maintain your own kernel sources and need to make only |
| 65 | minimal changes to the sources, the released recipes provide a vetted |
| 66 | base upon which to layer your changes. Doing so allows you to benefit |
| 67 | from the continual kernel integration and testing performed during |
| 68 | development of the Yocto Project. |
| 69 | |
| 70 | If, instead, you have a very specific Linux kernel source tree and are |
| 71 | unable to align with one of the official Yocto Linux kernel recipes, an |
| 72 | alternative exists by which you can use the Yocto Project Linux kernel |
| 73 | tools with your own kernel sources. |
| 74 | |
| 75 | The remainder of this manual provides instructions for completing |
| 76 | specific Linux kernel development tasks. These instructions assume you |
| 77 | are comfortable working with |
| 78 | `BitBake <http://openembedded.org/wiki/Bitbake>`__ recipes and basic |
| 79 | open-source development tools. Understanding these concepts will |
| 80 | facilitate the process of working with the kernel recipes. If you find |
| 81 | you need some additional background, please be sure to review and |
| 82 | understand the following documentation: |
| 83 | |
| 84 | - :doc:`../brief-yoctoprojectqs/brief-yoctoprojectqs` document. |
| 85 | |
| 86 | - :doc:`../overview-manual/overview-manual`. |
| 87 | |
| 88 | - :ref:`devtool |
| 89 | workflow <sdk-manual/sdk-extensible:using \`\`devtool\`\` in your sdk workflow>` |
| 90 | as described in the Yocto Project Application Development and the |
| 91 | Extensible Software Development Kit (eSDK) manual. |
| 92 | |
| 93 | - The ":ref:`dev-manual/dev-manual-common-tasks:understanding and creating layers`" |
| 94 | section in the Yocto Project Development Tasks Manual. |
| 95 | |
| 96 | - The "`Kernel Modification |
| 97 | Workflow <#kernel-modification-workflow>`__" section. |
| 98 | |
| 99 | Kernel Modification Workflow |
| 100 | ============================ |
| 101 | |
| 102 | Kernel modification involves changing the Yocto Project kernel, which |
| 103 | could involve changing configuration options as well as adding new |
| 104 | kernel recipes. Configuration changes can be added in the form of |
| 105 | configuration fragments, while recipe modification comes through the |
| 106 | kernel's ``recipes-kernel`` area in a kernel layer you create. |
| 107 | |
| 108 | This section presents a high-level overview of the Yocto Project kernel |
| 109 | modification workflow. The illustration and accompanying list provide |
| 110 | general information and references for further information. |
| 111 | |
| 112 | .. image:: figures/kernel-dev-flow.png |
| 113 | :align: center |
| 114 | |
| 115 | 1. *Set up Your Host Development System to Support Development Using the |
| 116 | Yocto Project*: See the ":doc:`../dev-manual/dev-manual-start`" section in |
| 117 | the Yocto Project Development Tasks Manual for options on how to get |
| 118 | a build host ready to use the Yocto Project. |
| 119 | |
| 120 | 2. *Set Up Your Host Development System for Kernel Development:* It is |
| 121 | recommended that you use ``devtool`` and an extensible SDK for kernel |
| 122 | development. Alternatively, you can use traditional kernel |
| 123 | development methods with the Yocto Project. Either way, there are |
| 124 | steps you need to take to get the development environment ready. |
| 125 | |
| 126 | Using ``devtool`` and the eSDK requires that you have a clean build |
| 127 | of the image and that you are set up with the appropriate eSDK. For |
| 128 | more information, see the |
| 129 | ":ref:`kernel-dev/kernel-dev-common:getting ready to develop using \`\`devtool\`\``" |
| 130 | section. |
| 131 | |
| 132 | Using traditional kernel development requires that you have the |
| 133 | kernel source available in an isolated local Git repository. For more |
| 134 | information, see the |
| 135 | ":ref:`kernel-dev/kernel-dev-common:getting ready for traditional kernel development`" |
| 136 | section. |
| 137 | |
| 138 | 3. *Make Changes to the Kernel Source Code if applicable:* Modifying the |
| 139 | kernel does not always mean directly changing source files. However, |
| 140 | if you have to do this, you make the changes to the files in the |
| 141 | eSDK's Build Directory if you are using ``devtool``. For more |
| 142 | information, see the |
| 143 | ":ref:`kernel-dev/kernel-dev-common:using \`\`devtool\`\` to patch the kernel`" |
| 144 | section. |
| 145 | |
| 146 | If you are using traditional kernel development, you edit the source |
| 147 | files in the kernel's local Git repository. For more information, see the |
| 148 | ":ref:`kernel-dev/kernel-dev-common:using traditional kernel development to patch the kernel`" |
| 149 | section. |
| 150 | |
| 151 | 4. *Make Kernel Configuration Changes if Applicable:* If your situation |
| 152 | calls for changing the kernel's configuration, you can use |
| 153 | :ref:`menuconfig <kernel-dev/kernel-dev-common:using \`\`menuconfig\`\`>`, |
| 154 | which allows you to |
| 155 | interactively develop and test the configuration changes you are |
| 156 | making to the kernel. Saving changes you make with ``menuconfig`` |
| 157 | updates the kernel's ``.config`` file. |
| 158 | |
| 159 | .. note:: |
| 160 | |
| 161 | Try to resist the temptation to directly edit an existing |
| 162 | .config |
| 163 | file, which is found in the Build Directory among the source code |
| 164 | used for the build. Doing so, can produce unexpected results when |
| 165 | the OpenEmbedded build system regenerates the configuration file. |
| 166 | |
| 167 | Once you are satisfied with the configuration changes made using |
| 168 | ``menuconfig`` and you have saved them, you can directly compare the |
| 169 | resulting ``.config`` file against an existing original and gather |
| 170 | those changes into a `configuration fragment |
| 171 | file <#creating-config-fragments>`__ to be referenced from within the |
| 172 | kernel's ``.bbappend`` file. |
| 173 | |
| 174 | Additionally, if you are working in a BSP layer and need to modify |
| 175 | the BSP's kernel's configuration, you can use ``menuconfig``. |
| 176 | |
| 177 | 5. *Rebuild the Kernel Image With Your Changes:* Rebuilding the kernel |
| 178 | image applies your changes. Depending on your target hardware, you |
| 179 | can verify your changes on actual hardware or perhaps QEMU. |
| 180 | |
| 181 | The remainder of this developer's guide covers common tasks typically |
| 182 | used during kernel development, advanced Metadata usage, and Yocto Linux |
| 183 | kernel maintenance concepts. |