moduleparam: Save information about built-in modules in separate file
Problem: When a kernel module is compiled as a separate module, some important information about the kernel module is available via .modinfo section of the module. In contrast, when the kernel module is compiled into the kernel, that information is not available. Information about built-in modules is necessary in the following cases: 1. When it is necessary to find out what additional parameters can be passed to the kernel at boot time. 2. When you need to know which module names and their aliases are in the kernel. This is very useful for creating an initrd image. Proposal: The proposed patch does not remove .modinfo section with module information from the vmlinux at the build time and saves it into a separate file after kernel linking. So, the kernel does not increase in size and no additional information remains in it. Information is stored in the same format as in the separate modules (null-terminated string array). Because the .modinfo section is already exported with a separate modules, we are not creating a new API. It can be easily read in the userspace: $ tr '\0' '\n' < modules.builtin.modinfo ext4.softdep=pre: crc32c ext4.license=GPL ext4.description=Fourth Extended Filesystem ext4.author=Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others ext4.alias=fs-ext4 ext4.alias=ext3 ext4.alias=fs-ext3 ext4.alias=ext2 ext4.alias=fs-ext2 md_mod.alias=block-major-9-* md_mod.alias=md md_mod.description=MD RAID framework md_mod.license=GPL md_mod.parmtype=create_on_open:bool md_mod.parmtype=start_dirty_degraded:int ... Co-Developed-by: Gleb Fotengauer-Malinovskiy <glebfm@altlinux.org> Signed-off-by: Gleb Fotengauer-Malinovskiy <glebfm@altlinux.org> Signed-off-by: Alexey Gladkov <gladkov.alexey@gmail.com> Acked-by: Jessica Yu <jeyu@kernel.org> Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
This commit is contained in:
parent
4c11edfcf7
commit
898490c010
|
@ -58,6 +58,7 @@ modules.builtin
|
||||||
/vmlinuz
|
/vmlinuz
|
||||||
/System.map
|
/System.map
|
||||||
/Module.markers
|
/Module.markers
|
||||||
|
/modules.builtin.modinfo
|
||||||
|
|
||||||
#
|
#
|
||||||
# RPM spec file (make rpm-pkg)
|
# RPM spec file (make rpm-pkg)
|
||||||
|
|
|
@ -178,6 +178,7 @@ mktables
|
||||||
mktree
|
mktree
|
||||||
modpost
|
modpost
|
||||||
modules.builtin
|
modules.builtin
|
||||||
|
modules.builtin.modinfo
|
||||||
modules.order
|
modules.order
|
||||||
modversions.h*
|
modversions.h*
|
||||||
nconf
|
nconf
|
||||||
|
|
|
@ -11,6 +11,11 @@ modules.builtin
|
||||||
This file lists all modules that are built into the kernel. This is used
|
This file lists all modules that are built into the kernel. This is used
|
||||||
by modprobe to not fail when trying to load something builtin.
|
by modprobe to not fail when trying to load something builtin.
|
||||||
|
|
||||||
|
modules.builtin.modinfo
|
||||||
|
--------------------------------------------------
|
||||||
|
This file contains modinfo from all modules that are built into the kernel.
|
||||||
|
Unlike modinfo of a separate module, all fields are prefixed with module name.
|
||||||
|
|
||||||
|
|
||||||
Environment variables
|
Environment variables
|
||||||
|
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -1308,6 +1308,7 @@ _modinst_:
|
||||||
fi
|
fi
|
||||||
@cp -f $(objtree)/modules.order $(MODLIB)/
|
@cp -f $(objtree)/modules.order $(MODLIB)/
|
||||||
@cp -f $(objtree)/modules.builtin $(MODLIB)/
|
@cp -f $(objtree)/modules.builtin $(MODLIB)/
|
||||||
|
@cp -f $(objtree)/modules.builtin.modinfo $(MODLIB)/
|
||||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
|
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
|
||||||
|
|
||||||
# This depmod is only for convenience to give the initial
|
# This depmod is only for convenience to give the initial
|
||||||
|
@ -1348,6 +1349,7 @@ endif # CONFIG_MODULES
|
||||||
|
|
||||||
# Directories & files removed with 'make clean'
|
# Directories & files removed with 'make clean'
|
||||||
CLEAN_DIRS += $(MODVERDIR) include/ksym
|
CLEAN_DIRS += $(MODVERDIR) include/ksym
|
||||||
|
CLEAN_FILES += modules.builtin.modinfo
|
||||||
|
|
||||||
# Directories & files removed with 'make mrproper'
|
# Directories & files removed with 'make mrproper'
|
||||||
MRPROPER_DIRS += include/config usr/include include/generated \
|
MRPROPER_DIRS += include/config usr/include include/generated \
|
||||||
|
|
|
@ -844,6 +844,7 @@
|
||||||
EXIT_CALL \
|
EXIT_CALL \
|
||||||
*(.discard) \
|
*(.discard) \
|
||||||
*(.discard.*) \
|
*(.discard.*) \
|
||||||
|
*(.modinfo) \
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -253,6 +253,7 @@ extern typeof(name) __mod_##type##__##name##_device_table \
|
||||||
#define MODULE_VERSION(_version) MODULE_INFO(version, _version)
|
#define MODULE_VERSION(_version) MODULE_INFO(version, _version)
|
||||||
#else
|
#else
|
||||||
#define MODULE_VERSION(_version) \
|
#define MODULE_VERSION(_version) \
|
||||||
|
MODULE_INFO(version, _version); \
|
||||||
static struct module_version_attribute ___modver_attr = { \
|
static struct module_version_attribute ___modver_attr = { \
|
||||||
.mattr = { \
|
.mattr = { \
|
||||||
.attr = { \
|
.attr = { \
|
||||||
|
|
|
@ -10,23 +10,21 @@
|
||||||
module name. */
|
module name. */
|
||||||
#ifdef MODULE
|
#ifdef MODULE
|
||||||
#define MODULE_PARAM_PREFIX /* empty */
|
#define MODULE_PARAM_PREFIX /* empty */
|
||||||
|
#define __MODULE_INFO_PREFIX /* empty */
|
||||||
#else
|
#else
|
||||||
#define MODULE_PARAM_PREFIX KBUILD_MODNAME "."
|
#define MODULE_PARAM_PREFIX KBUILD_MODNAME "."
|
||||||
|
/* We cannot use MODULE_PARAM_PREFIX because some modules override it. */
|
||||||
|
#define __MODULE_INFO_PREFIX KBUILD_MODNAME "."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Chosen so that structs with an unsigned long line up. */
|
/* Chosen so that structs with an unsigned long line up. */
|
||||||
#define MAX_PARAM_PREFIX_LEN (64 - sizeof(unsigned long))
|
#define MAX_PARAM_PREFIX_LEN (64 - sizeof(unsigned long))
|
||||||
|
|
||||||
#ifdef MODULE
|
|
||||||
#define __MODULE_INFO(tag, name, info) \
|
#define __MODULE_INFO(tag, name, info) \
|
||||||
static const char __UNIQUE_ID(name)[] \
|
static const char __UNIQUE_ID(name)[] \
|
||||||
__used __attribute__((section(".modinfo"), unused, aligned(1))) \
|
__used __attribute__((section(".modinfo"), unused, aligned(1))) \
|
||||||
= __stringify(tag) "=" info
|
= __MODULE_INFO_PREFIX __stringify(tag) "=" info
|
||||||
#else /* !MODULE */
|
|
||||||
/* This struct is here for syntactic coherency, it is not used */
|
|
||||||
#define __MODULE_INFO(tag, name, info) \
|
|
||||||
struct __UNIQUE_ID(name) {}
|
|
||||||
#endif
|
|
||||||
#define __MODULE_PARM_TYPE(name, _type) \
|
#define __MODULE_PARM_TYPE(name, _type) \
|
||||||
__MODULE_INFO(parmtype, name##type, #name ":" _type)
|
__MODULE_INFO(parmtype, name##type, #name ":" _type)
|
||||||
|
|
||||||
|
|
|
@ -193,6 +193,9 @@ modpost_link vmlinux.o
|
||||||
# modpost vmlinux.o to check for section mismatches
|
# modpost vmlinux.o to check for section mismatches
|
||||||
${MAKE} -f "${srctree}/scripts/Makefile.modpost" vmlinux.o
|
${MAKE} -f "${srctree}/scripts/Makefile.modpost" vmlinux.o
|
||||||
|
|
||||||
|
info MODINFO modules.builtin.modinfo
|
||||||
|
${OBJCOPY} -j .modinfo -O binary vmlinux.o modules.builtin.modinfo
|
||||||
|
|
||||||
kallsymso=""
|
kallsymso=""
|
||||||
kallsyms_vmlinux=""
|
kallsyms_vmlinux=""
|
||||||
if [ -n "${CONFIG_KALLSYMS}" ]; then
|
if [ -n "${CONFIG_KALLSYMS}" ]; then
|
||||||
|
|
Loading…
Reference in New Issue