1. ホーム
  2. c

[解決済み] 新しいシステムコールを書き込む

2022-02-19 09:41:46

質問

ラズベリーのカーネルに新しいシステムコール(sys_defclose)を書こうとしているのですが、コンパイル時にこのエラーが発生します。

arch/arm/kernel/built-in.o: In function `__sys_trace_return':
:(.text+0xd50): undefined reference to `sys_defclose'

以下のファイルを修正しました。

-include/linux/syscalls.h : 私のシステムコールのプロトタイプを置いたところです。

-arch/arm/include/asm/unistd.h : syscallテーブルの新しいrawを置く場所です。

       #define __NR_sys_defclose    (__NR_SYSCALL_BASE+380)

-arch/arm/kernel/calls.S : ここに入れます。

       CALL(sys_defclose)

-sys_defcloseのソースをarch/arm/kernelに置き、同じディレクトリのmakefileに新しい行を追加して修正しました。

       obj-y    +=sys_defclose.o

カーネルのバージョンは3.6です。 どなたかこのエラーを解決する方法を教えてください。 ありがとうございます。 これは、私のシステムコールの実装です。

static struct task_struct* get_task_by_pid(pid_t pid)
{
return pid_task(find_pid_ns(pid, task_active_pid_ns(current)), PIDTYPE_PID);
}

static void close_files(struct files_struct * files)
 {
     int i, j;
     struct fdtable *fdt;

    j = 0;

    rcu_read_lock();
    fdt = files_fdtable(files);
    rcu_read_unlock();
    for (;;) {
            unsigned long set;
            i = j * BITS_PER_LONG;
            if (i >= fdt->max_fds)
                    break;
           set = fdt->open_fds[j++];
           while (set) {
                    if (set & 1) {
                             struct file * file = xchg(&fdt->fd[i], NULL);
                             if (file) {
                                 filp_close(file, files);
                                    cond_resched();
                           }
                    }
                  i++;
                  set >>= 1;
            }
    }
}
asmlinkage long sys_defclose(pid_t pid)
{
struct task_struct *result = NULL;

rcu_read_lock(); 
result = get_task_by_pid(pid);
rcu_read_unlock(); 
close_files(result->files);
}

解決方法は?

を使用する必要があります。 SYSCALL_DEFINE* を使用してシステムコールを定義し(このステップは間違っていると思います)、次にそのシステムコールを sys_call_table これはアーキテクチャに依存します(armの場合はarch/arm/kernel/calls.S)。

を変更します。 sys_defclose をクリックすると、次のようになります。

SYSCALL_DEFINE1(defclose, pid_t, pid)
{
        struct task_struct *result = NULL;

        rcu_read_lock(); 
        result = get_task_by_pid(pid);
        rcu_read_unlock(); 
        close_files(result->files);
}