Í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 p>
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 p>
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 p>
3.5.6 Otras pseudooperaciones 58 p>
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 p>
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 p>
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 p >
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 p>
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 p>
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 p>
25.5.1 Definición de interfaz PCI 1053 p>
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 p>
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