Linuxカーネル(3.2)で宣言/定義している構造体があり、現在、これらの構造体の1つをsyscall内に割り当て、syscallを呼び出すプロセスへのポインターを返そうとしています。
#include
カーネル外のプログラムでこのファイルを使用するにはどうすればよいですか(どのファイルを含めるべきかが問題になる可能性があります)。現在、で構造を宣言し、でinclude/linux/syscalls.h
自分で作成したファイルで定義していますkernel/mysystemcall.c
。プログラムで構造体を使用しようとすると、が得られerror: dereferencing pointer to incomplete type
ます。逆参照するとセグメンテーション違反が発生する場合、このメモリから実際に読み取るにはどうすればよいですか?現在、私は
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に、すでに割り当てられているメモリへのポインタを取得させ、ユーザーの値を入力させることができることを認識していますが、割り当てにはこの方法を使用することをお勧めします(教師の好み)。