La Red de Conocimientos Pedagógicos - Currículum vitae - Directorio para la programación del kernel de Linux

Directorio para la programación del kernel de Linux

Contenido

Capítulo 1 Descripción general 1

1.1 Historia de UNIX 2

1.2 Estándares e interfaces comunes 3

1.3 Software libre y código abierto 3

1.4 Descripción general de las distribuciones de Linux 3

1.41 Debian 4

1.42 Red Hat/Fedora 4

1.43 Mandriva 4

1.44 SUSE 4

1.45 Gentoo 4

1.46 Yellow Dog 5

1.47 Otras distribuciones 5

1.5 Información de la versión del kernel 5

1.6 Linux basado en energía 5

1.7 Qué es un sistema operativo 6

1.8 Organización del kernel 7

1.9 Descripción general del kernel de Linux 7

1.9.1 Interfaz de usuario 7

1.9.2 Identificador de usuario 8

1.9.3 Archivos y sistemas de archivos 8

1.9.4 Proceso 12

1.9.5 Llamada al sistema 15

1.9.6 Programador de Linux 15

1.9.7 Controladores de dispositivos Linux 15

1.10 Portabilidad y dependencias de arquitectura 16

1.11 Resumen 16

1.12 Ejercicio 16

Capítulo 2 Conjunto de herramientas de exploración del kernel 18

2.1 Tipos de datos comunes en el kernel 18

2.1.1 Lista enlazada 18

2.1.2 Búsqueda 21

2.1.3 Árbol 22

2.2 Ensamblador 24

2.2.1 PowerPC 24

2.2.2 x86 27

2.3 Ejemplo de lenguaje ensamblador 29

2.3.1 Ejemplo de ensamblaje 30 en x86

2.3.2 Ejemplo de ensamblaje 31 en PowerPC

2.4 Ensamblaje en línea 33

2.4.1 Operando de salida 34

2.4.2 Operando de entrada 34

2.4.3 Registro modificado (lista de elementos modificados) 34

2.4.4 Numeración de parámetros 34

2.4.5 Restricciones 34

2.4.6 asm 35

2.4.7 __volatile__ 35

2.5 Uso especial del lenguaje C 38

2.5.1 asmlinkage 38

2.5.2 UL 39

2.5.3 En línea 39

2.5.4 constante y volátil 39

2.6 Herramientas de exploración del kernel de un vistazo 40

2.6.1 objdump/readelf 40

2.6.2 hexdump 41

2.6.3 nm 41

2.6.4 objcopy 42

2.6.5 ar 42

2.7 Kernel hablando: escuchando mensajes del kernel 42

2.7.1 printk( ) 42

2.7.2 dmesg 42

2.7.3 /var/log/ mensajes 42

2.8 Otros misterios 43

2.8 .1 __ini

t 43

2.8.2 probable() y improbable() 43

2.8.3 IS_ERR y PTR_ERR 44

2.8.4 Cadena de programas de notificación 44 p>

2.9 Resumen 45

2.9.1 Proyecto: Hellomod 45

2.9.2 Paso uno: Construir el marco del módulo Linux 45

2.9 .3 Paso 2: Compile el módulo 46

2.9.4 Paso 3: Ejecute el código 47

2.10 Ejercicio 48

Capítulo 3 Proceso: Programa Modelo básico de ejecución 49

3.1 Programa 51

3.2 Descriptor de proceso 52

3.2.1 Campos relacionados con atributos del proceso 54

3.2. 2 Campos 55 relacionados con la programación

3.2.3 Campos 58 relacionados con la relación entre procesos

3.2.4 Campos relacionados con las credenciales de proceso 59

3.2.5 Campos relacionados con capacidades de proceso 60

3.2.6 Campos relacionados con restricciones de proceso 61

3.2.7 Campos relacionados con sistemas de archivos y espacios de direcciones 63

3.3 Creación del proceso: llamadas al sistema fork(), vfork y clone() 64

3.3.1 Función fork() 65

3.3.2 Función vfork() 66

3.3.3 Función clone() 67

3.3.4 Función do_fork() 68

3.4 Ciclo de vida del proceso 70

3.4.1 Estado del proceso 70

3.4.2 Transición del estado del proceso 71

3.5 Terminación del proceso 74

3.5.1 Función sys_exit() 75

3.5.2 Función Do_exit() 75

3.5.3 Notificar al proceso padre y sys_wait4() 77

3.6 Comprender la dinámica del proceso: planificador Estructura básica 80

3.6.1 Estructura básica 80

3.6.2 Despertar de la espera o activación 81

3.7 Cola de espera 86

3.7.1 Agregar a la cola de espera 88

3.7.2 Esperar evento 89

3.7.3 Proceso de activación 91

3.8 Proceso de ejecución asincrónica 93

3.8.1 Excepción 93

3.8.2 Interrupción 95

3.9 Resumen 114

3.9.1 Proyecto: Variable del sistema actual 114

3.9.2 Proyecto Código fuente 115

3.9.3 Código en ejecución 116

3.10 Ejercicios 116

Capítulo 4 Gestión de la memoria 117

4.1 Página 119

4.2 Área de administración de memoria 121

4.2.1 Descriptor del área de administración de memoria 122

4.2.2 Operación del área de administración de memoria Función auxiliar 124

4.3 Página 124

4.3.1 Función para solicitar la página 124

4.3.2 Función para liberar la página 126

4.3.3 Sistema asociado 126

4.4 Asignador de losa 130

4.4.1 Descriptor de caché 133

4.4.2 Descriptor de caché universal 135

4.4.3 Descripción de losa

Carácter 136

4.5 Ciclo de vida del asignador Slab 138

4.5.1 Variables globales relacionadas con el asignador Slab 138

4.5.2 Creación de caché 139

4.5.3 Creando slab y cache_grow() 144

4.5.4 Destrucción de slab: devolución de memoria y kmem_cache_destroy() 146

4.6 Ruta de solicitud de memoria 147

4.6.1kmalloc()147

4.6.2kmem_cache_alloc()148

4.7 Estructura de memoria del proceso Linux 149

4.7 1 mm_struct 150

4.7.2 vm_area_struct 152

4.8 Distribución de la imagen del proceso y espacio de direcciones lineales 153

4.9 Tabla de páginas 155

4.10 Falta página 156

4.10.1 Falta página x86 excepción 156

4.10.2 Falta controlador de página 157

4.10.3 Falta página PowerPC excepción 164

4.11 Resumen 164

4.12 Proyecto: Mapeo de memoria de procesos 165

4.13 Ejercicios 166

Capítulo 5 Entrada/Salida 167

5.1 Implementación de hardware de buses, puentes, puertos e interfaces 167

5.2 Dispositivos 171

5.2.1 Descripción general de los dispositivos de bloque 172

5.2.2 Cola de solicitudes y programación de E/S 173

5.2.3 Ejemplo: Controlador de dispositivo de bloque "genérico" 180

5.2.4 Operaciones del dispositivo 182

5.2 5. Dispositivo de caracteres 183

5.2.6 Dispositivo de red 184

5.2.7 Dispositivo de reloj 184

5.2.8 Dispositivo terminal 184

5.2.9 Acceso directo a memoria 184

5.3 Resumen 185

5.4 Proyecto: Creación de un controlador de puerto paralelo 185

5.4.1 Hardware de puerto paralelo 185

5.4.2 Software que se ejecuta en el puerto paralelo 187

5.5 Ejercicios 192

Capítulo 6 Sistema de archivos 194

6.1 Conceptos básicos del sistema de archivos 194

6.1.1 Archivos y nombres de archivos 194

6.1.2 Tipos de archivos 195

6.1.3 Atributos adicionales de los archivos 195

6.1.4 Directorios y nombres de rutas 196

6.1.5 Operaciones de archivos 197

6.1.6 Descriptores de archivos 197

6.1.7 Bloques de disco, discos Particionamiento e implementación 197

6.1.8 Rendimiento 198

6.2 Sistema de archivos virtual Linux 198

6.2.1 Estructura de datos VFS 200

6.2.2 Referencias a listas enlazadas globales y listas enlazadas locales 211

6.3 Estructuras relacionadas con VFS 212

6.3.1 estructura fs_struct 212

6.3.2 estructura files_struct 213

6.4 Caché de página 216

6.4.1 Estructura del espacio de direcciones 217

6.4.2 Estructura del buffer_head 219

6.5 Llamadas al sistema y capas del sistema de archivos de VFS 221

6.5.1 open() 221

6.5.2 close() 227

6.5.3 read( ) 229

6.5.4 write() 244

6.6 Resumen 246

6.7 Ejercicio 246

Capítulo 7 Programación de procesos y sincronización del kernel 247

7.1 Programador de Linux 248

7.1.1 Seleccionar el siguiente proceso 248

7.1.2 Cambio de contexto 253

7.1.3 Ceder la CPU 261

7.2 Prioridad del kernel 269

7.2.1 Prioridad explícita del kernel 269

7.2.2 Prioridad implícita del usuario 270

7.2.3 Preferencia implícita del kernel 270

7.3 Bloqueos de giro y semáforos 272

7.4 Reloj del sistema: acerca del tiempo y los temporizadores 274

7.4.1 Reloj en tiempo real : ¿Qué hora es ahora 274

7.4.2 Lectura del reloj en tiempo real de PPC 276

7.4.3 Lectura del reloj en tiempo real de x86 278

7.5 Resumen 280

7.6 Ejercicios 280

Capítulo 8 Arranque del kernel 281

8.1 BIOS y firmware abierto 282

8.2 Cargador de arranque 282

8.2.1 GRUB 283

8.2.2 LILO 286

8.2.3 PowerPC y Yaboot 286

8.3 Inicialización de memoria relacionada a arquitectura 287

8.3.1 Gestión de memoria de hardware de PowerPC 287

8.3.2 Gestión de memoria de hardware basada en arquitectura Intel x86 296

8.3.3 PowerPC y colección de códigos x86 305

8.4 Disco RAM original 305

8.5 Inicio: start_kernel() 306

8.5.1 Llamar a lock_kernel() 307

8.5.2 Llamando a page_address_init() 309

8.5.3 Llamando a printk(linux_banner) 311

8.5.4 Llamando a setup_arch 311

p>

8.5. 5 Llamar a setup_per_cpu_areas() 315

8.5.6 Llamar a smp_prepare_boot_cpu() 316

8.5.7 Llamar a sched_init() 317

8.5.8 Llamar a build_all_zonelists() 319

8.5.9 Llamando a page_alloc_init 319

8.5.10 Llamando a parse_args() 320

8.5.11 Llamando a trap_init() 322

8.5.12 Llamando a rcu_init() 323

8.5.13 Llamando a init_IRQ() 323

8.5.14 Llamando a softirq_init() 324

8.5.15 Llamando time_init() 325

8.5.16 Llamando a console_init() 326

>

8.5.17 Llamando a perfil_init() 326

8.5.18 Llamando a local_irq_enable() 327

8.5.19 Configurando initrd 327

8.5.20 Llamando a mem_init() 327

8.5.21 Llamando a late_time_init() 333

8.5.22 Llamando a calibrate_delay() 333

8.5.23 Llamando a pgtable_cache_init() 334

8.5.24 Llamar a buffer_init() 335

8.5.25 Llamar a security_scaffolding_startup() 336

8.5.26 Llamar a vfs_caches_init() 336

8.5.27 Llamando a radix_tree_init() 343

8.5.28 Llamando a signal_init() 344

8.5.29 Llamando a page_writeback_init() 344

8.5.30 Llamar a proc_root_init() 346

8.5.31 Llamar a init_idle() 347

8.5.32 Llamar a rest_init() 348

8.6 hilo de inicio (o proceso 1) 349

8.7 Resumen 353

8.8 Ejercicios 353

Capítulo 9 Construyendo el kernel de Linux 354

9.1 Cadena de herramientas 354

9.1.1 Compilador 355

9.1.2 Compilación cruzada 355

9.1.3 Enlazador 356

9.1.4 Archivo de objeto binario ELF 356

9.2 Construyendo el código fuente del kernel 360

9.2.1 Interpretando el código fuente 360

9.2.2 Construyendo la imagen del kernel 364

9.3 Resumen 369

9.4 Ejercicios 369

Capítulo 10 Agregar código al kernel 371

10.1 Explorar el código fuente 371

10.11 Familiarizarse con el sistema de archivos 371

10.12 filp y fops 372

10.13 Espacio de usuario y espacio del kernel 374

10.14 Cola de espera 375

10.15 Trabajo colas e interrupciones 378

10.16 Llamadas al sistema 380

10.17 Otros tipos de controladores 380

10.18 Modelo de dispositivo y sistema de archivos sysfs 383

10.2 Escritura de código 386

10.2.1 Conceptos básicos del dispositivo 386

10.2.2 Salida de símbolo 388

10.2.3 IOCTL 388

10.2 .4 Sondeo e interrupciones 391

10.2.5 Colas de trabajo y tasklets 395

10.2.6 Agregar código de llamada al sistema 396

10.3 Construcción y depuración 398 p>

10.4 Resumen 399

10.5 Ejercicio 400