¿Cómo acceder a la llamada al sistema desde el espacio de usuario?

Leí algunos párrafos en LKD1 y simplemente no puedo entender los contenidos a continuación:

Accediendo a la llamada al sistema desde el espacio de usuario

En general, la biblioteca C proporciona soporte para llamadas al sistema. Las aplicaciones de usuario pueden extraer prototipos de funciones de los encabezados estándar y vincularse con la biblioteca C para usar su llamada al sistema (o la rutina de la biblioteca que, a su vez, utiliza su llamada syscall). Sin embargo, si acaba de escribir la llamada al sistema, ¡es dudoso que glibc ya lo admita!

Afortunadamente, Linux proporciona un conjunto de macros para envolver el acceso a las llamadas del sistema. Establece el contenido del registro y emite las instrucciones de captura. Estas macros se denominan_syscalln(), dónden está entre cero y seis. El número corresponde al número de parámetros pasados ​​al syscall porque la macro necesita saber cuántos parámetros esperar y, por lo tanto, ingresar en los registros. Por ejemplo, considere la llamada al sistemaopen(), definido como

long open(const char *filename, int flags, int mode)

La macro syscall para usar esta llamada al sistema sin el soporte explícito de la biblioteca sería

#define __NR_open 5
_syscall3(long, open, const char *, filename, int, flags, int, mode)

Entonces, la aplicación puede simplemente llamaropen().

Para cada macro, hay 2 + 2 × n parámetros. El primer parámetro corresponde al tipo de retorno del syscall. El segundo es el nombre de la llamada al sistema. A continuación sigue el tipo y el nombre de cada parámetro en el orden de la llamada del sistema. los__NR_open define está en<asm/unistd.h>; Es el número de llamada del sistema. los_syscall3 la macro se expande en una función C con ensamblaje en línea; el ensamblaje realiza los pasos descritos en la sección anterior para insertar el número de llamada del sistema y los parámetros en los registros correctos y emitir la interrupción del software para atrapar el kernel. Colocar esta macro en una aplicación es todo lo que se requiere para usar elopen() llamada al sistema.

Vamos a escribir la macro para usar nuestra espléndida nueva.foo() Llame al sistema y luego escriba un código de prueba para mostrar nuestros esfuerzos.

#define __NR_foo 283
__syscall0(long, foo)

int main ()
{
        long stack_size;

        stack_size = foo ();
        printf ("The kernel stack size is %ld\n", stack_size);
        return 0;
}

Que hacela aplicación puede simplemente llamaropen() ¿media?

Además, para el último código, ¿dónde está la declaración defoo()? ¿Y cómo puedo hacer que este trozo de código sea compilable y ejecutable? ¿Cuáles son los archivos de encabezado que necesito incluir?

__________
1 Desarrollo de Linux Kernel, de Robert Love.Archivo PDF en wordpress.com (ir a la página 81);Resultado de Google Books.

Respuestas a la pregunta(3)

Su respuesta a la pregunta