En Linux, al menos, el mecanismo de llamada del sistema funciona en la mayoría de las arquitecturas al colocar algunos datos con formato específico (generalmente algún tipo de estructura) en algunos registros o direcciones de memoria predefinidas.
Sin embargo, el problema surge al obligar a la CPU a hacer el cambio al espacio del kernel para que pueda ejecutar el código del kernel privilegiado para atender la llamada. Esto se hace forzando una falla de algún tipo (una falla que es una división entre 0, un desbordamiento indefinido o una falla predeterminada, etc.) que obliga al núcleo a asumir la ejecución para manejar la falla.
Normalmente, el kernel maneja las fallas al eliminar el proceso causante o al ejecutar un controlador proporcionado por el usuario. Sin embargo, en el caso de una llamada al sistema, en su lugar, verificará los registros predefinidos y las ubicaciones de memoria y, si contienen una solicitud de llamada al sistema, la ejecutará utilizando los datos proporcionados por el proceso del usuario en la estructura en memoria. Esto generalmente debe hacerse con un ensamblaje especialmente diseñado a mano y para facilitar el uso de la llamada al sistema para el usuario, la biblioteca C del sistema tiene que envolverlo como una función. Para obtener una interfaz de nivel inferior, visite http://man7.org/linux/man-pages/man2/syscall.2.html para obtener información sobre cómo funcionan las llamadas al sistema y cómo puede llamar sin un contenedor C.
Esto tiene una simplificación excesiva, no es cierto en todas las arquitecturas (mips tiene una instrucción especial de syscall) y no necesariamente funciona igual en todos los sistemas operativos. Aún así, si tiene algún comentario o pregunta, por favor pregunte.
Enmendado: Tenga en cuenta que, con respecto a su comentario sobre cosas en / dev /, esta es en realidad una interfaz de nivel superior para el núcleo, no una inferior. Estos dispositivos realmente usan (aproximadamente) 4 syscalls debajo. Escribirles es lo mismo que escribir una llamada al sistema, leer una llamada a la lectura, abrirlos / cerrarlos equivalentes a las llamadas al sistema abiertas y cerradas y ejecutar un ioctl provoca una llamada al sistema ioctl especial que en sí misma es una interfaz para acceder a una de las muchas ioctl del sistema llamadas (llamadas especiales, generalmente específicas del dispositivo con un uso demasiado limitado para escribir una llamada de sistema completa para ellas).