GNU/Linux >> Linux の 問題 >  >> Linux

パラメータをLinuxシステムコールに渡す方法は?

システム コールには 2 つの引数が必要であり、それらの型が int であることをビルド システムに伝える必要があります。 .これは、ビルド システムの一部であるスクリプトが、必要な型に引数をキャストするための適切なラッパーを生成するためです。あなたが行ったように実際のハンドラーを定義する代わりに、使用する必要があります -

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 linux/include/linux/syscalls.h で定義されています。

linux/fs/read_write.c で例を見ることができます


解決策を見つけました。 @Ajay Brahmakshatriya が答えたように、SYSCALL_DEFINEx マクロを使用する必要があります。また、arch/x86/entry/syscalls/syscall_64.tbl を変更する必要があります

これが最終的な要約です。

新しいシステム コールを追加する方法

まず、arch/x86/entry/syscalls/syscall_64.tbl を変更します :これらの行を下に追加してください。

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

次に、include/linux/syscalls.h を変更します :これらの行を下に追加してください。

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

3 番目に、実装用の新しいファイルを作成します。私の場合、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;
}

4 番目に、作成したファイルをそのディレクトリ内の Makefile に追加します。私の場合、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
...

最後に、カーネルをコンパイルしてインストールします。これで、新しいシステム コールがうまく機能することがわかります。

#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 コマンドは、システム コールが正常に機能していることを示しています。

# dmesg
my_syscall_0
my_syscall_1 : 1
my_syscall_2 : 2, 3

Linux
  1. Linuxでホスト名を変更する方法

  2. Linuxでシステムの稼働時間を確認する方法

  3. パラメータをエイリアスに渡す方法は?

  1. RedhatLinuxで仮想化を構成する方法

  2. Linuxでシステムホスト名を設定または変更する方法

  3. Linuxでclone()システムコールのスタックをmmapする方法は?

  1. Linuxシステムが32ビットか64ビットかを確認する方法

  2. LinuxシステムのIDを変更する方法

  3. LinuxでSCPコマンドにパスワードを渡す方法