ver usuario tengo saber que procesos proceso los formatear cuota como comando asignar linux operating-system

usuario - ver version de linux comando



¿Cómo se implementa el sistema en Linux? (6)

Cuando invoco una llamada al sistema en modo de usuario, ¿cómo se procesa la llamada en el sistema operativo?

¿Invoca algún binario ejecutable o alguna biblioteca estándar?

En caso afirmativo, ¿qué tipo de cosas necesita para completar la llamada?


Ampliamente simplificado, pero lo que sucede es que se produce una interrupción cuando intenta acceder a una dirección de memoria reservada. La interrupción cambia el contexto al modo kernel y ejecuta el código del kernel (llamada al sistema real) en nombre del usuario. Una vez que se completa la llamada, el control se devuelve al código de usuario.


Depende de lo que quiera decir con una llamada al sistema. ¿Te refieres a una llamada a la biblioteca C (a través de glibc) o una llamada al sistema real? Las llamadas a la biblioteca C siempre terminan usando llamadas al sistema al final.

La forma antigua de hacer llamadas al sistema era a través de una interrupción de software, es decir, la instrucción int . Windows tenía int 0x2e mientras que Linux tenía int 0x80 . El sistema operativo configura un controlador de interrupción para 0x2e o 0x80 en la tabla de descriptores de interrupción (IDT). Este manejador luego realiza la llamada al sistema. Copia los argumentos desde el modo de usuario al modo kernel (esto está controlado por una convención específica del sistema operativo). En Linux, los argumentos se pasan usando ebx , ecx , edx , esi y edi . En Windows, los argumentos se copian de la pila. El manejador luego realiza algún tipo de búsqueda (para encontrar la dirección de la función) y ejecuta la llamada al sistema. Después de que se completa la llamada al sistema, la instrucción iret vuelve al modo de usuario.

La nueva forma es sysenter y sysexit . Estas dos instrucciones básicamente hacen todo el trabajo de registro para usted. El sistema operativo establece las instrucciones a través de los Registros específicos del modelo (MSR). Después de eso, es prácticamente lo mismo que usar int .


Echa un vistazo a this .

Comenzando con la versión 2.5, Linux kernel introdujo un nuevo mecanismo de entrada de llamadas al sistema en los procesadores Pentium II +. Debido a problemas de rendimiento en los procesadores Pentium IV con el método de interrupción de software existente, se implementó un mecanismo de entrada de llamada al sistema alternativo utilizando las instrucciones SYSENTER / SYSEXIT disponibles en los procesadores Pentium II +. Este artículo explora este nuevo mecanismo. La discusión está limitada a la arquitectura x86 y todos los listados de código fuente están basados ​​en Linux kernel 2.6.15.6.

  1. ¿Qué son las llamadas al sistema?

    Las llamadas al sistema proporcionan a los procesos de usuario una forma de solicitar servicios del kernel. ¿Qué tipo de servicios? Servicios administrados por un sistema operativo como almacenamiento, memoria, red, administración de procesos, etc. Por ejemplo, si un proceso de usuario quiere leer un archivo, tendrá que realizar llamadas al sistema ''abierto'' y ''leído''. En general, los procesos no llaman directamente a las llamadas al sistema. La biblioteca C proporciona una interfaz para todas las llamadas al sistema.

  2. ¿Qué sucede en una llamada al sistema?

    Un fragmento de código del kernel se ejecuta a petición de un proceso de usuario. Este código se ejecuta en el anillo 0 (con el nivel de privilegio actual -CPL-0), que es el nivel más alto de privilegio en la arquitectura x86. Todos los procesos de usuario se ejecutan en el anillo 3 (CPL 3).

    Entonces, para implementar el mecanismo de llamada al sistema, lo que necesitamos es

    1) una forma de llamar al código de anillo 0 desde el anillo 3.

    2) algún código de núcleo para atender la solicitud.

  3. Buena forma de hacerlo

    Hasta hace un tiempo, Linux utilizaba las llamadas al sistema en todas las plataformas x86 que usaban interrupciones de software. Para ejecutar una llamada al sistema, el proceso de usuario copiará el número de llamada del sistema deseado a% eax y ejecutará ''int 0x80''. Esto generará la interrupción 0x80 y se llamará a una rutina de servicio de interrupción. Para la interrupción 0x80, esta rutina es una rutina de "manejo de todas las llamadas al sistema". Esta rutina se ejecutará en el anillo 0. Esta rutina, tal como se define en el archivo /usr/src/linux/arch/i386/kernel/entry.S, guardará el estado actual y llamará al controlador de llamadas del sistema apropiado en función del valor en% eax.

  4. Nueva forma brillante de hacerlo

    Se descubrió que este método de interrupción de software era mucho más lento en los procesadores Pentium IV. Para resolver este problema, Linus implementó un mecanismo de llamada al sistema alternativo para aprovechar las instrucciones SYSENTER / SYSEXIT proporcionadas por todos los procesadores Pentium II +. Antes de seguir adelante con esta nueva forma de hacerlo, familiaricémonos con estas instrucciones.


Pasa por glibc, que emite una interrupción 0x80 después de llenar registros con parámetros. El controlador de interrupciones del kernel busca el syscall en la tabla syscall e invoca la función sys _ * () relevante.


Un syscall está formado por una instrucción de captura especial, un número de syscall y argumentos.

  1. La instrucción de trampa especial se usa para cambiar del modo de usuario al modo kernel, que tiene privilegios ilimitados.
  2. El número de syscall y los argumentos se pasan por el registro.

int X en el conjunto se traduce en un número de llamada del sistema n.
El syscall de lectura ex puede tener un número 4.
Al inicio del sistema, OS crea una tabla de punteros llamada tabla de descriptores de interrupción (IDT) que tiene una lista de direcciones para las llamadas al sistema junto con el privilegio necesario para ejecutarlas.
El nivel de privilegio actual (CPL) se guarda en uno de los bits del registro CS (técnicamente 2 bits en x86).
Estos son los pasos seguidos por una instrucción int:
• Obtener el n-ésimo descriptor del IDT, donde n es el argumento de int.
• Verifique que CPL en% cs sea <= DPL, donde DPL es el nivel de privilegio en el descriptor.
• De lo contrario, el usuario no tiene el privilegio suficiente para ejecutar esto y dará como resultado que se ejecute una instrucción int 13 (error de protección general), (el usuario no tuvo suficiente privilegio)
• En caso afirmativo, el código de usuario tiene suficiente privilegio para realizar esta llamada al sistema, el contexto de ejecución actual se guarda (registra, etc.), porque ahora cambiamos al modo kernel.
La información incluye registros, banderas porque cuando la llamada del sistema finaliza, queremos continuar la ejecución desde donde nos fuimos. • Los parámetros de la llamada al sistema se guardan en la pila del kernel, porque la llamada al sistema se ejecuta en modo kernel.

VSYSCALL (LLAMADA AL SISTEMA RÁPIDO)
Cada vez que el usuario ejecuta una llamada al sistema, el Os guarda el estado actual de la máquina (es decir, el registro, el puntero de pila, etc.) y cambia al modo kernel para su ejecución. Para algunas llamadas al sistema, no es necesario guardar todo el registro. La llamada al sistema de tiempo de salida ex lee la hora actual y regresa la llamada del sistema. Por lo tanto, algunas llamadas al sistema se implementan a través de lo que se denomina vsyscalls. Aquí, cuando se realiza una llamada al sistema, se ejecuta en el espacio del usuario mismo sin cambiar al kernel. Entonces el tiempo se guarda.
Consulte aquí para obtener más información sobre vsyscall http://www.trilithium.com/johan/2005/08/linux-gate/
y aquí ¿ alguien puede entender cómo funciona el horario del día?