linux-kernel kbuild

linux kernel - ¿Qué hace exactamente el `make defconfig` del kernel de Linux?



linux-kernel kbuild (2)

Motivación

El archivo .config no se copia simplemente de su archivo defconfig . La motivación para almacenar defconfig en dicho formato es la siguiente: en defconfig solo podemos especificar opciones con valores no predeterminados (es decir, opciones que cambiamos para nuestro tablero). De esta manera podemos mantenerlo pequeño y claro. Cada nueva versión del kernel trae un montón de nuevas opciones, y de esta manera no necesitamos actualizar nuestro archivo defconfig cada vez que se lanza el kernel. Además, debe mencionarse que el sistema de compilación del kernel mantiene un orden de opciones muy específico en el archivo defconfig , por lo que es mejor evitar modificarlo manualmente. En su lugar, debe utilizar la regla make savedefconfig .

Explicación simplificada

Cuando se .config archivo .config , el sistema de compilación del kernel recorre todos los archivos Kconfig (de todos los subdirectorios), verificando todas las opciones en esos archivos Kconfig :

  • Si la opción se menciona en defconfig , el sistema de compilación pone esa opción en .config con el valor elegido en defconfig
  • Si la opción no se menciona en defconfig , el sistema de compilación pone esa opción en .config usando su valor predeterminado, especificado en Kconfig correspondiente

Compruebe los scripts/kconfig/Makefile y scripts/kconfig/conf.c para ver cómo se hace realmente.

Explicación más precisa y detallada.

De "Kbuild: el sistema de construcción del kernel de Linux" por Javier Martínez :

Definición de símbolos de configuración: Kconfig Files

Los símbolos de configuración se definen en archivos conocidos como archivos Kconfig . Cada archivo Kconfig puede describir un número arbitrario de símbolos y también puede incluir (fuente) otros archivos Kconfig . Los objetivos de compilación que construyen los menús de configuración de las opciones de compilación del kernel, como make menuconfig , leen estos archivos para construir la estructura en forma de árbol. Cada directorio en el kernel tiene un Kconfig que incluye los archivos Kconfig de sus subdirectorios. En la parte superior del directorio de código fuente del kernel, hay un archivo Kconfig que es la raíz del árbol de opciones. menuconfig ( scripts/kconfig/mconf ), gconfig ( scripts/kconfig/gconf ) y otros objetivos de compilación invocan programas que comienzan en este Kconfig raíz y leen recursivamente los archivos Kconfig ubicados en cada subdirectorio para construir sus menús. El subdirectorio a visitar también se define en cada archivo Kconfig y también depende de los valores de los símbolos de configuración elegidos por el usuario.

Almacenamiento de valores de símbolo: archivo .config

Todos los valores de los símbolos de configuración se guardan en un archivo especial llamado .config . Cada vez que desea cambiar una configuración de compilación del kernel, ejecuta un objetivo make, como menuconfig o xconfig . Estos leen los archivos Kconfig para crear los menús y actualizar los valores de los símbolos de configuración utilizando los valores definidos en el archivo .config . Además, estas herramientas actualizan el archivo .config con las nuevas opciones que eligió y también pueden generar una si no existía antes.

Debido a que el archivo .config es texto sin formato, también puede cambiarlo sin necesidad de herramientas especializadas. Es muy conveniente para guardar y restaurar configuraciones de compilación del kernel también.

Comandos útiles

Puedes usar una sintaxis más simple para make defconfig , como:

$ make ARCH=arm your_board_defconfig

Vea la lista completa de archivos de configuración disponibles con:

$ make ARCH=arm help | grep defconfig

Si necesita realizar una acción inversa (es decir, crear una defconfig de defconfig pequeña y defconfig partir de un extenso .config ), puede usar la regla savedefconfig :

$ make ARCH=arm savedefconfig

Además, como mencionó 0andriy , puede usar el script diffconfig para ver los cambios de un .config a otro:

$ scripts/diffconfig .config_old .config_new

Puedo usar el siguiente comando para crear un archivo .config kernel de Linux basado en una arquitectura predeterminada predeterminada para una placa personalizada basada en ARM:

ARCH=arm make defconfig KBUILD_DEFCONFIG=var_som_mx6_android_defconfig

Pensé que este comando copia más o menos ./arch/arm/configs/var_som_mx6_android_defconfig a ./.config . Sin embargo, el archivo .config resultante no es exactamente una copia:

$ diff --unified arch/arm/configs/var_som_mx6_android_defconfig .config --- arch/arm/configs/var_som_mx6_android_defconfig 2017-01-20 12:10:51.891515984 -0800 +++ .config 2017-01-26 15:31:29.000000000 -0800 @@ -407,6 +407,7 @@ CONFIG_ARM_ERRATA_751472=y CONFIG_ARM_ERRATA_794072=y CONFIG_ARM_ERRATA_761320=y +CONFIG_ARM_ERRATA_845369=y # CONFIG_ARM_ERRATA_753970 is not set CONFIG_ARM_ERRATA_754322=y # CONFIG_ARM_ERRATA_754327 is not set @@ -2683,7 +2684,6 @@ CONFIG_AUTOFS4_FS=y CONFIG_FUSE_FS=y # CONFIG_CUSE is not set -CONFIG_AUFS_FS=y # # Caches @@ -2759,6 +2759,21 @@ # CONFIG_PSTORE is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set +CONFIG_AUFS_FS=y +CONFIG_AUFS_BRANCH_MAX_127=y +# CONFIG_AUFS_BRANCH_MAX_511 is not set +# CONFIG_AUFS_BRANCH_MAX_1023 is not set +# CONFIG_AUFS_BRANCH_MAX_32767 is not set +CONFIG_AUFS_SBILIST=y +# CONFIG_AUFS_HNOTIFY is not set +# CONFIG_AUFS_RDU is not set +# CONFIG_AUFS_PROC_MAP is not set +# CONFIG_AUFS_SP_IATTR is not set +# CONFIG_AUFS_SHWH is not set +# CONFIG_AUFS_BR_RAMFS is not set +# CONFIG_AUFS_BR_FUSE is not set +CONFIG_AUFS_BDEV_LOOP=y +# CONFIG_AUFS_DEBUG is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V3=y

No entiendo de dónde vienen las líneas adicionales, y siempre he encontrado que el funcionamiento interno de la configuración del kernel, los archivos make y los scripts de compilación son difíciles de entender. ¿Alguien puede explicar de dónde .config esas líneas en el .config ?


También genera include/generated/autoconf.h .

Este archivo de encabezado está incluido en C archivo de origen. Por otro lado, .config es para el sistema Makefile.

El sistema de compilación genera dos archivos, y los mantiene consistentes.