Go to file
2021-06-05 08:03:08 +00:00
_constraints commit 82ccb825455dce7b312f36e2bc9474ecf2926771 2021-05-03 08:02:36 +00:00
.gitattributes OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/kernel-source?expand=0&rev=1 2008-07-18 10:15:21 +00:00
.gitignore OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/kernel-source?expand=0&rev=1 2008-07-18 10:15:21 +00:00
apply-patches commit 1b516a551287446ce1222d51c63d4f9be6e5c95f 2017-05-02 07:07:06 +00:00
arch-symbols commit 374b0aeb68b51de45c003859d7c4534017a89038 2019-09-11 06:08:09 +00:00
check-for-config-changes commit e06d321f0fedc62f2ae9fe030f6d2413efc15633 2021-04-22 10:32:09 +00:00
check-module-license commit 6f03484dfe283f692d2c3eadfef735c7abd78fda 2019-08-27 08:07:40 +00:00
compress-vmlinux.sh commit 8fc81d38d8b63789858468f74d67d86ddb96d14e 2014-08-22 06:03:45 +00:00
compute-PATCHVERSION.sh commit 83948c1558f87eeaca00110c09cc1f26805fe4b0 2016-01-12 07:05:55 +00:00
config-options.changes.txt commit d4bcf2abd85a8d69da9d3f3e4e5dc57c556bca61 2016-06-26 14:47:43 +00:00
config.addon.tar.bz2 commit 582208c4334d0b2b1e605a44a2c5183927d6d315 2012-10-02 06:02:44 +00:00
config.conf commit 68a1ba61c29f0600aae5c3a51059888f23f89d27 2021-03-20 08:05:55 +00:00
config.sh commit 5d43652877fda8aa556866abab93cad61f1f9b6f 2021-04-26 05:43:07 +00:00
config.tar.bz2 commit 6e53ea25fe40b9dbf82e334d34148bcb3894168e 2021-05-16 07:46:06 +00:00
constraints.in commit 82ccb825455dce7b312f36e2bc9474ecf2926771 2021-05-03 08:02:36 +00:00
devel-post.sh OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/kernel-source?expand=0&rev=54 2009-05-20 08:59:36 +00:00
devel-pre.sh OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/kernel-source?expand=0&rev=54 2009-05-20 08:59:36 +00:00
dtb-aarch64.changes commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
dtb-aarch64.spec commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
dtb-armv6l.changes commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
dtb-armv6l.spec commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
dtb-armv7l.changes commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
dtb-armv7l.spec commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
dtb-riscv64.changes commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
dtb-riscv64.spec commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
dtb.spec.in.in commit f76e598b0987217c1f512251f066bccd73a422d0 2020-11-20 08:06:59 +00:00
group-source-files.pl commit 1081f2bd916a122b43cd805ad742b03c23ad45d2 2017-09-13 06:02:42 +00:00
guards commit 4a049a57543453a2f30f6d93ff76988595076a6b 2015-07-22 06:03:49 +00:00
host-memcpy-hack.h GIT Revision: 1cba112c43d2060ed8e070fbb8dd525b70a3509b 2011-10-25 05:02:09 +00:00
kabi.pl commit 4de111142ddf0e3ba42e23d5c7fe663483c91f92 2020-03-30 10:55:35 +00:00
kabi.tar.bz2 commit d4bcf2abd85a8d69da9d3f3e4e5dc57c556bca61 2016-06-26 14:47:43 +00:00
kernel-64kb.changes commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-64kb.spec commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-binary.spec.in commit 5d43652877fda8aa556866abab93cad61f1f9b6f 2021-04-26 05:43:07 +00:00
kernel-cert-subpackage commit 4ea78e81d7e2e33e2a9ae58577f989be87938a7e 2020-09-23 08:07:46 +00:00
kernel-debug.changes commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-debug.spec commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-default-base.spec.txt commit f76e598b0987217c1f512251f066bccd73a422d0 2020-11-20 08:06:59 +00:00
kernel-default.changes commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-default.spec commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-docs.changes commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-docs.spec commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-docs.spec.in commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-kvmsmall.changes commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-kvmsmall.spec commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-lpae.changes commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-lpae.spec commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-module-subpackage commit f76e598b0987217c1f512251f066bccd73a422d0 2020-11-20 08:06:59 +00:00
kernel-obs-build.changes commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-obs-build.spec commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-obs-build.spec.in commit 5d43652877fda8aa556866abab93cad61f1f9b6f 2021-04-26 05:43:07 +00:00
kernel-obs-qa.changes commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-obs-qa.spec commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-obs-qa.spec.in commit f76e598b0987217c1f512251f066bccd73a422d0 2020-11-20 08:06:59 +00:00
kernel-pae.changes commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-pae.spec commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-source.changes commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-source.rpmlintrc commit d4bcf2abd85a8d69da9d3f3e4e5dc57c556bca61 2016-06-26 14:47:43 +00:00
kernel-source.spec commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-source.spec.in commit 5d43652877fda8aa556866abab93cad61f1f9b6f 2021-04-26 05:43:07 +00:00
kernel-spec-macros commit 018878b257ecdc5e269780c1a27ecb1ade8d48f2 2019-03-19 08:08:50 +00:00
kernel-subpackage-build commit 9ce8b38e3eb3973710d04bca2859bcec2dd175b2 2021-02-23 06:16:05 +00:00
kernel-subpackage-spec commit cea1843884f2e835cc1fdd1077449080de297210 2020-01-17 08:06:43 +00:00
kernel-syms.changes commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-syms.spec commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-syms.spec.in commit f76e598b0987217c1f512251f066bccd73a422d0 2020-11-20 08:06:59 +00:00
kernel-vanilla.changes commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-vanilla.spec commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-zfcpdump.changes commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
kernel-zfcpdump.spec commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
klp-symbols commit afc46980b090099e95ee8b2e9b34470187e6796f 2019-07-25 08:06:00 +00:00
linux-5.12.tar.xz commit 6208a83ef754ac4c5d1825c896286a612ebd1686 2021-04-27 08:03:44 +00:00
log.sh commit ce190a85abde11c16b0a12f65d7820e251373e48 2015-08-02 06:02:28 +00:00
macros.kernel-source commit 5d43652877fda8aa556866abab93cad61f1f9b6f 2021-04-26 05:43:07 +00:00
mergedep commit 6f03484dfe283f692d2c3eadfef735c7abd78fda 2019-08-27 08:07:40 +00:00
mkspec commit e06d321f0fedc62f2ae9fe030f6d2413efc15633 2021-04-22 10:32:09 +00:00
mkspec-dtb commit 5d43652877fda8aa556866abab93cad61f1f9b6f 2021-04-26 05:43:07 +00:00
moddep commit 4c06520b7c1e9ac2f5d9f4bf0d78cb5cbfb998e3 2019-02-15 09:39:41 +00:00
modflist commit 6f03484dfe283f692d2c3eadfef735c7abd78fda 2019-08-27 08:07:40 +00:00
modules.fips commit 8e322687563b4f32152f1ecf8f339370ceee76a0 2018-05-24 06:03:09 +00:00
modversions GIT Revision: 191d3dbd15aa8c06c1b5c9192193aa6b799b2f79 2011-08-07 05:03:32 +00:00
old-flavors commit 8a962cfa88053c89b833b7ae38ed32d14882cbae 2016-08-30 06:05:46 +00:00
package-descriptions commit 4de111142ddf0e3ba42e23d5c7fe663483c91f92 2020-03-30 10:55:35 +00:00
patches.addon.tar.bz2 commit 582208c4334d0b2b1e605a44a2c5183927d6d315 2012-10-02 06:02:44 +00:00
patches.apparmor.tar.bz2 commit ab9e909366a779cb698d37c4b1afdcd867494342 2017-11-13 21:08:43 +00:00
patches.arch.tar.bz2 commit ab9e909366a779cb698d37c4b1afdcd867494342 2017-11-13 21:08:43 +00:00
patches.drivers.tar.bz2 commit 9c5b7d658b0cffa5ee18d5f9a823f849e8c9d29b 2017-11-21 09:50:52 +00:00
patches.fixes.tar.bz2 commit 76565adce85883f18e59d682675ed1bb87bac432 2020-01-04 08:05:41 +00:00
patches.kabi.tar.bz2 commit d4bcf2abd85a8d69da9d3f3e4e5dc57c556bca61 2016-06-26 14:47:43 +00:00
patches.kernel.org.tar.bz2 commit f17eb01161845e938845a4d96c1b159c5b7e2368 2021-06-03 08:09:30 +00:00
patches.rpmify.tar.bz2 commit 496449bc7bea4086ce456e19268cfff6c8c87d3a 2021-05-06 10:34:16 +00:00
patches.rt.tar.bz2 commit 582208c4334d0b2b1e605a44a2c5183927d6d315 2012-10-02 06:02:44 +00:00
patches.suse.tar.bz2 commit f17eb01161845e938845a4d96c1b159c5b7e2368 2021-06-03 08:09:30 +00:00
post.sh commit f68b7e1884442abb808517acc24234ef6a26b93d 2021-04-14 07:27:17 +00:00
postun.sh commit d585c06aa54224bf97a9dab4ac150db1d9ec76bc 2014-08-18 06:02:31 +00:00
pre.sh commit c7aed11b72dcef69ef8d967e4a20e825b8898c59 2016-09-24 11:48:31 +00:00
preun.sh commit 6f03484dfe283f692d2c3eadfef735c7abd78fda 2019-08-27 08:07:40 +00:00
README.KSYMS OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/kernel-source?expand=0&rev=54 2009-05-20 08:59:36 +00:00
README.PATCH-POLICY.SUSE commit 8a7d5f92631275f69047ece8248a612dac5c283d 2015-02-12 07:04:40 +00:00
README.SUSE commit 4c06520b7c1e9ac2f5d9f4bf0d78cb5cbfb998e3 2019-02-15 09:39:41 +00:00
release-projects commit 4c06520b7c1e9ac2f5d9f4bf0d78cb5cbfb998e3 2019-02-15 09:39:41 +00:00
series.conf commit f17eb01161845e938845a4d96c1b159c5b7e2368 2021-06-03 08:09:30 +00:00
source-post.sh OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/kernel-source?expand=0&rev=54 2009-05-20 08:59:36 +00:00
source-timestamp commit fb6d3b629070d64c71a851d1dfe227fff79b9801 2021-06-05 08:03:08 +00:00
split-modules commit 6f03484dfe283f692d2c3eadfef735c7abd78fda 2019-08-27 08:07:40 +00:00
splitflist commit 4c06520b7c1e9ac2f5d9f4bf0d78cb5cbfb998e3 2019-02-15 09:39:41 +00:00
supported.conf commit fce7e8203b4350dcebc2f0ae331c1efd04d66711 2021-05-12 05:25:25 +00:00
sysctl.tar.bz2 commit 1bdd4f9b1c087edbcbdcfcf220c5b0c1cb7584f0 2020-12-14 08:41:34 +00:00
try-disable-staging-driver commit 91bc4a91ab2486ee7a4c4cfc4205415ebd7a7c9e 2018-11-05 10:07:16 +00:00

WORKING WITH THE SUSE 2.6.x and 3.x KERNEL SOURCES

Andreas Gruenbacher <agruen@suse.de>, SUSE Labs, 2003, 2004, 2005, 2006
Michal Marek <mmarek@suse.de>, SUSE Labs, 2010


This document gives an overview of how SUSE Linux kernels are
created, and describes tasks like building individual kernels
and creating external kernel modules.

A companion HOWTO that describes how to build driver update disks (among
other things) is available at:

    http://developer.novell.com/wiki/index.php/Creating_a_Driver_Update_Disk_%28DUD%29


TABLE OF CONTENTS

  Overview
  Compiling your own kernel
  Building additional (external) modules
  Supported vs. unsupported modules
  Patch selection mechanism
  Where to find configuration files
  How to configure the kernel sources
  Module load paths


OVERVIEW

The kernels for SUSE are generated from the vanilla Linux kernel sources
found at http://ftp.kernel.org, on top of which a number of patches are
applied. The resulting kernel source tree is configured and built,
resulting in a binary kernel.

The add-on patches and configuration files are maintained in
a GIT repository at

    https://github.com/openSUSE/kernel-source
    
A script (scripts/tar-up.sh) packs up the files in the repository in a
form suitable for rpmbuild. When building the RPM packages, the
following binary packages get created:

  *  kernel-source

     The kernel source tree, generated by unpacking the vanilla kernel
     sources and applying the patches. The kernel sources are used by
     a number of other packages. They can also be used for compiling
     additional kernel modules.

  *  kernel-devel

     A subset of the kernel-source package that is needed to build
     external modules.

  *  kernel-$FLAVOR

     A number of binary kernels (for example, kernel-default for
     uniprocessor machines, kernel-smp for smp machines, etc.). These
     packages are all generated from the same kernel sources, and
     differ in the kernel configurations used.

  *  kernel-$FLAVOR-base

     A subset of kernel-$FLAVOR, for use in paravirtualized quests that
     only require a few device and filesystem drivers.

  *  kernel-$FLAVOR-devel

     The files used for generating kernel module packages for use with
     kernel-$FLAVOR.

  *  kernel-syms

     A meta package that pulls in the relevant kernel-$FLAVOR-devel
     packages for a given architecture.


The repository contains the configuration files (.config) for all SUSE
kernel flavors. All configuration files are included in the dependencies
of the kernel-syms package (see WHERE TO FIND CONFIGURATION FILES below).


In the installed system, the kernel-source package installs files in the
following directories:


  *  /usr/src/linux-$VERSION-$RELEASE/

     The kernel sources.

  *  /usr/src/linux

     A symbolic link to /usr/src/linux-$VERSION-$RELEASE.

  *  /usr/share/doc/packages/kernel-source/

     This document.


The kernel-$FLAVOR-devel packages install the following files:

  *  /usr/src/linux-$VERSION-$RELEASE-obj/$ARCH/$FLAVOR/

     Kernel build object files for one kernel flavor. These
     files are used for compiling additional kernel modules.

  *  /usr/src/linux-obj/$ARCH/$FLAVOR

     A symbolic link to /usr/src/linux-$VERSION-$RELEASE-obj/$ARCH/$FLAVOR.


COMPILING YOUR OWN KERNEL

The kernel sources are found in the kernel-source package. The
recommended way to produce a binary kernel is:

  (1)  Install kernel-source. Change to the /usr/src/linux directory.

  (2)  Create a build directory for use in configuring and building
       the kernel. Using /usr/src/linux directly requires root priviledges
       and will cause problems if you need to build kernel modules for
       other installed kernels.

  (3)  Configure the kernel (for example, ``make -C /usr/src/linux
       O=$(pwd) oldconfig'', see HOW TO CONFIGURE THE KERNEL SOURCES).

  (4)  Build the kernel and all its modules (``make'').

  (5)  Make sure that /etc/modprobe.d/unsupported-modules contains

           allow_unsupported_modules 1

       otherwise modprobe will refuse to load any modules.

  (6)  Install the kernel and the modules (``make modules_install'',
       followed by ``make install''). This will automatically create
       an initrd for the new kernel as well (see ``mkinitrd -h'').

  (7)  Add the kernel to the boot manager. When using lilo, run ``lilo''
       to update the boot map.

Instead of building binary kernels by hand, you can also build
one of the kernel-$FLAVOR packages using RPM.


BUILDING ADDITIONAL (EXTERNAL) MODULES

A single binary kernel module generally only works for a specific
version of the kernel source tree, for a specific architecture and
configuration. This means that for each binary kernel that SUSE ships, a
custom module must be built. This requirement is to some extent relaxed
by the modversion mechanism: modversions attach a checksum to each
symbol (function or variable) exported to modules by the kernel. This
allows to use kernel modules that have been built for a kernel with a
different version or release number in many cases, as long as none of
the symbols the module uses have changed between the two kernel
versions.

When releasing maintenance or security update kernels for a specific
product, we carefully try to keep the kernel ABI stable.  Despite this,
we sometimes have no choice but to break binary compatibility. In this
case, those kernel modules must be rebuilt.

Additional kernel modules for one of the SUSE kernel flavors can be
built in three different ways:

  (1) by configuring the kernel sources in a separate build directory
      (see HOW TO CONFIGURE THE KERNEL SOURCES), or

  (2) by using one of the standard configurations in
      /usr/src/linux-obj/$ARCH/$FLAVOR, or

  (3) by creating a Kernel Module Package (KMP) as described in the
      Kernel Module Packages Manual, https://drivers.suse.com/doc/kmpm/.


The first method involves the following steps:

  (1)  Install the kernel-source package.

  (2)  Configure the kernel, see HOW TO CONFIGURE THE KERNEL SOURCES.

  (3)  Create files required for compiling external modules:
       ``make prepare'' and ``make scripts''.

  (4)  Compile the module(s) by changing into the module source directory
       and typing ``make -C $(your_build_dir) M=$(pwd)''.

  (5)  Install the module(s) by typing
       ``make -C $(your_build_dir) M=$(pwd) modules_install''.


The second method involves the following steps:

  (1)  Install the kernel-devel package.

  (2)  Install the kernel-$FLAVOR-devel package. This is necessary for
       symbol version information (CONFIG_MODVERSIONS).

  (3)  Compile the module(s) by changing into the module source directory
       and typing ``make -C /usr/src/linux-obj/$ARCH/$FLAVOR M=$(pwd)''.
       Substitute $ARCH and $FLAVOR with the architecture and flavor
       for which to build the module(s).

       If the installed kernel sources match the running kernel, you
       can build modules for the running kernel by using the path
       /lib/modules/$(uname -r)/build as the -C option in the above
       command. (build is a symlink to /usr/src/linux-obj/$ARCH/$FLAVOR).

  (4)  Install the module(s) with
       ``make -C /usr/src/linux-obj/$ARCH/$FLAVOR M=$(pwd) modules_install''.


Whenever building modules, please use the kernel build infrastructure as
much as possible, and do not try to circumvent it. The
Documentation/kbuild directory in the kernel sources documents kbuild
makefiles.


SUPPORTED VS. UNSUPPORTED MODULES

As an extension to the mainline kernel, modules can be tagged as
supported (directly by SUSE, or indirectly by a third party) or
unsupported. Modules which are known to be flakey or for which SUSE does
not have the necessary expertise are marked as unsupported.  Modules for
which SUSE has third-party support agreements are marked as externally
supported. Modules for which SUSE provides direct support are marked as
supported.

The support status of a module can be queried with the modinfo tool.
Modinfo will report one of the following:

  - direct support by SUSE: "supported: yes"
  - third-party support: "supported: external"
  - unsupported modules: no supported tag.

At runtime, the setting of the" unsupported" kernel command line
parameter and /proc/sys/kernel/unsupported determines whether
unsupported modules can be loaded or not, and whether or not loading an
unsupported module causes a warning in the system log:

  0 = only allow supported modules,
  1 = warn when loading unsupported modules,
  2 = don't warn.

Irrespective of this setting, loading an externally supported or unsupported
module both set a kernel taint flag. The taint flags are included in
Oopses. The taint status of the kernel can be inspected in
/proc/sys/kernel/tainted: Bits 0 to 4 have the following meanings:

  bit  0 = a module with a GPL-incompatible license was loaded (tainted & 1),
  bit  1 = module load was enforced (tainted & 2),
  bit  2 = an SMP-unsafe module was loaded (tainted & 4),
  bit  3 = (reserved),
  bit  4 = an unsupported module was loaded (tainted & 16),
  bit  5 = a module with third-party support was loaded (tainted & 32).
  bit 10 = a machine check exception has occurred (taint & 1024; x86_64 only
	   so far).

The corresponding codes for the taint flags in Oopses are (x = unknown):

  - "Pxxx" if bit 0 set or else
    "Gxxx" if bit 0 unset,
  
  - "xFxx" if bit 1 set or else
    "x xx" if bit 1 unset,
  
  - "xxSx" if set or else
    "xx x" if bit 2 unset,
  
  - "xxxU" if bit 4 set or else
    "xxxX" if bit 5 set or else
    "xxx ".

By default, out-of-tree modules will not have the supported flag (that
is, they will be marked as unsupported). For building externally
supported modules, please get in touch with Solid Driver Program team,
led by Scott Bahling, at <soliddriver@suse.com>.


PATCH SELECTION MECHANISM

The SUSE kernels consist of the vanilla kernel sources on top of which a
number of patches is applied. The file series.conf determines which
patches are applied and which are excluded. A script named "guards"
converts series.conf into a plain list of patch files to be applied.
Guards decides which patches to include and exclude based on a list of
symbols. From the kernel-source.src.rpm package, a fully patched
kernel source tree can be generated from vanilla sources + patches like
this:

    # Install the package:

      $ rpm -i kernel-source.src.rpm

    # Unpack the patches and the kernel sources:
    
      $ cd /usr/src/packages/SOURCES
      $ for f in patches.*.tar.bz2; do		\
	  tar -xjf "$f" || break;		\
	done
      $ tar -xjf linux-2.6.5.tar.bz2

    # Apply the patches

      $ for p in $(./guards < series.conf); do
	  patch -d linux-2.6.5 -p1 < $p || break
	done

The configuration script config.conf which is similar to series.conf is
used for configuration file selection. See the section WHERE TO FIND
CONFIGURATION FILES.

The file format of series.conf and config.conf should be obvious from
the comments in series.conf, and from the guards(1) manual page. (The
guards(1) manual page can be generated by running pod2man on the guards
script.)


WHERE TO FIND CONFIGURATION FILES

Kernel configuration files are stored in the kernel GIT repository. When
packing up the repository, they end up in config.tar.bz2.

The kernel-$FLAVOR packages are based on config/$ARCH/$FLAVOR.
(kernel-default is based on config/$ARCH/default, for example). The
kernel-$FLAVOR packages install their configuration files as
/boot/config-$VER_STR (for example, /boot/config-2.6.5-99-default). The
config is also packaged in the kernel-$FLAVOR-devel package as
/usr/src/linux-obj/$ARCH/$FLAVOR/.config.

In addition, the running kernel exposes a gzip compressed version of its
configuration file as /proc/config.gz. The kernel sources can be
configured based on /proc/config.gz with ``make silentoldconfig''.


HOW TO CONFIGURE THE KERNEL SOURCES

Before a binary kernel is built or an additional loadable module
for an existing kernel is created, the kernel must be configured.

In order for a loadable module to work with an existing kernel, it must
be created with a configuration that is identical to the kernel's
configuration, or at least very close to that. Each configuration is
contained in a single file. The kernel-syms package installs
configurations for all standard SUSE kernel variants, so for building
only external kernel modules it is not necessary to configure the kernel
sources.

Configuring the kernel sources for a specific configuration is
straightfoward:

  - Locate the configuration file you want to use. (See WHERE TO FIND
    CONFIGURATION FILES above).

  - Copy the configuration to the file .config in your build directory.

  - Run the following commands in sequence to apply the configuration,
    generate version information files, etc.:

        make -C /usr/src/linux O=$PWD clean
        make -C /usr/src/linux O=$PWD oldconfig

    Alternatively to ``make oldconfig'', you can also use ``make
    menuconfig'' for a text menu oriented user interface. If the kernel
    sources do not match the configuration file exactly, ``make
    oldconfig'' will prompt for settings that are undefined. Once this
    step is completed, a Makefile will have been created that eliminates
    the need to specify the locations of the kernel source and the build
    directory.

    For configuring the kernel to match the running kernel, you can use
    the file /proc/config.gz, unpack it into into .config, and then run
    ``make oldconfig''.

HOW TO ADD CUSTOM PATCHES

Typically patches are added to the appropriate patches.* directory (e.g.
patches.fixes) and to series.conf. When the kernel-source package is
exported from the git repository, the patch will be automatically added
to the appropriate patch tarball.

If your goal is to create a kernel with only a few additional patches
and you don't want to be bothered with using the git repository, there
is an easier way.

The kernel-source SRPM ships with two empty archives that can be be
filled and automatically expanded when building the kernel. You can use
these to add your own patches and config options without disturbing the
rest of the kernel package. This is useful if you are using the openSUSE
Build Service and link to the main kernel-source project instead of
creating your own branch. The advantage to this is that your project
will automatically receive all the changes that go into the main project
without any further effort.

To add a patch using this mechanism, just add it to the
patches.addon.tar.bz2 archive and add an entry to the series.conf file.
The archive will be expanded automatically with the other kernel patches
when the source tree is constructed.

Some patches may add new Kconfig options. The config.addon.tar.bz2
archive contains the same hierarchy as config.tar.bz2, but is under
config.addon. You can add your new config options to files named after
their config/ counterparts.

For example, the file used to configure the i386 default kernel is named
config/i386/default. To add config options to that kernel, you would
create a new file called config.addon/i386/default with the options as
formatted in a normal Linux kernel .config file. This is important
because the kernel build is non-interactive and will fail if it
encounters new config options without entries in the config file.

MODULE LOAD PATHS

Modules that belong to a specific kernel release are installed in
/lib/modules/2.6.5-99-smp and similar. Note that this path contains the
kernel package release number. Modules from KMPs must be installed
below /lib/modules/2.6.5-99-smp/updates/ and similar: modules below
updates/ have priority over other modules.

When KMPs contain modules that are compatible between multiple installed
kernels, symlinks are used to make those modules available to those
compatible kernels like this:

  /lib/modules/2.6.16-100-smp/weak-updates/foo.ko ->
      /lib/modules/2.6.16-99-smp/updates/foo.ko

Modules in the weak-updates directory have lower priority than modules
in /lib/modules/2.6.16-100-smp/updates/, and higher priority than other
modules in /lib/modules/2.6.16-100-smp.


REFERENCES

General

  Documentation in the kernel source tree.

  Linux Documentation Project, http://www.tldp.org/

  Linux Weekly News, http://lwn.net

  Rusty's Remarkably Unreliable Guides (Kernel Hacking
    and Kernel Locking guides),
    http://www.netfilter.org/unreliable-guides/

  Kernel newbies, http://www.kernelnewbies.org/


Loadable Kernel Modules

  Peter Jay Salzman and Ori Pomerantz: Linux Kernel Module
    Programming Guide, Version 2.4, April 2003,
    http://www.tldp.org/guides.html


Kernel Module Packages

    Andreas Gruenbacher: Kernel Module Packages Manual.
    Versions for CODE9 (SLES9, SUSE LINUX 10.0) and CODE10
    (SUSE Linux 10.1, SLES10),
    https://drivers.suse.com/doc/kmpm/