La llamada al sistema de aprendizaje

La llamada al sistema de aprendizaje

La esencia de la llamada al sistema es una llamada a la función, pero la función se llama la función del sistema en modo kernel.

API y el sistema de llamadas de la diferencia entre:

  • Cada llamada al sistema corresponde a una rutina de servicio, la API pueden corresponder a una pluralidad de llamadas al sistema.
  • Algunos API en modo de usuario proporciona servicios directos no necesitan utilizar una llamada al sistema.

¿Por qué no simplemente llame se ejecuta la función del núcleo? Podemos llamar a este paso salvar el sistema?

programa de espacio de usuario no puede ejecutar directamente el código del núcleo, el núcleo en un espacio de memoria protegido, el proceso no permite a los usuarios leer y escribir en el espacio de direcciones del núcleo, lo que mejora en gran medida la seguridad del sistema, el kernel se puede comprobar, a petición de la corrección de la interfaz de petición en segundo lugar, facilita la programación, proporcionando el equivalente de un conjunto de interfaces. Otro punto es que la capa espaciadora tiene un programa más portátil.

De hecho, la llamada al sistema es: el sistema de notificación de solicitud de alguna manera, a decirle al núcleo que necesitan para realizar una llamada al sistema, enviar una solicitud al núcleo de interrupción blanda, una excepción a la CPU conmuta para realizar Estado central lanzando un manejador de excepciones (es decir, el sistema llama al proceso de programa) (temprano para llamar llamada al sistema Linux debe ser int $ 0x80 instrucciones de montaje a través de la ejecución, lo que resulta en el vector anormal 128 (excepciones son la CPU interna de interrupción ocurrir)), entonces el proceso se pasa al sistema de sistema de kernel llamada identificación número requerido llamada, llamar al programa de servicio en el sistema y luego encontrar el procedimiento de rutina de servicio de llamada al sistema para procesar, de hecho, la rutina de servicio es en realidad procesando los datos correspondientes al número de llamadas al sistema. El gestor de llamadas del sistema, sino de modo de usuario para lograr el proceso de conversión de modo de núcleo necesaria después de ella, y luego devuelto por la rutina de servicio de llamada al sistema, y ​​en última instancia por el modo de núcleo volver interruptor de modo de usuario de la CPU para completar la llamada al sistema.

Macro-proceso llamada al sistema:

  • Los usuarios llaman al número pasado al kernel de un sistema (registro EAX responsable de la entrega)

    • Hay cientos de llamadas del sistema Linux, define un número único para cada llamada al sistema, este número se llama el número de llamadas al sistema, que se define en linux / arch / x86 / include / asm / unistd_.h en

      #define __NR_io_setup 0
       34 __SC_COMP(__NR_io_setup, sys_io_setup, compat_sys_io_setup)
       35 #define __NR_io_destroy 1
       36 __SYSCALL(__NR_io_destroy, sys_io_destroy)
       37 #define __NR_io_submit 2
       38 __SC_COMP(__NR_io_submit, sys_io_submit, compat_sys_io_submit)
       39 #define __NR_io_cancel 3
       40 __SYSCALL(__NR_io_cancel, sys_io_cancel)
       ...
       ...
       725 #define __NR_pwritev2 287
       726 __SC_COMP(__NR_pwritev2, sys_pwritev2, compat_sys_pwritev2)
       727 #define __NR_pkey_mprotect 288
       728 __SYSCALL(__NR_pkey_mprotect,  sys_pkey_mprotect)
       729 #define __NR_pkey_alloc 289
       730 __SYSCALL(__NR_pkey_alloc,    sys_pkey_alloc)
       731 #define __NR_pkey_free 290
       732 __SYSCALL(__NR_pkey_free,     sys_pkey_free)
       733 #define __NR_statx 291
       734 __SYSCALL(__NR_statx,     sys_statx)
      
      

      Podemos ver que hay 291 llamadas al sistema.

  • Sistema función de llamada kernel para encontrar el controlador apropiado para la llamada al sistema de este número mediante la realización de un (rutina de servicio de llamada al sistema) tabla usando un número de llamadas al sistema como subíndice, encontrar la llamada al sistema de encapsulación de rutina. (Bar () en el modo de núcleo con una sys_bar correspondiente (), entonces sys_bar () llamada al sistema rutina de servicio)

    • Con el fin de número y de servicios de llamada del sistema correlato rutinas, el uso de la tabla del kernel llamada al sistema,
  • Devuelve: () función (escrito en lenguaje ensamblador) por syscall_exit_work. Todo el sistema llama devuelve un entero, la mayoría de rutina devuelve un valor entero paquete depende de la llamada al sistema correspondiente. (Valor negativo indica una condición de error)

La llamada al sistema

inicialización

Ejecución int $ 0x80 instrucciones de montaje: llamada durante la inicialización del núcleo trap_init entrada correspondiente 128 buen vector () para establecer IDT (Interrupt Descriptor Table)

En trap_init arch / x86 / kernel / traps.c de la función () se puede ver:

#ifdef CONFIG_X86_32

set_system_trap_gate(SYSCALL_VECTOR, &system_call);

set_bit(SYSCALL_VECTOR, used_vectors);

#endif

En donde SYSCALL_VACTOR 0x80 valor, este valor por el selector de segmento, tipo offset, los medios de campo DPL asociados entrada descriptor.

tratamiento de inicio

implementa la función de system_call el controlador de llamada al sistema para guardar el número de llamada del sistema y el controlador de excepciones se pueden utilizar en todos los registros de la CPU a la que respectiva pila, y después de comprobar la validez del número de llamada del sistema, si este número es mayor que o igual a NR_syscalls, termina gestor de llamadas del sistema. Si el número de llamadas al sistema no es válido, y luego saltar a syscall_badsys en la ejecución, los resultados devuelto un código de retorno negativo.

Si es correcto, el número de llamada de acuerdo con el sistema de transferencia de EAX llama a la rutina de servicio correspondiente.

ENTRY(system_call)
 RING0_INT_FRAME          
 pushl_cfi %eax                      
 SAVE_ALL
 GET_THREAD_INFO(%ebp)
 testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)
 jnz syscall_trace_entry
 cmpl $(nr_syscalls), %eax
 jae syscall_badsys
 syscall_call:
 call *sys_call_table(,%eax,4)
 movl %eax,PT_EAX(%esp)      
 syscall_exit:
 LOCKDEP_SYS_EXIT
 DISABLE_INTERRUPTS(CLBR_ANY)    
 TRACE_IRQS_OFF
 movl TI_flags(%ebp), %ecx
 testl $_TIF_ALLWORK_MASK, %ecx  # current->work
 jne syscall_exit_work
 restore_all:
 TRACE_IRQS_IRET
 restore_all_notrace:
 movl PT_EFLAGS(%esp), %eax  # mix EFLAGS, SS and CS
 movb PT_OLDSS(%esp), %ah
 movb PT_CS(%esp), %al
 andl $(X86_EFLAGS_VM | (SEGMENT_TI_MASK << 8) | SEGMENT_RPL_MASK), %eax
 cmpl $((SEGMENT_LDT << 8) | USER_RPL), %eax
 CFI_REMEMBER_STATE
 je ldt_ss          
 restore_nocheck:
 RESTORE_REGS 4          
 irq_return:
 INTERRUPT_RETURN

Otro método para entrar en la llamada de sistema se ejecuta SYSENTER instrucciones en lenguaje ensamblador. (Referido como sistema rápido llama desde el modo de usuario al modo kernel conmutación rápida método)

  • Embalaje rutina número de llamada del sistema cargado EAX, llamada __kenel_vsyscall () llamada al sistema se utiliza para guardar los registros de memoria de pila en modo de usuario, el puntero de pila se copia en la instrucción ebp SYSENTER realizar el usuario.
  • CPU cambia a modo de núcleo, los realiza el kernel un sysenter_entry similar () la función de lenguaje ensamblador, que funcionan con la operación system_call.

¿Cómo encontrar la rutina de servicio correspondiente de acuerdo con el número de llamadas al sistema?

EAX en el número de llamadas al sistema se multiplica por cuatro, además de la tabla de llamadas al sistema sys_call_table dirección de inicio, se puede obtener un puntero a punto a la rutina de servicio adecuado en esta dirección, la memoria que se requiere para encontrar una llamada rutina de servicio.

Se define la tabla de llamadas al sistema en arch / x86 / kernel / syscall_table_32.S en

ENTRY(sys_call_table)
.long sys_restart_syscall   
system call, used for r   
       .long sys_exit
       .long ptregs_fork
       .long sys_read
       .long sys_write
       .long sys_open      

Cuando al final de la ejecución de la rutina de servicio

  • la system_call () devuelve el valor obtenido de la EAX, devuelve el valor de la presencia posición de la pila de modo de usuario se almacena en el registro EAX y luego termina la ejecución syscall_exit controlador de llamada del sistema.
  • Cuando se emite el mandato syenter emplea, sysenter_entry () y la función system_call () tiene la misma operación. En donde iret necesita para obtener de la pila del núcleo al cambiar al modo kernel cinco parámetros almacenados, y luego al modo de usuario de la CPU-interruptor de re, el ECX datos de usuario obtener un puntero a la pila actual.

Parámetro que pasa la llamada al sistema

Antes de ver el sistema de llamadas sólo pasó el número de llamadas al sistema registro EAX, pero algunas llamadas al sistema necesita pasar múltiples parámetros (tales como mmap), entonces el sistema de seguimiento dos principios al pasar parámetros en los registros:

  • Registrar más que el parámetro de longitud media a pasar a través del desarrollo de su dirección.
  • Más de 6 parámetros de la llamada al sistema mediante la transmisión de un solo puntos de registro a un área de memoria de valor de parámetro en el espacio de direcciones del proceso.

En el sistema de escritura antes de sistema Linux de Programación de Operaciones de archivos utilizados con frecuencia llaman, que es el descriptor de archivo indicado kernel parámetro de validación, si no se devolverá una llamada al sistema de solicitud de parámetros negativos fallado.

Sección experimental (la adición de llamadas de sistema)

Conoce el principio es más clara idea de hacer las necesidades del experimento que hay que hacer es aumentar el sistema de recopilación de registros de llamadas al sistema. Actualmente haciendo, es un paso importante

  • Agregar el número de llamada del sistema

  • Aumentar las entradas de la tabla de llamadas al sistema

  • Aumentar las llamadas al sistema

  • Makefile y modificar la declaración de función

  • Escrito en código necesario para interceptar las llamadas al sistema, el kernel proporciona funciones de interfaz

  • Recompilar el kernel

  • Escribir código en modo kernel de usuario cuelga en la función de enlace

  • código de usuario ejecutar la impresión de las llamadas al sistema de registro

Publicado 15 artículos originales · alabanza ganado 13 · vistas 9057

Supongo que te gusta

Origin blog.csdn.net/weixin_43122409/article/details/88346717
Recomendado
Clasificación