123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420 |
- .. SPDX-License-Identifier: CC-BY-SA-2.0-UK
- ************************
- Advanced Kernel Concepts
- ************************
- Yocto Project Kernel Development and Maintenance
- ================================================
- Kernels available through the Yocto Project (Yocto Linux kernels), like
- other kernels, are based off the Linux kernel releases from
- https://www.kernel.org. At the beginning of a major Linux kernel
- development cycle, the Yocto Project team chooses a Linux kernel based
- on factors such as release timing, the anticipated release timing of
- final upstream ``kernel.org`` versions, and Yocto Project feature
- requirements. Typically, the Linux kernel chosen is in the final stages
- of development by the Linux community. In other words, the Linux kernel
- is in the release candidate or "rc" phase and has yet to reach final
- release. But, by being in the final stages of external development, the
- team knows that the ``kernel.org`` final release will clearly be within
- the early stages of the Yocto Project development window.
- This balance allows the Yocto Project team to deliver the most
- up-to-date Yocto Linux kernel possible, while still ensuring that the
- team has a stable official release for the baseline Linux kernel
- version.
- As implied earlier, the ultimate source for Yocto Linux kernels are
- released kernels from ``kernel.org``. In addition to a foundational
- kernel from ``kernel.org``, the available Yocto Linux kernels contain a
- mix of important new mainline developments, non-mainline developments
- (when no alternative exists), Board Support Package (BSP) developments,
- and custom features. These additions result in a commercially released
- Yocto Project Linux kernel that caters to specific embedded designer
- needs for targeted hardware.
- You can find a web interface to the Yocto Linux kernels in the
- :ref:`overview-manual/development-environment:yocto project source repositories`
- at :yocto_git:`/`. If you look at the interface, you will see to
- the left a grouping of Git repositories titled "Yocto Linux Kernel".
- Within this group, you will find several Linux Yocto kernels developed
- and included with Yocto Project releases:
- - *linux-yocto-4.1:* The stable Yocto Project kernel to use with
- the Yocto Project Release 2.0. This kernel is based on the Linux 4.1
- released kernel.
- - *linux-yocto-4.4:* The stable Yocto Project kernel to use with
- the Yocto Project Release 2.1. This kernel is based on the Linux 4.4
- released kernel.
- - *linux-yocto-4.6:* A temporary kernel that is not tied to any
- Yocto Project release.
- - *linux-yocto-4.8:* The stable yocto Project kernel to use with
- the Yocto Project Release 2.2.
- - *linux-yocto-4.9:* The stable Yocto Project kernel to use with
- the Yocto Project Release 2.3. This kernel is based on the Linux 4.9
- released kernel.
- - *linux-yocto-4.10:* The default stable Yocto Project kernel to
- use with the Yocto Project Release 2.3. This kernel is based on the
- Linux 4.10 released kernel.
- - *linux-yocto-4.12:* The default stable Yocto Project kernel to
- use with the Yocto Project Release 2.4. This kernel is based on the
- Linux 4.12 released kernel.
- - *yocto-kernel-cache:* The ``linux-yocto-cache`` contains patches
- and configurations for the linux-yocto kernel tree. This repository
- is useful when working on the linux-yocto kernel. For more
- information on this "Advanced Kernel Metadata", see the
- ":doc:`/kernel-dev/advanced`" Chapter.
- - *linux-yocto-dev:* A development kernel based on the latest
- upstream release candidate available.
- .. note::
- Long Term Support Initiative (LTSI) for Yocto Linux kernels is as
- follows:
- - For Yocto Project releases 1.7, 1.8, and 2.0, the LTSI kernel is
- ``linux-yocto-3.14``.
- - For Yocto Project releases 2.1, 2.2, and 2.3, the LTSI kernel is
- ``linux-yocto-4.1``.
- - For Yocto Project release 2.4, the LTSI kernel is
- ``linux-yocto-4.9``
- - ``linux-yocto-4.4`` is an LTS kernel.
- Once a Yocto Linux kernel is officially released, the Yocto Project team
- goes into their next development cycle, or upward revision (uprev)
- cycle, while still continuing maintenance on the released kernel. It is
- important to note that the most sustainable and stable way to include
- feature development upstream is through a kernel uprev process.
- Back-porting hundreds of individual fixes and minor features from
- various kernel versions is not sustainable and can easily compromise
- quality.
- During the uprev cycle, the Yocto Project team uses an ongoing analysis
- of Linux kernel development, BSP support, and release timing to select
- the best possible ``kernel.org`` Linux kernel version on which to base
- subsequent Yocto Linux kernel development. The team continually monitors
- Linux community kernel development to look for significant features of
- interest. The team does consider back-porting large features if they
- have a significant advantage. User or community demand can also trigger
- a back-port or creation of new functionality in the Yocto Project
- baseline kernel during the uprev cycle.
- Generally speaking, every new Linux kernel both adds features and
- introduces new bugs. These consequences are the basic properties of
- upstream Linux kernel development and are managed by the Yocto Project
- team's Yocto Linux kernel development strategy. It is the Yocto Project
- team's policy to not back-port minor features to the released Yocto
- Linux kernel. They only consider back-porting significant technological
- jumps --- and, that is done after a complete gap analysis. The reason
- for this policy is that back-porting any small to medium sized change
- from an evolving Linux kernel can easily create mismatches,
- incompatibilities and very subtle errors.
- The policies described in this section result in both a stable and a
- cutting edge Yocto Linux kernel that mixes forward ports of existing
- Linux kernel features and significant and critical new functionality.
- Forward porting Linux kernel functionality into the Yocto Linux kernels
- available through the Yocto Project can be thought of as a "micro
- uprev". The many "micro uprevs" produce a Yocto Linux kernel version
- with a mix of important new mainline, non-mainline, BSP developments and
- feature integrations. This Yocto Linux kernel gives insight into new
- features and allows focused amounts of testing to be done on the kernel,
- which prevents surprises when selecting the next major uprev. The
- quality of these cutting edge Yocto Linux kernels is evolving and the
- kernels are used in leading edge feature and BSP development.
- Yocto Linux Kernel Architecture and Branching Strategies
- ========================================================
- As mentioned earlier, a key goal of the Yocto Project is to present the
- developer with a kernel that has a clear and continuous history that is
- visible to the user. The architecture and mechanisms, in particular the
- branching strategies, used achieve that goal in a manner similar to
- upstream Linux kernel development in ``kernel.org``.
- You can think of a Yocto Linux kernel as consisting of a baseline Linux
- kernel with added features logically structured on top of the baseline.
- The features are tagged and organized by way of a branching strategy
- implemented by the Yocto Project team using the Source Code Manager
- (SCM) Git.
- .. note::
- - Git is the obvious SCM for meeting the Yocto Linux kernel
- organizational and structural goals described in this section. Not
- only is Git the SCM for Linux kernel development in ``kernel.org``
- but, Git continues to grow in popularity and supports many
- different work flows, front-ends and management techniques.
- - You can find documentation on Git at https://git-scm.com/doc. You can
- also get an introduction to Git as it applies to the Yocto Project in the
- ":ref:`overview-manual/development-environment:git`" section in the Yocto Project
- Overview and Concepts Manual. The latter reference provides an
- overview of Git and presents a minimal set of Git commands that
- allows you to be functional using Git. You can use as much, or as
- little, of what Git has to offer to accomplish what you need for
- your project. You do not have to be a "Git Expert" in order to use
- it with the Yocto Project.
- Using Git's tagging and branching features, the Yocto Project team
- creates kernel branches at points where functionality is no longer
- shared and thus, needs to be isolated. For example, board-specific
- incompatibilities would require different functionality and would
- require a branch to separate the features. Likewise, for specific kernel
- features, the same branching strategy is used.
- This "tree-like" architecture results in a structure that has features
- organized to be specific for particular functionality, single kernel
- types, or a subset of kernel types. Thus, the user has the ability to
- see the added features and the commits that make up those features. In
- addition to being able to see added features, the user can also view the
- history of what made up the baseline Linux kernel.
- Another consequence of this strategy results in not having to store the
- same feature twice internally in the tree. Rather, the kernel team
- stores the unique differences required to apply the feature onto the
- kernel type in question.
- .. note::
- The Yocto Project team strives to place features in the tree such
- that features can be shared by all boards and kernel types where
- possible. However, during development cycles or when large features
- are merged, the team cannot always follow this practice. In those
- cases, the team uses isolated branches to merge features.
- BSP-specific code additions are handled in a similar manner to
- kernel-specific additions. Some BSPs only make sense given certain
- kernel types. So, for these types, the team creates branches off the end
- of that kernel type for all of the BSPs that are supported on that
- kernel type. From the perspective of the tools that create the BSP
- branch, the BSP is really no different than a feature. Consequently, the
- same branching strategy applies to BSPs as it does to kernel features.
- So again, rather than store the BSP twice, the team only stores the
- unique differences for the BSP across the supported multiple kernels.
- While this strategy can result in a tree with a significant number of
- branches, it is important to realize that from the developer's point of
- view, there is a linear path that travels from the baseline
- ``kernel.org``, through a select group of features and ends with their
- BSP-specific commits. In other words, the divisions of the kernel are
- transparent and are not relevant to the developer on a day-to-day basis.
- From the developer's perspective, this path is the development branch.
- The developer does not need to be aware of the existence of
- any other branches at all. Of course, it can make sense to have these
- branches in the tree, should a person decide to explore them. For
- example, a comparison between two BSPs at either the commit level or at
- the line-by-line code ``diff`` level is now a trivial operation.
- The following illustration shows the conceptual Yocto Linux kernel.
- .. image:: figures/kernel-architecture-overview.png
- :width: 100%
- In the illustration, the "Kernel.org Branch Point" marks the specific
- spot (or Linux kernel release) from which the Yocto Linux kernel is
- created. From this point forward in the tree, features and differences
- are organized and tagged.
- The "Yocto Project Baseline Kernel" contains functionality that is
- common to every kernel type and BSP that is organized further along in
- the tree. Placing these common features in the tree this way means
- features do not have to be duplicated along individual branches of the
- tree structure.
- From the "Yocto Project Baseline Kernel", branch points represent
- specific functionality for individual Board Support Packages (BSPs) as
- well as real-time kernels. The illustration represents this through
- three BSP-specific branches and a real-time kernel branch. Each branch
- represents some unique functionality for the BSP or for a real-time
- Yocto Linux kernel.
- In this example structure, the "Real-time (rt) Kernel" branch has common
- features for all real-time Yocto Linux kernels and contains more
- branches for individual BSP-specific real-time kernels. The illustration
- shows three branches as an example. Each branch points the way to
- specific, unique features for a respective real-time kernel as they
- apply to a given BSP.
- The resulting tree structure presents a clear path of markers (or
- branches) to the developer that, for all practical purposes, is the
- Yocto Linux kernel needed for any given set of requirements.
- .. note::
- Keep in mind the figure does not take into account all the supported
- Yocto Linux kernels, but rather shows a single generic kernel just
- for conceptual purposes. Also keep in mind that this structure
- represents the
- :ref:`overview-manual/development-environment:yocto project source repositories`
- that are either pulled from during the build or established on the
- host development system prior to the build by either cloning a
- particular kernel's Git repository or by downloading and unpacking a
- tarball.
- Working with the kernel as a structured tree follows recognized
- community best practices. In particular, the kernel as shipped with the
- product, should be considered an "upstream source" and viewed as a
- series of historical and documented modifications (commits). These
- modifications represent the development and stabilization done by the
- Yocto Project kernel development team.
- Because commits only change at significant release points in the product
- life cycle, developers can work on a branch created from the last
- relevant commit in the shipped Yocto Project Linux kernel. As mentioned
- previously, the structure is transparent to the developer because the
- kernel tree is left in this state after cloning and building the kernel.
- Kernel Build File Hierarchy
- ===========================
- Upstream storage of all the available kernel source code is one thing,
- while representing and using the code on your host development system is
- another. Conceptually, you can think of the kernel source repositories
- as all the source files necessary for all the supported Yocto Linux
- kernels. As a developer, you are just interested in the source files for
- the kernel on which you are working. And, furthermore, you need them
- available on your host system.
- Kernel source code is available on your host system several different
- ways:
- - *Files Accessed While using devtool:* ``devtool``, which is
- available with the Yocto Project, is the preferred method by which to
- modify the kernel. See the ":ref:`kernel-dev/intro:kernel modification workflow`" section.
- - *Cloned Repository:* If you are working in the kernel all the time,
- you probably would want to set up your own local Git repository of
- the Yocto Linux kernel tree. For information on how to clone a Yocto
- Linux kernel Git repository, see the
- ":ref:`kernel-dev/common:preparing the build host to work on the kernel`"
- section.
- - *Temporary Source Files from a Build:* If you just need to make some
- patches to the kernel using a traditional BitBake workflow (i.e. not
- using the ``devtool``), you can access temporary kernel source files
- that were extracted and used during a kernel build.
- The temporary kernel source files resulting from a build using BitBake
- have a particular hierarchy. When you build the kernel on your
- development system, all files needed for the build are taken from the
- source repositories pointed to by the
- :term:`SRC_URI` variable and gathered
- in a temporary work area where they are subsequently used to create the
- unique kernel. Thus, in a sense, the process constructs a local source
- tree specific to your kernel from which to generate the new kernel
- image.
- The following figure shows the temporary file structure created on your
- host system when you build the kernel using BitBake. This
- :term:`Build Directory` contains all the source files used during the build.
- .. image:: figures/kernel-overview-2-generic.png
- :align: center
- :width: 70%
- Again, for additional information on the Yocto Project kernel's
- architecture and its branching strategy, see the
- ":ref:`kernel-dev/concepts-appx:yocto linux kernel architecture and branching strategies`"
- section. You can also reference the
- ":ref:`kernel-dev/common:using \`\`devtool\`\` to patch the kernel`"
- and
- ":ref:`kernel-dev/common:using traditional kernel development to patch the kernel`"
- sections for detailed example that modifies the kernel.
- Determining Hardware and Non-Hardware Features for the Kernel Configuration Audit Phase
- =======================================================================================
- This section describes part of the kernel configuration audit phase that
- most developers can ignore. For general information on kernel
- configuration including ``menuconfig``, ``defconfig`` files, and
- configuration fragments, see the
- ":ref:`kernel-dev/common:configuring the kernel`" section.
- During this part of the audit phase, the contents of the final
- ``.config`` file are compared against the fragments specified by the
- system. These fragments can be system fragments, distro fragments, or
- user-specified configuration elements. Regardless of their origin, the
- OpenEmbedded build system warns the user if a specific option is not
- included in the final kernel configuration.
- By default, in order to not overwhelm the user with configuration
- warnings, the system only reports missing "hardware" options as they
- could result in a boot failure or indicate that important hardware is
- not available.
- To determine whether or not a given option is "hardware" or
- "non-hardware", the kernel Metadata in ``yocto-kernel-cache`` contains
- files that classify individual or groups of options as either hardware
- or non-hardware. To better show this, consider a situation where the
- ``yocto-kernel-cache`` contains the following files::
- yocto-kernel-cache/features/drm-psb/hardware.cfg
- yocto-kernel-cache/features/kgdb/hardware.cfg
- yocto-kernel-cache/ktypes/base/hardware.cfg
- yocto-kernel-cache/bsp/mti-malta32/hardware.cfg
- yocto-kernel-cache/bsp/qemu-ppc32/hardware.cfg
- yocto-kernel-cache/bsp/qemuarma9/hardware.cfg
- yocto-kernel-cache/bsp/mti-malta64/hardware.cfg
- yocto-kernel-cache/bsp/arm-versatile-926ejs/hardware.cfg
- yocto-kernel-cache/bsp/common-pc/hardware.cfg
- yocto-kernel-cache/bsp/common-pc-64/hardware.cfg
- yocto-kernel-cache/features/rfkill/non-hardware.cfg
- yocto-kernel-cache/ktypes/base/non-hardware.cfg
- yocto-kernel-cache/features/aufs/non-hardware.kcf
- yocto-kernel-cache/features/ocf/non-hardware.kcf
- yocto-kernel-cache/ktypes/base/non-hardware.kcf
- yocto-kernel-cache/ktypes/base/hardware.kcf
- yocto-kernel-cache/bsp/qemu-ppc32/hardware.kcf
- Here are explanations for the various files:
- - ``hardware.kcf``: Specifies a list of kernel Kconfig files that
- contain hardware options only.
- - ``non-hardware.kcf``: Specifies a list of kernel Kconfig files that
- contain non-hardware options only.
- - ``hardware.cfg``: Specifies a list of kernel ``CONFIG_`` options that
- are hardware, regardless of whether or not they are within a Kconfig
- file specified by a hardware or non-hardware Kconfig file (i.e.
- ``hardware.kcf`` or ``non-hardware.kcf``).
- - ``non-hardware.cfg``: Specifies a list of kernel ``CONFIG_`` options
- that are not hardware, regardless of whether or not they are within a
- Kconfig file specified by a hardware or non-hardware Kconfig file
- (i.e. ``hardware.kcf`` or ``non-hardware.kcf``).
- Here is a specific example using the
- ``kernel-cache/bsp/mti-malta32/hardware.cfg``::
- CONFIG_SERIAL_8250
- CONFIG_SERIAL_8250_CONSOLE
- CONFIG_SERIAL_8250_NR_UARTS
- CONFIG_SERIAL_8250_PCI
- CONFIG_SERIAL_CORE
- CONFIG_SERIAL_CORE_CONSOLE
- CONFIG_VGA_ARB
- The kernel configuration audit automatically detects
- these files (hence the names must be exactly the ones discussed here),
- and uses them as inputs when generating warnings about the final
- ``.config`` file.
- A user-specified kernel Metadata repository, or recipe space feature,
- can use these same files to classify options that are found within its
- ``.cfg`` files as hardware or non-hardware, to prevent the OpenEmbedded
- build system from producing an error or warning when an option is not in
- the final ``.config`` file.
|