0

Linuxカーネル(3.2)で宣言/定義している構造体があり、現在、これらの構造体の1つをsyscall内に割り当て、syscallを呼び出すプロセスへのポインターを返そうとしています。

  1. #includeカーネル外のプログラムでこのファイルを使用するにはどうすればよいですか(どのファイルを含めるべきかが問題になる可能性があります)。現在、で構造を宣言し、でinclude/linux/syscalls.h自分で作成したファイルで定義していますkernel/mysystemcall.c。プログラムで構造体を使用しようとすると、が得られerror: dereferencing pointer to incomplete typeます。

  2. 逆参照するとセグメンテーション違反が発生する場合、このメモリから実際に読み取るにはどうすればよいですか?現在、私はkmallocメモリの割り当てに使用しています。メモリにアクセスするためにオンにする必要があるフラグはありますか、それともこのメモリを割り当てるために何か他のものを使用する必要がありますか?

提供された助けに感謝します!

現在のsyscallの実装:

#include <linux/linkage.h>
#include <linux/sched.h>
#include <linux/slab.h>

struct threadinfo_struct {
    int pid;
    int nthreads;
    int *tid;
};

asmlinkage struct threadinfo_struct *sys_threadinfo(void) {
    struct threadinfo_struct *info = kmalloc(sizeof(struct threadinfo_struct), GFP_KERNEL);
    info->pid = current->pid;
    info->nthreads = -1;
    info->tid = NULL;
    return info;
}

現在のテストコード(カーネル外):

#include <stdio.h>
#include <linux/unistd.h>
#include <sys/syscall.h>
#define sys_threadinfo 349

int main(void) {
    int *ti = (int*) syscall(sys_threadinfo);
    printf("Thread id: %d\n", *ti); // Causes a segfault
    return 0;
}

編集:私は、syscallに、すでに割り当てられているメモリへのポインタを取得させ、ユーザーの値を入力させることができることを認識していますが、割り当てにはこの方法を使用することをお勧めします(教師の好み)。

4

1 に答える 1

2

この答えを見た後:

カーネルからユーザースペースにメモリを割り当てようとしないでください。これは、カーネルの抽象化レイヤーの大きな違反です。

カーネルに必要なメモリ量を尋ねた後、ユーザースペースプログラムにメモリ自体を割り当てさせるルートを選択することにしました。

#includeこれは、構造をユーザースペースファイルとカーネルスペースファイルの両方にコピーするだけでよく、構造定義のためにカーネルファイルを作成する必要がないことを意味します。

于 2013-02-24T18:54:22.710 に答える