GNU/Linux >> Znalost Linux >  >> Linux

Jak předat parametry systémovému volání Linuxu?

Musíte systému sestavení sdělit, že vaše systémové volání vyžaduje 2 argumenty a že jsou typu int . Je to proto, aby skripty, které jsou součástí systému sestavení, vygenerovaly vhodné obaly pro přetypování argumentů do požadovaného typu. Namísto definování skutečného handleru jako vy byste měli použít -

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, %d\n", a, b);
    return b;
}

SYSCALL_DEFINEx je definován v linux/include/linux/syscalls.h.

Můžete se podívat na příklad v linux/fs/read_write.c


Našel jsem řešení. Jak odpověděl @Ajay Brahmakshatriya, měl bych použít makro SYSCALL_DEFINEx. A také bych měl upravit arch/x86/entry/syscalls/syscall_64.tbl také.

Zde je konečné shrnutí.

Jak přidat nová systémová volání

Nejprve upravte arch/x86/entry/syscalls/syscall_64.tbl :přidejte tyto řádky níže.

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

Za druhé upravte include/linux/syscalls.h :přidejte tyto řádky níže.

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

Za třetí vytvořte nový soubor pro implementaci. V mém případě kernel/my_syscall.c .

#include <linux/syscalls.h>
#include <linux/kernel.h>

SYSCALL_DEFINE0(my_syscall_0)
{
    printk("my_syscall_0\n");
    return 0;
}

SYSCALL_DEFINE1(my_syscall_1, int, a)
{
    printk("my_syscall_1 : %d\n", a);
    return 0;
}

SYSCALL_DEFINE2(my_syscall_2, int, a, int, b)
{
    printk("my_syscall_2 : %d, %d\n", a, b);
    return b;
}

Za čtvrté přidejte vytvořený soubor do Makefile v jeho adresáři. V mém případě kernel/Makefile .

...
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
...

Nakonec zkompilujte a nainstalujte jádro. Nyní byste mohli vidět, že nová systémová volání fungují dobře.

#include <stdio.h>
#include <unistd.h>
#include <sys/syscall.h>

int main()
{
    printf("1 : %d\n", syscall(335));
    printf("2 : %d\n", syscall(336, 1));
    printf("3 : %d\n", syscall(337, 2, 3));
    return 0;
}

dmesg příkaz mi ukazuje, že systémová volání fungují dobře.

# dmesg
my_syscall_0
my_syscall_1 : 1
my_syscall_2 : 2, 3

Linux
  1. Jak nakonfigurovat virtualizaci na Redhat Linuxu

  2. Jak nastavit nebo změnit název hostitele systému v systému Linux

  3. Jak změnit název hostitele v systému Linux

  1. Jak zkontrolovat, zda je systém Linux 32bitový nebo 64bitový

  2. Jak zkontrolovat verzi jádra v Linuxu

  3. Jak předat parametry aliasu?

  1. Jak změnit identitu systému Linux

  2. Jak předat heslo příkazu SCP v Linuxu

  3. Jak mmapovat zásobník pro systémové volání clone() na linuxu?