我有一个我在linux内核(3.2)中声明/定义的结构,我目前正在尝试在syscall中分配其中一个结构,并为调用syscall的进程返回一个指针。
如何在内核以外的程序中#include
这个文件(问题可能是我应该包含哪个文件)?目前,我在include/linux/syscalls.h
中声明了结构,并在我自己在kernel/mysystemcall.c
创建的文件中定义了该结构。如果我尝试在程序中使用该结构,我会得到error: dereferencing pointer to incomplete type
。
如果我取消引用它,我怎么能真正读取这个内存?目前,我使用kmalloc
来分配内存;是否需要打开一个标志来访问内存,或者我应该使用其他东西来分配这个内存?
感谢您提供的任何帮助!
当前的系统调用实现:
#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;
}
编辑:我意识到我可以让我的系统调用获取指向已经分配的内存的指针,并且只是填写用户的值,但是首选(教师偏好)以这种方式进行分配。
答案 0 :(得分:1)
查看this answer后:
不要尝试从内核为用户空间分配内存 - 这个 是一个严重违反内核抽象层次的行为。
在向内核询问需要多少内存之后,我决定让用户空间程序自己分配内存。
这意味着我可以简单地将结构复制到用户和内核空间文件中,并且不需要#include
结构定义的内核文件。