Cómo hacer que un programa en lenguaje C en Linux se ejecute en estado de kernel
La parte inicial del código del kernel de Linux está escrita en lenguaje ensamblador (el nombre del archivo es boot/bootsect.s) (mis habilidades de ensamblador son actualmente limitadas). (Primero mueve esta parte de su código a la dirección absoluta 0x90000, luego carga el siguiente código de 2K desde el dispositivo de arranque a la dirección 0x90200 y carga el resto del kernel a la dirección 0x10000. Al cargar el sistema, el sistema indicará " Cargando...". Luego, el control del programa se entrega a otro ensamblador en modo real (boot/Setup.S).
A continuación, el programa mueve todo el sistema desde la dirección 0x10000 a la dirección 0x1000, ingresando Protegido. mode.
El siguiente paso es el proceso de descomprimir el kernel del sistema. Esta parte del código se encuentra en la dirección 0x1000 (archivo/Boot/head.S). luego ejecuta el kernel descomprimido (decompress_kernel( )), esta función se origina en los archivos zBoot/inflate.c, zBoot/unzip.c y zBoot/misc.c load?.... [?bootsect.S?]
¿descomprimir?.. ...[?decompress_kernel()?]
main.c?--->?start_kernel()? start .
start?printk( banner);
Linux?(gcc?version?2.7.2.3)?(Verifique el número de versión de GCC,? (gcc?version?2.7.2.3) (Verifique el número de versión de GCC en /init/main .c)?Si gcc Si el número de versión no es suficiente, no se permitirá la compilación del kernel)
#40?Sun?Apr?18?17:44:20?CST?1999 p>
Al llamar a init_time() se imprimirá lo siguiente:
¿Detectado?199908264 ?Hz?processor.
Luego ejecute console_init()? >Consola: Color VGA+80x25
Ejecute un bucle, midiendo MIPS. Se dice que esto está relacionado con la latencia en tiempo real para un número específico de ciclos de instrucciones de la máquina.
Latencia de calibración. bucle...199.48BogoMIPS
Inicializando memoria/ *?**/
VFS:?Diskquotas?version?dquot_6.4.0?Tendré que mirar más de cerca, si Puedo encontrar un error de Intel, entonces...)
CPU: Intel Pentium Professional 09
Inicial o procesador y coprocesador.
Procesador inicial o procesador y coprocesador, para procesadores más antiguos linux emula el coprocesador en software.
Comprobando el acoplamiento 386/387... OK, FPU informó un error con la excepción 16.
Verificar la legitimidad de la gobernanza
Verificar la directiva 'hlt'... OK.
Realice pruebas de rendimiento de POSIX a través de UNIFIX
Después de eso, llame a linux_thread(init?,... ,... ,)(arch/i386/kernel/process.c)
Crea un proceso que ejecuta init.
Ingrese al modo de usuario de segunda etapa (user_mode) para finalizar start_kerne y finalmente ingrese la inicialización del dispositivo cpu_idle (?arch/i386/kernel/process.c?)
Llamada de inicialización del dispositivo.
init()--->do_basic_init()--+
pci_init()? Inicializar el dispositivo pci (?) Existe un pasaje en el archivo main.c: "ifdef?PCI?.. ... , es necesario comprobarlo.) El resultado se imprime a continuación:
PCI:?PCI?BIOS?revision?2.10?entry?at?0xfd8d1
PCI:?Usando? configuración?tipo ?1
PCI:?Probing?PCI?hardware
Inicialización del socket, socket_init()? (Este puede ser el secreto de las redes Linux, así que prestaré atención a ¿Se publicará más tarde)? /p>
Basado en NET3.039 de Swansea University Computer Society
NET4: ¿Unix Domain Socket 1.0 para Linux?
NET4: TCP/ para Linux IP 1.0
Protocolo IP: ICMP, UDP, TCP
Iniciar kswapd_setup( )
Llamar a device_setup()
Detectar mouse PS/2 puerto Inicializar tarjeta de sonido
¿Inicialización?de sonido?iniciada
¿Inicialización?de sonido?completa
Inicializar unidad de disquete
¿Unidad de disquete detectada?
p>Unidad de disquete: FD0 es 1,44 M
¿FDC0 es nacional?¿PCI?
(scsi0)? 255 SCB
(scsi0)? ¿Descargar código de serializador...? 419 instrucciones descargadas
SCSI0: Adaptec AHA274x/284x/294x (EISA/VLB/PCI-Fast SCSI) 5.1. 10/3.2.4
SCSI: 1 host
Proveedor: Modelo: ST32155W Revisión: 0596
Tipo: ANSI SCSI de acceso directo Revisión: 02
SDA de disco SCSI detectado en SCSI0, canal 0, id:0, lun:0
Proveedor:SEAGATE Modelo:ST32155W Rev:0596
Tipo:Directo Acceso:ANSI:SCSI revisión:02
¿Detectado?
¿Detectado?scsi?disk?sdb?at?scsi0,?channel?0,?id 1,?lun?0
scsi:?detected?2?SCSI?disk?total.
(scsi0:0:0:0)? La velocidad de sincronización es 40,0 Mbyte/seg, el desplazamiento es 8 .
Dispositivo SCSI SDA: ¿Sector HDWR=512 bytes, número de sectores=4197405[2049 MB]? [2.0GB](scsi0:0:1:0)? La velocidad de sincronización es 40.0 Mbytes/seg, el desplazamiento es 8.
Dispositivo SCSI sdb:?hdwr?2049 MB]?[2.0GB] Verificación de partición : sda:?sda1?|
sdb:?sdb1?sdb2?|
Instalar sistema de archivos: filesystem_setup()
Instalar controlador de dispositivo: ?mount_root( )
VFS: La raíz (sistema de archivos ext2) está montada, es de solo lectura.
Liberar memoria del kernel no utilizada: 28k gratis
Añadir espacio de intercambio: 66540k de espacio de intercambio (prioridad -1
Controlador de audio Soundblaster, copyright Hannu Todo propiedad de Savolainen, 1993-1996
SB?3.01 detectó OK(220)
at?0x220?irq?5?dma?1
YM3812 y controlador OPL -3, copyright Hannu Savolainen, 1993-1996
SB?3.01 OK(220) detectado
en?Hannu?Savolainen, Rob?Hooft?1993-1
996 ?at?0x388
NET4:?AppleTalk?0.18?para?Linux?NET4.0
eth0:?Intel?EtherExpress?Pro?10 /100?at?0xf800,? 00:A0:C9:49:2F:FF,?IRQ?9.
Componente de la placa?645520-034,?Conector físico?Existe:?RJ45
¿Chip de interfaz principal? DP83840?PHY?#1.
¿DP83840?¿Configuraciones específicas?, ¿Configuración de registros?
Autoprueba general: aprobada.
Autocomprobación del subsistema del puerto serie prueba: aprobada.
Autoprueba de registro interno: aprobada
Autoprueba de suma de comprobación de ROM: aprobada (0x49caa8d6) ¿Receptor? ¿Bloqueo? ¿Solución alternativa? Activado.
NET4:?AppleTalk?0.18?para?Linux?NET4.0
end?do_basic_setup()
open("/dev/console",?O_RDWR ,?0)
Inicio?/sbin/init(?execv(...)?)
El kernel ya está en Esto completa el lanzamiento...