GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara meneruskan parameter ke panggilan sistem Linux?

Anda perlu memberi tahu sistem build bahwa pemanggilan sistem Anda memerlukan 2 argumen dan bertipe int . Ini agar skrip yang merupakan bagian dari sistem build akan menghasilkan pembungkus yang sesuai untuk memasukkan argumen ke dalam tipe yang Anda butuhkan. Alih-alih mendefinisikan penangan yang sebenarnya seperti yang Anda lakukan, Anda harus menggunakan -

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 didefinisikan di linux/include/linux/syscalls.h.

Anda dapat melihat contohnya di linux/fs/read_write.c


Saya menemukan solusinya. Seperti yang dijawab oleh @Ajay Brahmakshatriya, saya harus menggunakan makro SYSCALL_DEFINEx. Dan juga, saya harus memodifikasi arch/x86/entry/syscalls/syscall_64.tbl juga.

Berikut ringkasan akhir.

Cara menambahkan panggilan sistem baru

Pertama, ubah arch/x86/entry/syscalls/syscall_64.tbl :tambahkan baris-baris di bawah ini.

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

Kedua, ubah include/linux/syscalls.h :tambahkan baris-baris di bawah ini.

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

Ketiga, buat file baru untuk implementasi. Untuk kasus saya, 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;
}

Keempat, tambahkan file yang dibuat ke Makefile di direktorinya. Untuk kasus saya, 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
...

Terakhir, kompilasi dan instal kernel. Sekarang, Anda dapat melihat panggilan sistem baru berfungsi dengan baik.

#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 perintah menunjukkan kepada saya bahwa panggilan sistem berfungsi dengan baik.

# dmesg
my_syscall_0
my_syscall_1 : 1
my_syscall_2 : 2, 3

Linux
  1. Cara Memeriksa Apakah Sistem Linux 32 bit Atau 64 Bit

  2. Bagaimana mengubah identitas sistem Linux

  3. Cara Melewati Kata Sandi ke Perintah SCP di Linux

  1. Cara mengkonfigurasi Virtualisasi di Redhat Linux

  2. Cara Mengatur atau Mengubah Nama Host Sistem di Linux

  3. Bagaimana cara memetakan tumpukan untuk panggilan sistem clone () di linux?

  1. Cara Mengubah Nama Host di Linux

  2. Cara Memeriksa Uptime Sistem di Linux

  3. Cara memeriksa versi Kernel di Linux