Linux kernel espacio y método de interacción de información de espacio de usuario

  
 

Resumen: cuando se desarrollan desarrollos a nivel de sistema, como controladores de dispositivos y módulos de funciones del kernel, a menudo es necesario intercambiar información entre el kernel y el programa del usuario. Linux proporciona una variedad de métodos para realizar estas tareas. Este artículo resume los diversos métodos comúnmente utilizados para el intercambio de información y demuestra las características y el uso de estos métodos con ejemplos simples. Hay métodos que son muy familiares para todos, y también hay medios disponibles en condiciones especiales. Al comparar estos métodos, podemos profundizar nuestra comprensión del kernel de Linux y, lo que es más importante, permitirnos ser más competentes en las técnicas de desarrollo de aplicaciones de Linux a nivel de kernel.


Kernel-space VS User-space Como desarrollador de Linux, primero debe comprender la diferencia entre el espacio de kernel y el espacio de usuario. Hay una gran cantidad de información relevante sobre este tema, que describimos brevemente aquí:

La administración de almacenamiento en las arquitecturas de computadoras modernas generalmente incluye mecanismos de protección. El propósito de proporcionar protección es evitar que una tarea en el sistema acceda a un área de almacenamiento que pertenezca a otra o que pertenezca al sistema operativo
. Al igual que en la arquitectura Intel X86, se proporciona un mecanismo de protección de nivel de privilegio para limitar el acceso al área de almacenamiento por diferencias de nivel de privilegio. Basado en esta arquitectura, el sistema operativo Linux se divide a sí mismo: algunos programas centrales son independientes de las aplicaciones normales y se ejecutan en un nivel de privilegio más alto (Linux usa el nivel de privilegio 3 del sistema Intel para ejecutar el núcleo). Ellos residen en el espacio de memoria protegido y tienen todos los permisos para acceder al dispositivo de hardware. Linux se refiere a esto como espacio del núcleo.

Relativo, otras partes se ejecutan como aplicación en el espacio de usuario. Solo pueden ver algunos de los recursos del sistema que pueden usar, y no pueden usar ciertas funciones del sistema, no pueden acceder directamente al hardware, no pueden acceder directamente al espacio del kernel y, por supuesto, existen otras restricciones de uso específicas.
(Linux usa el nivel de privilegio 0 del sistema Intel para ejecutar programas de usuario).

Es muy efectivo colocar el espacio de usuario y el espacio del kernel bajo este mecanismo de acceso asimétrico desde una perspectiva de seguridad. Puede defenderse contra usuarios malintencionados. La indagación también puede evitar la infracción de programas de usuario de baja calidad, lo que hace que el sistema funcione de manera más estable y confiable. Sin embargo, si el programa de usuario no permite el acceso y el uso de recursos de espacio del kernel como este, nuestro sistema no proporcionará ninguna característica significativa. Para facilitar que el programa de usuario use recursos que pueden controlarse completamente en el espacio del kernel sin violar las reglas de privilegio anteriores, se define una interfaz de acceso estándar desde la arquitectura del hardware hasta el sistema operativo. Para obtener detalles sobre el sistema X86, consulte Recursos 1

Las arquitecturas de hardware generales proporcionan un mecanismo de "puerta". El significado de "puerta" significa que una aplicación con privilegios bajos puede ingresar a un espacio del kernel altamente privilegiado a través de estas "puertas" cuando se produce un evento específico. Para el sistema Intel X86, el sistema operativo Linux utiliza la interfaz de hardware de "compuerta del sistema" (llamando a las instrucciones de la máquina int $ 0x80), construyendo una variedad de llamadas al sistema como una interfaz de software, para la aplicación desde el estado del usuario a El estado del kernel proporciona el canal. Al utilizar " call system " " " " system gate "; no requiere permisos especiales, pero la ubicación específica del kernel no es arbitraria, esta ubicación está especificada por " call call " Mantenga el núcleo seguro y protegido. Podemos describir visualmente este mecanismo: como turista, puede comprar un boleto para ingresar al parque safari, pero debe sentarse en el automóvil de turismo y seguir la ruta prescrita. Por supuesto, no se le permite salir, porque es demasiado peligroso, no permitirle perder la vida o asustar a los animales salvajes.

Por razones de eficiencia y tamaño de código, los programas del kernel no pueden usar las funciones estándar de la biblioteca (por supuesto, existen otras inquietudes, consulte los Recursos 2 para obtener información detallada). Por lo tanto, el desarrollo del kernel no es tan conveniente como el desarrollo del programa del usuario. Y debido a que el kernel actual (linux2.6 no se ha lanzado oficialmente) es "no preventivo", el proceso que se ejecuta en el espacio del kernel no será reemplazado por otros procesos (a menos que el proceso renuncie voluntariamente al control de la CPU, como llamar a Sleep (), schedule (), etc.), ya sea en el contexto del proceso (como ejecutar una llamada del sistema de lectura) o en el contexto de interrupción (en la rutina de servicio de interrupción), el programa del kernel no puede ocupar la CPU durante un tiempo prolongado; de lo contrario, otros programas No se podrá ejecutar, solo esperar.

Interacción entre el espacio del kernel y el espacio del usuario Hoy en día, cada vez más aplicaciones necesitan escribir programas de nivel del kernel y de usuario para realizar tareas específicas juntas. Generalmente, se utilizan los siguientes modos: Primero, escriba un programa de servicio del kernel. Utilice los permisos y los servicios proporcionados por el espacio del kernel para recibir, procesar y almacenar en caché los datos, luego escriba los programas de usuario para interactuar con los programas de servicio del kernel que se completaron anteriormente. Los datos proporcionados, por supuesto, también pueden ingresarse en el programa de servicio del kernel.

Una aplicación típica incluye: Netfilter (servidor de kernel: firewall) VS Iptable (programa de nivel de usuario: programa de configuración de reglas); IPSEC (servidor de kernel: parte de protocolo VPN) VS IKE (programa de nivel de usuario: vpn Procesamiento de negociación de claves), por supuesto, también se incluye una gran cantidad de controladores de dispositivos y el software de aplicación correspondiente. Todas estas aplicaciones se realizan mediante programas de nivel de kernel y de usuario que intercambian información de forma conjunta para realizar tareas específicas.

Método de interacción de información El intercambio de información entre el programa de usuario y el kernel es bidireccional, es decir, puede enviar activamente información desde el espacio de usuario al espacio de kernel, o enviar datos desde el espacio de kernel al espacio de usuario. Por supuesto, el programa de usuario también puede extraer datos activamente del núcleo. A continuación, resumiremos y resumiremos los métodos de datos de interacción del usuario y el núcleo.

Interacción de información Según el iniciador de transmisión de información, se puede dividir en dos categorías: el usuario transmite /extrae datos al kernel y el kernel envía la solicitud al espacio del usuario. Primero, se inicia la interacción de información iniciada por el programa de nivel de usuario.

Programa de nivel de usuario iniciado interacción de información Una escritura de su propia llamada al sistema Como se puede ver de lo que antecede, las llamadas al sistema son el método más básico para que los programas de nivel de usuario accedan al núcleo. Actualmente, Linux proporciona más de 200 llamadas de sistema estándar (vea los archivos de inclusión /asm-i386 /unistd.h y arch /i386 /kernel /entry.S en el árbol de códigos del kernel) y nos permite agregar nuestras propias llamadas al sistema. Para lograr el intercambio de información con el kernel. Por ejemplo, queremos crear un sistema de registro de llamadas del sistema que registre todas las acciones de llamadas del sistema para la detección de intrusos. En este punto, podemos escribir un servidor de kernel. Este programa es responsable de recopilar todas las solicitudes de llamada del sistema y de registrar esta información de llamada en un búfer de creación propia en el kernel. No podemos implementar procedimientos complejos de detección de intrusiones en el kernel, por lo que los registros en este búfer se deben extraer en el espacio del usuario. La forma más sencilla es escribir una nueva llamada al sistema para implementar esta función de extracción de datos almacenados. Una vez implementado el programa de servicio del kernel y la nueva llamada al sistema, podemos escribir el programa del usuario en el espacio de usuario para la tarea de detección de intrusos. El programa de detección de la intrusión puede periódicamente, rotar o llamar a la nueva llamada del sistema para extraer datos del kernel cuando sea necesario. Detección de intrusiones.

B Escribir controladores Una de las características de Linux /UNIX es tratar todo como un archivo (todo es un archivo). El sistema define una interfaz de controlador simple y completa, y el programa cliente puede interactuar con el controlador del kernel a través de esta interfaz de manera unificada. La mayoría de los usuarios y desarrolladores del sistema ya están familiarizados con esta interfaz y el proceso de desarrollo correspondiente.

El controlador se ejecuta en el espacio del kernel, y la aplicación de espacio de usuario interactúa con él a través de un archivo en el directorio /dev /del sistema de archivos. Este es el flujo de operaciones de archivos con el que estamos familiarizados: abrir () — — leer () — — write () — — ioctl () — — close ().
(Cabe señalar que no todos los controladores del núcleo son esta interfaz. El uso de controladores de red y varias pilas de protocolos no es consistente. Por ejemplo, la programación de socket tiene conceptos como abrir () cerrar (), pero La implementación del kernel y el uso externo son bastante diferentes de los controladores normales. Para obtener detalles sobre la programación en esta sección, consulte los Recursos 3 y 4.

Copyright © Conocimiento de Windows All Rights Reserved