Red de conocimiento informático - Conocimiento de Internet de las cosas - Cómo compilar la versión de Linux

Cómo compilar la versión de Linux

Compile e instale el kernel

Descargue y descomprima el kernel

Sitio web oficial para descargar el kernel: piled)|(.o$$)|( [aUw ] )|(. .ng$$)|(LASH[RL]DI)' | sort > System.map

Al programar, se nombrarán algunos símbolos, como nombres de variables o nombres de funciones. El kernel de Linux es un bloque de código muy complejo con muchos símbolos globales. El kernel de Linux no usa nombres de símbolos, pero identifica nombres de variables o funciones a través de sus direcciones. Por ejemplo, en lugar de usar símbolos como size_t BytesRead, se hace referencia a esta variable como. c0343f20. Para las personas que usan computadoras, prefiera nombres como size_t BytesRead a nombres como c0343f20. El kernel está escrito principalmente en C, por lo que el compilador/enlazador nos permite usar nombres de símbolos al codificar y direcciones cuando se ejecuta el kernel. Sin embargo, en algunos casos, necesitamos saber la dirección de un símbolo, o necesitamos saber el símbolo correspondiente a la dirección. Esto se hace mediante la tabla de símbolos, que es una lista de todos los símbolos junto con sus direcciones.

La tabla de símbolos de Linux utiliza dos archivos: /proc/ksyms y System.map. /proc/ksyms es un "archivo proc", creado cuando se inicia el kernel. De hecho, no es realmente un archivo, es solo una representación de los datos del kernel, pero le da a la gente la ilusión de un archivo de disco. Esto se puede ver en su tamaño de archivo de 0. Sin embargo, System.map es un archivo real que existe en su sistema de archivos. Cuando compila un nuevo kernel, las direcciones de cada nombre de símbolo cambiarán. Su antiguo System.map tiene información de símbolo incorrecta. Se genera un nuevo System.map cada vez que se compila el kernel. reemplaza el antiguo System.map.

Aunque el kernel en sí no utiliza System.map, otros programas como klogd, lsof y ps necesitan un System.map correcto. Si utiliza el System.map incorrecto o ningún System.map, la salida de klogd no será confiable, lo que puede dificultar la resolución de problemas del programa. Sin System.map, es posible que te enfrentes a algunos mensajes molestos. Algunos otros controladores requieren System.map para resolver símbolos y no funcionarán correctamente sin un System.map creado para el kernel específico que está ejecutando. Para que el demonio de registro del kernel de Linux, klogd, realice la resolución de nombres y direcciones, klogd necesita usar System.map. System.map debe colocarse donde el software que lo utiliza pueda encontrarlo. Ejecución: man klogd muestra que si System.map no se proporciona a klogd como la ubicación de una variable, buscará System.map en tres lugares en el siguiente orden: /boot/System.map, /System.map, / usr/src/linux/System.map

System.map también tiene información de versión, y klogd puede encontrar de forma inteligente el archivo de imagen (mapa) correcto.

Explicación del proceso makefile menuconfig

Cuando ejecutamos el comando make menuconfig, ¿qué hace exactamente el sistema por nosotros? Hay algunos archivos involucrados aquí, analicémoslos uno por uno

La carpeta scripts en el directorio raíz del kernel de Linux

archivo arch/$ARCH/Kconfig, cada capa Kconfig archivos en el directorio

Archivos Makefile en el directorio raíz del kernel de Linux, archivos makefile en el directorio de cada capa

Archivos .config en el directorio raíz del kernel de Linux, arch/$ Archivos ARCH en /configs/

El archivo include/generated/autoconf.h en el directorio raíz del kernel de Linux

1) La carpeta scripts almacena el dibujo gráfico de make menuconfig interfaz de configuración Archivos relacionados, nosotros, como usuarios, no necesitamos preocuparnos por el contenido de esta carpeta

2) Cuando ejecutamos el comando make menuconfig y aparece la interfaz de configuración azul anterior, el sistema realiza el siguiente trabajo para nosotros:

Primero, el sistema leerá el archivo Kconfig en el directorio arch/$ARCH/ para generar todas las opciones de la interfaz de configuración (Kconfig es el núcleo de todo el mecanismo de configuración de Linux). valor de la variable de entorno ARCH? Está determinado por el archivo MAKE en el directorio raíz del kernel de Linux. Hay una definición de esta variable de entorno en el archivo MAKE:

SUBARCH := $(shell uname -m | sed -e s/i. .86/i386 / -e s/sun4u/sparc64/ \

-e s/arm.*/arm/ -e s/sa110/arm/ \

-e s/s390x/s390 / -e s/ parisc64/parisc/ \

-e s/ppc.*/powerpc/ -e s/mips.*/mips/ \

-e s/sh[234]. */sh/ )

..........

exportar KBUILD_BUILDHOST := $(SUBARCH)

ARCH ?= $(SUBARCH )

CROSS_COMPILE ?=

O generar la interfaz de configuración mediante el comando make ARCH=arm menuconfig

Por ejemplo, la Oficina de Asuntos Académicos realiza exámenes y el Las materias del examen pueden incluir idiomas extranjeros, chino, matemáticas, etc. Materia, aquí hemos seleccionado la materia del brazo para realizar el examen y el sistema leerá el archivo arm/arm/kconfig para generar opciones de configuración (se selecciona la asignatura del brazo). ). El sistema también proporciona más de 10 cursos de tarea, como materias x86 y preguntas de examen milps.

3) Suponiendo que la Oficina de Asuntos Académicos sea más "misericordiosa" para evitar que algunos estudiantes obtengan. Las preguntas de la prueba fueron incorrectas, también nos prepararon una respuesta de referencia (opción de configuración predeterminada), que se almacena en arch/$ARCH/ En el directorio configs/, para el departamento de arm, es la carpeta arch/arm/configs:

Hay muchas opciones en esta carpeta, ¿cuál leerá el sistema? De forma predeterminada, el kernel leerá el archivo .config en el directorio raíz del kernel de Linux como la opción predeterminada del kernel (respuesta de referencia a la pregunta de prueba. Generalmente seleccionamos una serie más cercana a nuestra placa de desarrollo según el tipo de). placa de desarrollo y colóquelo en el directorio raíz del kernel de Linux (elija la respuesta de referencia más cercana)

4).config

Suponiendo que la Oficina de Asuntos Académicos lo esté vigilando. , la referencia que proporciona

La respuesta no es del todo correcta (el archivo .config no coincide exactamente con nuestra placa. En este momento, podemos optar por modificar directamente el archivo .config y luego ejecutar el comando make menuconfig para leer las nuevas opciones). Pero generalmente no adoptamos esta solución. Elegimos seleccionar o desmarcar ciertas opciones a través del espacio, esc e ingresar a la interfaz de configuración. Cuando finalmente guardemos y salgamos, el kernel de Linux actualizará las nuevas opciones (respuestas de referencia correctas). config. En este momento, podemos cambiar el nombre de .config a otros archivos y guardarlos (el sistema eliminará el archivo .config cuando ejecute make distclean. No necesitaremos ir a arch/arm/ al configurar el kernel). futuro El archivo correspondiente se obtiene en configuraciones, lo que evita la molestia de la reconfiguración. Simplemente copie el archivo .config guardado en .config.

5) Después de los dos pasos anteriores, podemos leerlo correctamente y configurarlo. la interfaz que necesitamos, entonces, ¿cómo establecen una relación de compilación con el archivo MAKE? Cuando guarda la opción make menuconfig, además de actualizar automáticamente el .config, el sistema también guardará todas las opciones en forma de macros en el archivo include/generated/autoconf.h en el directorio raíz del kernel de Linux.

El código fuente en el kernel contendrá el archivo .h anterior y la compilación condicional se realizará según la definición de la macro.

Cuando necesitamos elegir si compilar un archivo como un todo, también necesitamos modificar el archivo MAKE correspondiente. Por ejemplo:

Cuando elegimos si compilamos el archivo s3c2410_ts. c, el archivo MAKE La decisión de compilar este archivo se basará en CONFIG_TOUCHSCREEN_S3C2410. Esta macro se define en el archivo Kconfig. Cuando se complete nuestra configuración, aparecerá en .config y autconf. de todo el kernel de Linux.

Finalmente, encontraremos que en todo el proceso de configuración del kernel de Linux, las únicas interfaces que le quedan al usuario son Kconfig, los archivos makefile y los archivos fuente correspondientes en cada capa.

Por ejemplo, si queremos agregar una función al kernel y controlar su proceso de reclamo a través de make menuconfig

Lo primero que debemos hacer es: modificar el archivo Kconfig en el directorio correspondiente y siga Kconfig Agregue las opciones correspondientes a la sintaxis;

Luego ejecute make menuconfig para elegir si compilar en el kernel o no, o compilar en un módulo y. El archivo autoconf.h se generará automáticamente;

Finalmente, modifique el archivo makefile en el directorio correspondiente para completar la adición de opciones de compilación;

Finalmente, ejecute el comando make para compilar.

Kconfig y Makefile

Hay dos documentos, Kconfig y Makefile, en cada directorio del árbol de fuentes del kernel de Linux. Los Kconfig distribuidos a cada directorio constituyen una base de datos de configuración del kernel distribuida, y cada Kconfig describe el menú de configuración del kernel relacionado con el documento fuente del directorio al que pertenece. Al ejecutar la configuración del kernel, haga menuconfig, el menú se lee desde Kconfig, y el usuario lo selecciona y lo guarda en el documento de configuración del kernel de .config. Cuando se compila el kernel, el Makefile principal llama a este .config para conocer la elección del usuario. Este contenido muestra que Kconfig corresponde al menú de configuración de cada nivel del kernel.

Si desea agregar un nuevo controlador al código fuente del kernel, debe modificar Kconfig para poder seleccionar este controlador. Si desea que este controlador se compile, debe modificar el Makefile.

Hay dos tipos de documentos que deben modificarse al agregar un nuevo controlador (si está agregando solo archivos, solo necesita modificar los archivos Kconfig y Makefile de la capa actual; si está agregando un directorio, debe modificar el último par bajo la capa y directorio actual) Kconfig y Makefile) Kconfig y Makefile. Si desea saber cómo modificar estos dos documentos, necesita conocer la estructura de sintaxis de los dos documentos. Para conocer la sintaxis de Kconfig, consulte la referencia "linux-2.6.31kbuild".

El archivo Makefile contiene 5 partes:

Makefile de nivel superior Makefile

archivo de configuración del kernel .config

arch/$(ARCH )/ Arquitectura Makefile Makefile

scripts/Makefile.* Reglas comunes aplicables a todos los Makefiles de kbuild, etc.

Hay alrededor de 500 archivos de este tipo en los Makefiles de kbuild

Makefile de nivel superior Al leer el archivo .config generado por la operación de configuración del kernel, el Makefile de nivel superior construye dos objetivos principales: vmlinux (imagen del kernel) y módulos (todos los archivos de los módulos). Construye estos objetivos accediendo recursivamente a subdirectorios bajo el árbol de fuentes del kernel. A qué subdirectorios se accede depende de la configuración del kernel. El Makefile de nivel superior contiene un Makefile de arquitectura, especificado por arch/$(ARCH)/Makefile. El Makefile de arquitectura proporciona información específica de la arquitectura al Makefile de nivel superior. Cada subdirectorio tiene un archivo kbuild y un archivo Makefile para ejecutar los comandos pasados ​​desde la capa superior. Los archivos kbuild y Makefile utilizan la información del archivo .config para construir una lista de varios archivos utilizados por kbuild para crear objetos integrados o de módulo. scripts/Makefile.* contiene todas las definiciones/reglas, etc. Esta información se utiliza para construir el kernel utilizando archivos kbuild y Makefile. Para conocer la sintaxis de Makefile, consulte el documento de referencia "linux-2.6.31kbuild".

Referencias

guía de compilación del kernel linux-2.6.31.pdf

linux-2.6.31kbuild.pdf

Script del enlazador en Linux .pdf

Mecanismo de configuración del kernel de Linux y su proceso de compilación

Explicación detallada del proceso de compilación del kernel de Linux

Aprendizaje de Linux Kconfig y Makefile