A generic kernel image (GKI) may not contain the required driver support to
enable a device to mount partitions. To enable a device to mount partitions and
to continue booting, first-stage init
is enhanced to load the
kernel modules present on a ramdisk. The ramdisk is split into generic and
vendor ramdisks. Vendor kernel modules are stored in the vendor ramdisk. The
order in which kernel modules are loaded is configurable.
Module location
The ramdisk is the filesystem for first-stage init,
and for the
recovery/fastbootd image on A/B and virtual A/B devices. It's an
initramfs
composed of two cpio archives that get concatenated by
the bootloader. The first cpio archive, which is stored as the vendor ramdisk
in the vendor-boot partition, contains these components:
- First-stage
init
vendor kernel modules, located in/lib/modules/
. modprobe
config files, located in/lib/modules/
:modules.dep
,modules.softdep
,modules.alias
,modules.options
.- A
modules.load
file that indicates which modules to load during first stage init, and in which order, in/lib/modules/
. - Vendor recovery-kernel modules, for A/B and Virtual A/B devices, in
/lib/modules/
modules.load.recovery
which indicates the modules to load, and in which order, for A/B and Virtual A/B devices, in/lib/modules
.
The second cpio archive, which is supplied with the GKI
as the ramdisk of the boot.img and applied on top of the
first, contains first_stage_init
and the libraries on which it depends.
Module loading in first-stage init
First-stage init
begins by reading the modprobe configuration
files from /lib/modules/
on the ramdisk. Next, it reads the list
of modules specified in /lib/modules/modules.load
(or in the case
of recovery, /lib/modules/modules.load.recovery
) and attempts to
load each of those modules in order, following the configuration specified in
the previously loaded files. The requested order may be deviated from to
satisfy hard or soft dependencies.
Build support, first-stage init
To specify kernel modules to be copied into the vendor ramdisk cpio, list
them in BOARD_VENDOR_RAMDISK_KERNEL_MODULES
. The build runs
depmod
on these modules and puts the resulting modprobe configuration
files in the vendor ramdisk cpio.
The build also creates a modules.load
file and stores it in the
vendor ramdisk cpio. By default it contains all of the modules listed in
BOARD_VENDOR_RAMDISK_KERNEL_MODULES
. To override the contents of
that file, use BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD
, as shown
in this example:
BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := \ device/vendor/mydevice-kernel/first.ko \ device/vendor/mydevice-kernel/second.ko \ device/vendor/mydevice-kernel/third.ko
Build support, full Android
As is the case in Android 10 and lower releases, kernel modules listed in
BOARD_VENDOR_KERNEL_MODULES
are copied by the Android platform
build into the vendor partition at /vendor/lib/modules
. The
platform build runs depmod
on these modules, and copies the
depmod
output files into the vendor partition at the same
location. The mechanism for loading kernel modules from /vendor
remains the same as it was for prior releases of Android. It's your decision
how and when to load these modules, although typically this is done using
init.rc
scripts.
Wildcards and integrated kernel builds
Vendors who combine their device kernel build with the Android platform build
may run into a problem using the above mentioned BOARD
macros to
specify kernel modules to be copied on to the device. If the vendor wishes to avoid
listing kernel modules in the device's platform build files, they can use a wildcard
($(wildcard device/vendor/mydevice/*.ko
). Note that the wildcard doesn't
work in the case of an integrated kernel build, because when make is invoked and the
macros are expanded in makefiles, the kernel modules haven't been built, so the macros
are empty.
To get around this problem, the vendor may have their kernel build create a zip
archive containing the kernel modules to be be copied onto each partition.
Set the path of that zip archive in BOARD_*_KERNEL_MODULES_ARCHIVE
where *
is the name of the partition (such as
BOARD_VENDOR_KERNEL_MODULES_ARCHIVE
). The Android platform build
extracts this zip archive into the appropriate location and runs depmod
on the modules.
The kernel module zip archive should have a make rule that ensures the platform build can generate the archive when required.
Recovery
In prior Android releases, kernel modules required for recovery were
specified in BOARD_RECOVERY_KERNEL_MODULES
. In Android 12,
kernel modules required for recovery are still
specified using this macro. However, the recovery kernel modules are copied to
the vendor ramdisk cpio, rather than the generic ramdisk cpio. By default all
kernel modules listed in BOARD_RECOVERY_KERNEL_MODULES
are loaded
during first-stage init
. If you only want a subset of these
modules to be loaded, specify the contents of that subset in
BOARD_RECOVERY_KERNEL_MODULES_LOAD
.
Related documentation
To learn about creating a vendor boot partition (which contains the vendor ramdisk mentioned on this page), see Boot partitions.