Red de conocimiento informático - Conocimiento informático - Índice de la Guía práctica para el desarrollo del kernel de Linux para sistemas integrados

Índice de la Guía práctica para el desarrollo del kernel de Linux para sistemas integrados

Parte 1 Desarrollo de hardware del sistema integrado

Capítulo 1 Descripción general del sistema integrado 2

Este capítulo presenta el concepto y las características de los sistemas integrados y se presenta brevemente la aplicación. El autor profundiza en la comprensión de los sistemas integrados basándose en sus muchos años de experiencia y compara los datos de hardware de algunos procesadores integrados comunes.

1.1 Concepto de sistema integrado 2

1.2 Procesador integrado 3

1.3 Aplicación de sistema integrado 4

1.4 Desarrollo de sistema integrado 4

1.5 Comparación de las características de hardware de algunos procesadores integrados 5

Capítulo 2 Descripción general de los procesadores ARM 16

Para completar el contenido de este libro, comience con la mayor parte de Los contenidos de los Capítulos 2 a 7 son notas y experiencias del autor al leer "Arquitectura y programación ARM" (consulte las referencias en el apéndice para obtener más detalles. Combinan conocimientos de hardware estrechamente relacionados con el desarrollo de sistemas integrados y el kernel de Linux). Este capítulo presenta principalmente las características de los procesadores ARM, la versión de arquitectura de los procesadores ARM y la serie de procesadores ARM.

2.1 Historial de desarrollo de ARM 16

2.2 Características del procesador ARM 17

2.3 Aplicaciones del procesador ARM 17

2.4 Arquitectura del sistema ARM 18

2.4.1 Versión de arquitectura ARM 18

2.4.2 Variante de arquitectura ARM (Variante) 20

2.4.3 Formato de nomenclatura de versión de arquitectura ARM 22

2.5 Procesador ARM 22

2.5.1 Procesador serie ARM7 23

2.5.2 Procesador serie ARM9 24

2.5 .3 Procesador serie ARM9E 24

2.5.4 Procesador serie ARM10E 25

2.5.5 Procesador serie SecurCore 25

2.5.6 Procesador StrongARM 26

2.5.7 Xscale procesador 26

Capítulo 3 Instrucciones ARM y sus métodos de direccionamiento 27

Este capítulo presenta principalmente las instrucciones y las instrucciones del procesador ARM Los modos de direccionamiento y las pseudoinstrucciones de ensamblaje ARM son conocimientos esenciales para desarrollar Software subyacente para sistemas de aplicaciones de procesadores ARM.

3.1 Registro de estado del programa (PSR) del procesador ARM 27

3.2 Código de condición de la instrucción ARM 28

3.3 Introducción a las instrucciones ARM 29

3.3.1 Instrucciones de salto 29

3.3.2 Instrucciones de procesamiento de datos 30

3.3.3 Instrucciones de multiplicación 31

3.3.4 Instrucciones aritméticas diversas 32

3.3.5 Comando de acceso al registro de estado 32

3.3.6 Comando de acceso a memoria Cargar/Almacenar 33

3.3.7 Comando de acceso a memoria Cargar/Almacenar por lotes 34

3.3.8 Instrucciones LDREX y STREX 35

3.3.9 Instrucciones de operación de semáforo 37

3.3.10 Instrucciones de generación de interrupciones de excepción 37

3.3.11 Instrucción del coprocesador ARM 37

3.4 Modo de direccionamiento de instrucciones ARM 39

3.4.1 Modo de direccionamiento de operandos de instrucciones de procesamiento de datos 39

3.4.2 Direccionamiento modo de palabra y byte sin signo instrucciones Load/Store 43

3.4.3 Modo de direccionamiento de instrucciones diversas Load/Store 47

3.4.4 Modo de direccionamiento de instrucciones Load/Store por lotes 49

3.4.5 Modo de direccionamiento de instrucciones Load/Store del coprocesador 51

3.4.6 Direccionamiento de instrucciones ARM Resumen de modos de direccionamiento 52

3.5 Pseudooperación del ensamblaje ARM (Directiva) 53

3.5.1 Pseudooperación de definición de símbolo 54

3.5.2 Pseudooperación de definición de datos 54

3.5.3 Pseudooperación de control de ensamblaje 56

3.5.4 Pseudooperación de descripción del marco de datos de pila 57

3.5.5 Pseudooperación de informe de información 57

3.5.6 Otras pseudooperaciones 58

3.6 Pseudoinstrucciones de ensamblaje ARM 59

3.7 Introducción a las instrucciones Thumb 60

Capítulo 4 Unidad de administración de memoria (MMU) del procesador ARM 61

Este capítulo presenta principalmente el principio de funcionamiento de la unidad de administración de memoria del procesador ARM (MMU). La función de administración de memoria de Linux se implementa a través de la MMU del hardware del procesador. En procesadores sin MMU En el sistema, Linux solo puede funcionar en modo de dirección física y no tiene. concepto de espacio de direcciones virtual (lineal).

4.1 Registro 61 del coprocesador CP15 en el procesador ARM

4.1.1 Instrucciones para acceder al registro CP15 61

4.1.2 Introducción al registro CP15 62

4.2 Introducción a MMU 70

4.3 El proceso de acceso del sistema al espacio de almacenamiento 71

4.3.1 La situación cuando MMU está habilitada 71

4.3 .2 Situación cuando MMU está deshabilitada 71

4.3.3 Problemas a los que se debe prestar atención al habilitar/deshabilitar MMU 72

4.4 Proceso de conversión de dirección del procesador ARM 72

4.4.1 Descriptor de mapeo de primer nivel de MMU 73

4.4.2 Descriptor de mapeo de segundo nivel de MMU 74

4.4.3 Proceso de traducción de direcciones basado en segmentos 75

4.4.4 Proceso de conversión de direcciones de páginas grandes de grano grueso 75

4.4.5 Proceso de conversión de direcciones de páginas pequeñas de grano grueso 76

4.4.6 Proceso de conversión detallado de direcciones de páginas grandes 76

4.4.7 Proceso de conversión detallado de direcciones de páginas pequeñas 77

4.4.8 Proceso de conversión detallado de direcciones de páginas muy pequeñas 77

4.5 Acceso al espacio de almacenamiento ARM Control de permisos 78

4.6 Operaciones TLB 79

4.6.1 Invalidar contenido TLB 79

4.6.2 Bloquear contenido TLB 79

4.6.3 Desbloqueo de la entrada de traducción de dirección bloqueada en el TLB 80

4.7 Fallo de acceso al almacenamiento 80

4.7.1 Fallo de MMU 80

4.7 .2 Fallo de acceso al almacenamiento externo (Aborto externo) 81

Capítulo 5 Caché y búfer de escritura del procesador ARM 82

Este capítulo presenta principalmente el caché del procesador ARM (Caché) y El principio de funcionamiento del búfer de escritura (Write Buffer) permite a los lectores comprender cómo mejorar el rendimiento del procesador.

5.1 Introducción general a la caché y al búfer de escritura 82

5.1.1 Principio de funcionamiento de la caché 82

5.1.2 Método de asignación de direcciones 83

5.1.3 Introducción al principio del método de escritura de caché 84

5.1.4 Acerca de la escritura directa y la reescritura 85

5.1.5 Estrategia de reemplazo de caché 86

5.1.6 La necesidad de usar Cache 87

5.1.7 La viabilidad de usar Cache 87

5.2 Caché y búfer de escritura en el procesador ARM 88

5.2.1 Conceptos básicos 88

5.2.2 Principio de funcionamiento de la caché 88

5.2.3 Método de transformación y asignación de direcciones de caché 89

5.2.4 Caché clasificación 90

5.2.5 Algoritmo de reemplazo de caché 91

5.2.6 Bloqueo de contenido de caché 91

5.2.7 Bit B y bit C en el descriptor de mapeo MMU Significado 92

5.2.8 Interfaz de programación de caché y Writer Buffer 93

5.3 Tecnología de cambio rápido de contexto del procesador ARM 94

5.3.1 Descripción general de FCSE 94

5.3.2 Principio FCSE 94

5.3.3 Interfaz de programación FCSE 95

Capítulo 6 Problemas de coherencia en el acceso al almacenamiento del procesador ARM 97

Este capítulo presenta Problemas de coherencia de acceso al almacenamiento que pueden ocurrir en sistemas que admiten MMU, caché y DMA, así como métodos para resolver problemas similares en Linux.

6.1 Introducción a los problemas de coherencia del acceso al almacenamiento97

6.1.1 Inconsistencia de datos causada por cambios en la relación de mapeo de direcciones97

6.1.2 Inconsistencia de datos en el caché de instrucciones Problemas de sexualidad 98

6.1.3 Inconsistencia de datos causada por DMA 99

6.1.4 Búsqueda previa de instrucciones y código automodificado 99

6.2 Resolver problemas de almacenamiento en Linux Métodos para acceder a problemas de coherencia 99

Capítulo 7 Modo de trabajo del procesador ARM y manejo de interrupciones de excepciones 101

Este capítulo presenta principalmente el modo de trabajo del procesador ARM y el proceso de manejo de interrupciones de excepciones. Este es un conocimiento esencial. para escritores de programas de arranque del sistema de procesador ARM o desarrolladores de cargadores de arranque.

7.1 Modo de trabajo del procesador ARM 101

7.2 Tabla de vectores de interrupción de excepción del procesador ARM y nivel de prioridad 103

7.3 Manejo de interrupción de excepción del procesador ARM 104

p>

7.3.1 Ingresar al procesamiento de interrupción de excepción 104

7.3.2 Salir del procesamiento de interrupción de excepción 105

7.4 Interrupción del procesador ARM (IRQ o FIQ) 109

Capítulo 8 Proceso de inicio del procesador ARM 110

Este capítulo presenta el proceso de inicio del sistema de procesador ARM basado en la experiencia de desarrollo del autor y los asuntos que requieren atención al escribir el programa de inicio para el sistema de procesador ARM.

8.1 Operación de encendido/restablecimiento del procesador ARM 110

8.2 Proceso de inicialización del sistema del procesador ARM 111

8.3 Consideraciones de programación de inicialización del sistema del procesador ARM 111

Capítulo 9 Diseño y depuración de sistemas integrados 113

Este capítulo presenta el proceso de diseño y los métodos de depuración de sistemas integrados basándose en los más de 10 años de experiencia en desarrollo del autor y enumera una gran cantidad de problemas encontrados. en la obra del autor.

El contenido de este capítulo tiene un alto valor de referencia y orientación para el desarrollo y la depuración de hardware de sistemas integrados.

9.1 Proceso de diseño de sistemas integrados 113

9.2 Diseño y revisión del principio de hardware de sistemas integrados 114

9.3 Software de herramientas de diseño de hardware 117

9.4 Herramienta de simulación de depuración de sistemas integrados 117

9.5 Método de diagnóstico y depuración de sistemas integrados 118

Capítulo 10 Herramienta de programación y descarga JTAG simple y casera 123

Este capítulo se basa en Se presenta la propia experiencia del autor en la fabricación de cables JTAG simples, los principios de hardware y los procesos de software de los cables JTAG simples. Esta es la herramienta más barata necesaria para los principiantes y debe dominarse.

10.1 Introducción a JTAG 123

10.1.1 Algunos conceptos básicos 124

10.1.2 Señales de interfaz JTAG 124

10.1.3 Máquina de estado del controlador TAP 125

10.1.4 Conjunto de instrucciones de interfaz JTAG 129

10.2 Principio simple del cable JTAG 130

10.2.1 Definición del puerto paralelo de PC 130< / p>

10.2.2 Registro de puerto paralelo de PC 131

10.2.3 Diagrama esquemático del cable JTAG simple 133

10.2.4 Diagrama de conexión de programación del cable JTAG simple (Ver Figura 10- 5) 134

10.3 Análisis de código de programación JTAG simple 135

10.3.1 Instrucciones de uso del programa de programación JTAG simple (flashp) 135

10.3.2 Flash y CPU archivo de descripción de atributos de conexión y flash 136

10.3.3 Lógica de ejecución y proceso de un programa de programación JTAG simple 138

Parte 2 Desarrollo preliminar del kernel de Linux

p>

Capítulo 11 Cargador de arranque 142

Este capítulo presenta varios cargadores de arranque populares, las funciones básicas que deben tener los cargadores de arranque y el corte y trasplante de cargadores de arranque según la experiencia laboral del autor.

11.1 Las tareas y funciones del gestor de arranque 142

11.2 Varios gestores de arranque 143

11.3 Entorno de compilación del gestor de arranque 144

11.4 Trasplante y reducción del gestor de arranque 145

11.5 Compilación del gestor de arranque 145

11.6 Programación del gestor de arranque 146

11.7 Ejemplos de uso del gestor de arranque 148

11.8 Ejemplo de modificación del gestor de arranque 149

Capítulo 12 Creación de un entorno de desarrollo Linux integrado 151

Este capítulo presenta cómo crear un entorno de desarrollo cruzado del kernel de Linux para sistemas integrados. El contenido de este capítulo y los tres capítulos siguientes trata sobre los sistemas integrados. Se deben dominar los conceptos básicos del desarrollo del kernel de Linux del sistema.

12.1 Instalar el host Linux 151

12.2 Instalar el host Linux 152 en la máquina virtual

12.3 Instalar el entorno de compilación cruzada de Linux 157

12.4 Configurar el servidor TFTP 160 en el host

12.5 Configurar el servidor DHCP 161 en el host

12.6 Configurar el servidor Telnet 161 en el host

12.7 Usado durante el desarrollo NFS 162

12.8 Configuración de HyperTerminal 163

Capítulo 13 Compilación del kernel de Linux 166

Este capítulo presenta la configuración y el método de compilación del kernel de Linux.

13.1 Obtención del código fuente del kernel de Linux 166

13.2 Estructura de directorios del kernel de Linux 166

13.3 Configuración del kernel de Linux 167

13.4 Compilación el kernel de Linux 168

Capítulo 14 Creación de un sistema de archivos raíz de Linux 170

Este capítulo presenta la estructura del sistema de archivos raíz de Linux y el método para crear un sistema de archivos raíz.

14.1 Descripción general del sistema de archivos raíz 170

14.2 Estructura de directorios del sistema de archivos raíz 171

14.3 Obtención del código fuente del componente del sistema de archivos raíz 171

14.4 Compilar el código fuente del sistema de archivos raíz 171

14.5 Crear un sistema de archivos raíz RAMDISK de 32 MB 173

14.6 Agregar módulos de controlador o aplicaciones al sistema de archivos raíz 173

Capítulo 15 Curar el kernel de Linux y el sistema de archivos raíz 174

Este capítulo presenta el método de curar (grabar) el kernel de Linux y el sistema de archivos raíz.

Capítulo 16 Acerca de Clinux 176

Este capítulo presenta brevemente las diferencias entre Clinux y Linux estándar.

16.1 ?Introducción a Clinux 176

16.2 ?Estructura de directorios del código fuente de Clinux 177

16.3 ?La diferencia entre Clinux y Linux estándar 178

16.4 ¿Compilación? Clinux 179

Parte 3 Principio del kernel de Linux 2.6

Capítulo 17 Proceso de inicio de Linux 2.6.10@ARM 182

Este capítulo comienza con start_kernel () y el método de descripción de la función llamado en la función init(), presenta todo el proceso de inicio de Linux desde la entrada del código ensamblador de Linux hasta el proceso de inicio del kernel y finalmente se llama al comando init del espacio de usuario. El contenido de este capítulo son los comentarios del autor sobre estas funciones cuando leí por primera vez el código fuente del kernel de Linux. Es solo para que los lectores comprendan la función general de cada función llamada en las funciones start_kernel () e init ().

17.1 Estructuras y variables globales relacionadas con el hardware de la plataforma del procesador ARM en Linux 2.6.10182

17.1.1 Estructuras de datos relacionadas 182

17.1.2 Global relacionada variables 187

17.2 Entrada del código ensamblador de Linux 189

17.3 Estado de la CPU en la entrada del ensamblador de Linux 189

17.4 Ejecución del código ensamblador antes del proceso de la función start_kernel() 190

17.5 Introducción a las funciones llamadas en la función start_kernel() 192

17.5.1 función lock_kernel() 192

17.5.2 función page_address_init() 192

17.5.3 printk(linux_banner) 193

17.5.4 función setup_arch(amp; command_line) 193

17.5.5 función setup_per_cpu_areas() 198

p>

17.5.6 smp_prepare_boot_cpu() función 199

17.5.7 sched_init() función 199

17.5.8 build_all_zonelists() función 200

17.5.9 page_alloc_init() función 200

17.5.10 printk(Línea de comando del kernel: s\n, save_command_line) 201

17.5.11 parse_early_param() función 201

17.5.12 función parse_args() 201

17.5.13 función sort_main_extable() 202

17.5.14 función trap_init() 202

17.5 15 Función rcu_init() 202

17.5.16 Función init_IRQ() 203

17.5.17 Función pidhash_init() 203

17.5.18 init_timers(). función 203

17.5.19 función softirq_init() 204

17.5.20 función time_init() 204

17.5.21 función console_init() 205

17.5.22 función perfil_init() 206

17.5.23 función local_irq_enable() 207

17.5.24 función vfs_caches_init_early() 207

17.5 25 función mem_init() 208

17.5.26 función kmem_cache_init() 210

17.5.27 función numa_policy_init() 225

17.5.28 calibrate_delay(). función 227

17.5.29 pidmap_init() función 228

17.5.30 pgtable_cache_init() función 229

17.5.31 prio_t

función ree_init() 229

17.5.32 función anon_vma_init() 229

17.5.33 función fork_init(num_physpages) 229

17.5.34 función proc_caches_init() 230

17.5.35 función buffer_init() 231

17.5.36 función unnamed_dev_init() 231

17.5.37 función security_init() 231

17.5.38 función vfs_caches_init(num_physpages) 232

17.5.39 función radix_tree_init() 237

17.5.40 función signal_init() 237

17.5 .41 función page_writeback_init() 237

17.5.42 función proc_root_init() 238

17.5.43 función check_bugs() 240

17.5.44 acpi_early_init() Función 244

17.5.45 función rest_init() 244

17.6 proceso de ejecución del proceso init() 265

17.6.1 función smp_prepare_cpus (max_cpus) 265

17.6.2 función do_pre_smp_initcalls() 265

17.6.3 función fixup_cpu_present_map() 267

17.6.4 función smp_init() 267

17.6.5 función sched_init_smp() 268

17.6.6 función populate_rootfs() 268

17.6.7 función do_basic_setup() 283

17.6.8 sys_access( ) función 292

17.6.9 función free_initmem() 301

17.6.10 función unlock_kernel() 301

17.6.11 función numa_default_policy() 302

17.6.12 función sys_dup() 302

17.6.13 función execve() 302

Capítulo 18 Administración de memoria de Linux 305

Desde en Al comienzo de este capítulo, el autor conducirá a los lectores al misterioso mundo del kernel de Linux. Basado en la lectura del código fuente del kernel y dos libros de referencia relacionados (ver referencias), el autor resumió los principios de cada componente del kernel de Linux con su propia comprensión y lenguaje. El autor explica las estructuras de datos clave y las variables globales relacionadas con cada componente del kernel con el mayor detalle posible y proporciona anotaciones detalladas sobre las funciones principales. Mientras inculca conocimientos teóricos a los lectores, el autor los guía para leer y analizar la fuente del kernel de Linux. código por su cuenta. Este capítulo explica el principio y los detalles de implementación de la "administración de memoria", el primer componente central del kernel de Linux.

18.1 Descripción general de la administración de memoria de Linux 305

18.1.1 Algunos conceptos básicos de la administración de memoria de Linux 305

18.1.2 Estructuras de datos relacionadas con la administración de memoria 309

18.1.3 Macros y variables globales relacionadas con la gestión de memoria 330

18.1.4 Tareas de gestión de memoria de Linux 341

18.1.5 Disposición del espacio de almacenamiento físico y virtual en Linux 341

18.2 Establecer tablas de páginas para el espacio de almacenamiento virtual (dirección lineal) 345

18.3 Establecer atributos de control de acceso del espacio de almacenamiento 348

18.4 Asignación y versión de memoria 350

18.4.1 Solicitar memoria 350 en la etapa inicial del inicio del sistema

18.4.2 Asignación y liberación de memoria después del inicio del sistema 360

Capítulo 19 Proceso de Linux Gestión 480

Este capítulo explica los principios y detalles de implementación de la "gestión de procesos", el segundo componente central del kernel de Linux.

19.1 Descripción general de la gestión de procesos 480

19.1.1 Conceptos relacionados con los procesos 480

19.1.2 Clasificación de procesos 481

19.1.3 0 Proceso No. 481

19.1.4 Proceso No. 1 481

19.1.5 Algunos otros subprocesos del núcleo 482

19.1.6 Descriptor de proceso (struct task_struct ) 482

19.1.7 Estado del proceso 482

19.1.8 Identificador de proceso (PID) 483

19.1.9 Definición de macro actual 484

19.1.10 Lista enlazada de procesos 484

19.1.11 Tabla hash PID y lista enlazada 485

19.1.12 Contexto de hardware (Contexto de hardware) 485

19.1.13 Limitaciones de recursos de proceso 485

19.1.14 Estructuras de datos relacionadas con la gestión de procesos 486

19.1.15 Definiciones de macros relacionadas con la gestión de procesos 502

19.1. 16 Situaciones globales relacionadas con la gestión de procesos Variables 514

19.2 Inicialización relacionada con la gestión de procesos 520

19.3 Creación y eliminación de procesos 529

19.4 Programación de procesos 551

19.4.1 Tipo de proceso 553

19.4.2 Tipo de programación de proceso 554

19.4.3 Método básico de cálculo del intervalo de tiempo 555

19.4.4 Algoritmo de prioridad dinámica 556

19.4.5 Proceso interactivo 556

19.4.6 Programación de procesos ordinarios 557

19.4.7 Programación de procesos en tiempo real 557

19.4.8 Análisis de la función de programación de procesos 558

19.5 Conmutación de procesos 576

19.6 Comunicación entre procesos en modo usuario 581

19.6.1 Señal 581

19.6.2 Tuberías (pipe) y FIFO (named pipes) 627

19.6.3 Primitivas de comunicación entre procesos (System V IPC) 641

Capítulo 20 Gestión de archivos de Linux 651

Este capítulo explica los principios y los detalles de implementación del tercer componente central del kernel de Linux, el "sistema de archivos".

20.1 Descripción general del sistema de archivos 651

20.1.1 Conceptos relacionados con la administración de archivos de Linux 652

20.1.2 Estructuras de datos relacionadas con la administración de archivos de Linux 657

20.1.3 Definiciones de macros relacionadas con la administración de archivos de Linux 682

20.1.4 Variables globales relacionadas con la administración de archivos de Linux 691

20.2 Inicialización relacionada con la administración de archivos 699

20.3 Registro del tipo de sistema de archivos 711

20.4 Montaje del sistema de archivos 712

20.5 Lectura de superbloque del tipo de sistema de archivos 730

20.5.1 get_sb_single() Función de lectura de superbloque universal 731

20.5.2 get_sb_nodev() Función de lectura de superbloque universal 737

20.5.3 get_sb_bdev() Función de lectura de superbloque universal 738

20.5.4 get_sb_pseudo() función general de lectura de superbloque 740

20.6 Búsqueda de nombre de ruta 747

20.7 Operación de acceso al archivo 759

20.7.1 Abrir archivo 759

20.7.2 Cerrar archivo 766

20.7.3 Leer archivo 768

20.7.4 Escribir archivo 785

20.8 Asíncrono I/ O llamada al sistema 792

20.9 Sistema de archivos especial Linux 792

20.9.1 Sistema de archivos rootfs 793

20.9.2 Sistema de archivos sysfs 797

20.9.3 sistema de archivos del dispositivo devfs 800

20.9.4 sistema de archivos del dispositivo de bloque bdev 803

20.9.5 sistema de archivos ramfs 804

20.9. sistema de archivos proc 804

20.10 Sistema de archivos de disco 813

20.10.1 estructura de datos relacionada con el sistema de archivos ext2 813

20.10.2 formato de partición de disco del sistema de archivos ext2 819

20.10.3 Varios archivos del sistema de archivos ext2 820

20.10.4 Creación del sistema de archivos ext2 821

20.10.5 Método de operación del sistema de archivos ext2 822

20.11 Acerca de initramfs 824

20.11.1 Descripción general de initramfs 824

20.11.2 La diferencia entre initramfs e initrd 824

20.11. 3 variables globales relacionadas con initramfs825

20.11.4 La ubicación donde se compila y vincula initramfs825

20.11.5 El proceso de generación del archivo initramfs825

20.11.6 initramfs Descripción del formato de archivo binario (formato cpio) 828

20.11.7 Ejemplo de comparación de archivos binarios y archivos de lista de Initramfs 829

20.11.8 Pros y contras de initramfs 830

20.12 Acerca de initrd 830

20.12.1 Descripción general de initrd 830

20.12.2 Variables globales relacionadas con initrd 831

20.13 Acerca de los archivos comprimidos gzip 832

Capítulo 21 Diseño del módulo Linux 834

Este capítulo explica la diferencia entre los programas y aplicaciones del módulo del kernel de Linux y cómo escribir y cargar programas del módulo del kernel de Linux.

21.1 Descripción general del diseño de módulos de Linux 834

21.2 Espacio del kernel de Linux y espacio de usuario 834

21.3 La diferencia entre módulos del kernel y aplicaciones 835

21.4 Compilación de módulos 837

21.5 Carga y descarga de módulos 837

21.6 Apilamiento de módulos 838

21.7 Dependencias de la versión del módulo 839

21.8 Ejemplo de programación del módulo 839

Capítulo 22 Gestión de interrupciones anormales del sistema Linux 841

Este capítulo explica cómo el kernel de Linux gestiona las interrupciones anormales del sistema y la historia interna de la implementación de las llamadas al sistema Linux.

22.1 Manejo de interrupciones de excepciones de Linux 841

22.2 Manejo de interrupciones de excepciones de aborto de acceso a datos y captación previa de instrucciones 849

22.2.1 Manejo de interrupciones de excepciones de aborto de captación previa de instrucciones 850

22.2.2 Procesamiento de interrupción de excepción de aborto de acceso a datos 858

22.3 Procesamiento de interrupción de Linux 863

22.3.1 Procesamiento de interrupción en modo kernel 863

22.3.2 Manejo de interrupciones en modo usuario 867

22.4 Retorno de interrupciones 868

22.5 Gestión de interrupciones de Linux 869

22.5.1 Gestión de interrupciones de Linux Estructuras de datos relacionadas y variables globales 870

22.5.2 Inicialización de la gestión de interrupciones de Linux 872

22.5.3 Instalación y desinstalación de controladores de interrupciones 874

22.5.4 Uso de habilitar y deshabilitar interrupciones 878

22.6 Llamada al sistema Linux 880

22.6.1 Proceso de implementación del kernel de llamada al sistema Linux 880

22.6.2 Regreso de la llamada al sistema 889

22.6.3 El sistema Linux llama a funciones de interfaz de programa de usuario 890

22.6.4 Transferencia de parámetros entre el sistema Linux llama a funciones de interfaz de usuario y funciones de implementación del kernel 899

Capítulo Capítulo 23 Softirq y trabajo de Linux Cola 901

Este capítulo explica el principio y la implementación de los dos mecanismos de procesamiento de retraso "softirq" y "cola de trabajo" en el kernel de Linux.

23.1 Descripción general 901

23.2 Interrupción suave de Linux 902

23.2.1 Estructuras de datos relacionadas con interrupciones suaves y variables globales 903

23.2. 2 Inicialización de interrupción suave 904

23.2.3 La función de operación central de la interrupción suave do_softirq() 908

23.2.4 La función de ejecución del proceso de cuidado de interrupción suave ksoftirqd() 912

23.2.5 Cómo utilizar interrupciones suaves 913

23.3 Cola de trabajo de Linux 918

23.3.1 Estructuras de datos relacionadas con la cola de trabajo de Linux y variables globales 918

23.3 .2 Inicialización de la cola de trabajos de Linux 921

23.3.3 Agregar trabajo a la cola de trabajos 924

23.3.4 Función de ejecución del proceso de trabajo trabajador_thread() 928

23.3.5 Uso de la cola de trabajo de Linux 931

Capítulo 24 Concurrencia de Linux y condiciones de carrera 933

Este capítulo explica el mecanismo de sincronización del kernel de Linux, incluidas varias tecnologías de bloqueo y algoritmos sin bloqueo. .

24.1 Descripción general de la concurrencia y las condiciones de carrera933

24.1.1 Fuentes de concurrencia en Linux934

24.1.2 Posibles consecuencias de las condiciones de carrera934

24.1.3 Reglas para evitar condiciones de carrera934

24.2 Tecnología de "bloqueo" para eliminar condiciones de carrera935

24.2.1 Semáforo (sénforo) y mutex (exclusión mutua) 935

24.2.2 Leer y escribir semáforo (rw_semaphore) 938

24.2.3 Finalizar (finalizar) 941

24.2.4 Spin Lock (spinlock_t) 942

24.2.5 Bloqueo de giro de lectura y escritura (rwlock_t) 946

24.2.6 Precauciones para el uso de la tecnología "lock" 949

24.3 Métodos sin "bloqueo" para eliminar las condiciones de carrera 949

24.3.1 Algoritmos sin bloqueo 949

24.3.2 Operaciones atómicas 950

24.3.3 Operaciones de bits 951

24.3. 4 Bloqueo secuencial 952

24.3.5 Lectura, copia y actualización (RCU) 954

Capítulo 25 Controlador de dispositivo Linux 958

Este capítulo explica los principios y la implementación Detalles del cuarto componente central del kernel de Linux, el "controlador de dispositivo". Al mismo tiempo, también resume los métodos y pasos para escribir varios controladores de dispositivos.

25.1 Descripción general del controlador del dispositivo 958

25.1.1 Componentes del controlador del dispositivo 959

25.1.2 Número de dispositivo 959

25.1 .3 Dispositivo archivo 960

25.1.4 Clave para escribir el controlador del dispositivo 961

25.2 Controlador del dispositivo de caracteres 961

25.2.1 Estructura de datos relacionada con el dispositivo de caracteres 961

25.2.2 Variables globales relacionadas con dispositivos de caracteres 963

25.2.3 Inicialización global del controlador de dispositivos de caracteres 963

25.2.4 Asignar números de dispositivo a dispositivos de caracteres 964

25.2.5 Registrar el controlador del dispositivo de caracteres 968

25.2.6 Método de operación del dispositivo de caracteres 971

25.2.7 Comentarios del usuario sobre el proceso de llamada del controlador del dispositivo de caracteres 972

25.2.8 Cómo escribir el controlador de dispositivo de caracteres 974

25.2.9 Acerca del controlador de dispositivo TTY 974

25.2.10 Programa 975 del controlador de dispositivo de consola

25.3 Controlador de dispositivo de bloque 986

25.3.1 Estructura de datos relacionada con el dispositivo de bloque 986

25.3.2 Definición de macro relacionada con el dispositivo de bloque 997

25.3.3 Relacionada con el dispositivo de bloque variables globales 999

25.3.4 Inicialización global del controlador de dispositivo de bloque 1004

25.3.5 Asignar número de dispositivo principal al dispositivo de bloqueo 1006

25.3.6 Registrar dispositivo de bloque driver 1009

25.3.7 Método de operación del controlador de dispositivo de bloque 1017

25.3.8 Llamar al proceso del controlador de dispositivo de bloque 1017

25.3.9 Programación de E/S 1031

25.3.10 Cómo escribir un controlador de dispositivo de bloque 1032

25.4 Controlador de dispositivo de red 1033

25.4.1 Descripción general del controlador de dispositivo de red 1033

25.4.2 Estructura de datos relacionados con dispositivos de red 1034

25.4.3 Definición de macro relacionada con dispositivos de red 1044

25.4 .4 Variables globales relacionadas con dispositivos de red 1045

25.4.5 Crear estructura net_device 1046

25.4.6 Registrar dispositivos de red 1048

25.4.7 Operaciones de dispositivos de red Método 1050

25.4.8 Dispositivo de red programa de servicio de interrupción 1051

25.4.9 Cómo escribir un controlador de dispositivo de red 1051

25.5 Controlador de dispositivo PCI 1052

25.5.1 Definición de interfaz PCI 1053

25.5.2 Tres espacios de direcciones de dispositivos PCI 1057

25.5.3 Arbitraje de bus PCI 1058

25.5.4 Número de dispositivo PCI 1059

25.5.5 Cómo acceder al espacio de configuración PCI 1059

25.5.6 Cómo configurar el dispositivo PCI 1061

25.5.7 Estructuras de datos relacionadas con el controlador PCI 1062

25.5.8 Definiciones de macros relacionadas con el controlador PCI 1068

25.5.9 Variables globales relacionadas con el controlador PCI 1068

25.5.10 Qué hacen el gestor de arranque y el kernel 1069

25.5.11 Registro del controlador PCI 1069

25.5.12

Función de interfaz del controlador PCI 1071

25.5.13 Cómo escribir el controlador PCI 1072

Parte 4 Guía avanzada para el desarrollo del kernel de Linux

Capítulo 26 Configuración de parámetros del sistema Linux 1076

Los capítulos siguientes a partir de este capítulo explican principalmente el conocimiento más avanzado del kernel de Linux o el conocimiento sobre el kernel de Linux al que rara vez se presta atención. Este capítulo explica los cuatro formatos de parámetros del sistema y los métodos de configuración en. Linux.

26.1 Parámetros del sistema de semáforo (etiqueta) 1076

26.1.1 Estructuras de datos y variables globales relacionadas con los parámetros del sistema de semáforo 1076

26.1.2 Descripción del sistema de semáforo parámetros 1082

26.1.3 Método de configuración de parámetros del sistema de semáforo 1084

26.2 Parámetros del sistema establecidos por la línea de comando inicial 1084

26.2.1 Relacionado con el comando inicial parámetros del sistema de línea Estructura de datos y variables globales 1084

26.2.2 Descripción de los parámetros del sistema establecidos por la línea de comando inicial 1085

26.2.3 Método de configuración de los parámetros del sistema del comando inicial línea 1086

26.2.4 Cómo agregar sus propios parámetros del sistema establecidos por la línea de comando anterior 1087

26.3 Parámetros del sistema de línea de comando antigua 1087

26.3 .1 Estructura de datos y datos globales relacionados con los parámetros del sistema de línea de comando antigua Variable 1087

26.3.2 Descripción de los parámetros del sistema para la configuración de la línea de comando antigua 1088

26.3.3 Sistema método de configuración de parámetros para la configuración de la línea de comando anterior 1089

26.3.4 Cómo agregar sus propios parámetros del sistema establecidos por la línea de comando anterior 1089

26.4 Parámetros del sistema de la línea de comando 1089

26.4.1 Estructuras de datos y variables globales relacionadas con los parámetros del sistema de línea de comando 1089

26.4.2 Descripción de los parámetros del sistema establecidos por la línea de comando 1090

26.4.3 Método de configuración parámetros del sistema establecidos por la línea de comando 1090

Capítulo 27 Depuración del kernel de Linux 1091

Este capítulo presenta el método de depuración del kernel de Linux.

27.1 Activar el interruptor de depuración del kernel de Linux y de cada módulo 1091

27.2 Perfilado del kernel (Profiling) 1093

27.3 Depuración mediante impresión (printk) 1095

27.3.1 Acerca de printk() 1095

27.3.2 Nivel de información del kernel 1096

27.3.3 Límite de velocidad de impresión 1097

27.3.4 Redirección de consola 1098

27.4 Depuración 1098 usando el sistema de archivos proc

27.5 mensaje oops 1098

27.6 Depuración 1099 a través del comando trace strace

27.7 Uso de gdb, kdb y kgdb para depurar 1099

Capítulo 28 Trasplante del kernel de Linux 1101

Este capítulo presenta el método de trasplante del kernel de Linux.

Capítulo 29 Optimización del kernel de Linux 1104

Este capítulo presenta los métodos de optimización del kernel de Linux.

29.1 Optimización de la compilación 1104

29.2 Optimizar según las características de la CPU 1105

29.3 Reducir el kernel 1105

29.4 Optimizar la configuración de la memoria del sistema 1106

29.5 Optimizar el proceso de inicio del sistema para reducir el tiempo de inicio del sistema 1106

29.6 Optimización del mapeo de memoria 1107

29.7 Optimización asistida por software de herramientas 1107

Capítulo 30 Temporizador de Linux 1109

Este capítulo presenta el temporizador de software del kernel de Linux.

30.1 Estructura de datos relacionados con el temporizador 1109

30.2 Definición de macro relacionada con el temporizador 1111

30.3 Variables globales relacionadas con el temporizador 1112

30.4 Inicialización de temporizador y reloj 1113

30.5 Obtención de la hora del sistema 1114

30.6 Función de retardo 1115

30.7 Llamadas al sistema relacionadas con temporizadores 1115

30.8 Usando el método del temporizador 1116

Capítulo 31 Varios 1117

Este capítulo presenta la variable PER_CPU y las definiciones de tipos de datos en Linux.

31.1 Variable per_cpu 1117

31.2 Definición del tipo de datos en Linux 1118

Capítulo 32 Instrucciones de compilación y enlace de archivos 1119

Comentarios para esto capítulo El archivo de enlace del kernel de Linux en el sistema de procesador ARM se proporciona para ayudar a los lectores a comprender la ubicación de almacenamiento de cada sección del kernel de Linux compilado en la memoria.

Referencia 1125