Saltar al contenido

¿Cómo pasar parámetros a la llamada del sistema Linux?

Por fin después de mucho luchar pudimos dar con la solución de este enigma que muchos lectores de nuestro espacio han tenido. Si deseas aportar alguna información puedes aportar tu comentario.

Solución:

Debe decirle al sistema de compilación que su llamada al sistema requiere 2 argumentos y que son del tipo int. Esto es para que las secuencias de comandos que forman parte del sistema de compilación generen contenedores apropiados para convertir los argumentos en el tipo que necesita. En lugar de definir el controlador real como lo hizo, debe usar:

SYSCALL_DEFINE2(my_syscall_2, int, a, int, b) // Yes, there is a comma between the types and the argument names

    printk("my_syscall_2 : %d, %dn", a, b);
    return b;

SYSCALL_DEFINEx se define en linux/include/linux/syscalls.h.

Puede ver un ejemplo en linux/fs/read_write.c

Encontré la solución. Como respondió @Ajay Brahmakshatriya, debería usar SYSCALL_DEFINEx macro. Y también, debo modificar arch/x86/entrada/syscalls/syscall_64.tbl también.

Aquí está el resumen final.

Cómo agregar nuevas llamadas al sistema

Primero, modifica arch/x86/entrada/syscalls/syscall_64.tbl : agregue esas líneas a continuación.

335     common     my_syscall_0     __x64_sys_my_syscall_0
336     common     my_syscall_1     __x64_sys_my_syscall_1
337     common     my_syscall_2     __x64_sys_my_syscall_2

En segundo lugar, modificar incluir/linux/syscalls.h : agregue esas líneas a continuación.

asmlinkage long sys_my_syscall_0(void);
asmlinkage long sys_my_syscall_1(int);
asmlinkage long sys_my_syscall_2(int, int);

En tercer lugar, cree un nuevo archivo para la implementación. Para mi caso, kernel/my_syscall.c.

#include 
#include 

SYSCALL_DEFINE0(my_syscall_0)

    printk("my_syscall_0n");
    return 0;


SYSCALL_DEFINE1(my_syscall_1, int, a)

    printk("my_syscall_1 : %dn", a);
    return 0;


SYSCALL_DEFINE2(my_syscall_2, int, a, int, b)

    printk("my_syscall_2 : %d, %dn", a, b);
    return b;

Cuarto, agregue el archivo creado a Makefile en su directorio. Para mi caso, núcleo/archivo Make.

...
obj-y = fork.o exec_domain.o panic.o 
        cpu.o exit.o softirq.o resource.o 
        sysctl.o sysctl_binary.o capability.o ptrace.o user.o 
        signal.o sys.o umh.o workqueue.o pid.o task_work.o 
        extable.o params.o 
        kthread.o sys_ni.o nsproxy.o 
        notifier.o ksysfs.o cred.o reboot.o 
        async.o range.o smpboot.o ucount.o 
        my_syscall.o
...

Finalmente, compile e instale el kernel. Ahora, podrá ver que las nuevas llamadas al sistema funcionan bien.

#include 
#include 
#include 

int main()

    printf("1 : %dn", syscall(335));
    printf("2 : %dn", syscall(336, 1));
    printf("3 : %dn", syscall(337, 2, 3));
    return 0;

dmesg El comando me muestra que las llamadas al sistema funcionan bien.

# dmesg
my_syscall_0
my_syscall_1 : 1
my_syscall_2 : 2, 3

Aquí puedes ver las reseñas y valoraciones de los usuarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *