Syscall为用户分配内存

时间:2012-10-20 01:38:30

标签: c linux-kernel

我有一个我在linux内核(3.2)中声明/定义的结构,我目前正在尝试在syscall中分配其中一个结构,并为调用syscall的进程返回一个指针。

  1. 如何在内核以外的程序中#include这个文件(问题可能是我应该包含哪个文件)?目前,我在include/linux/syscalls.h中声明了结构,并在我自己在kernel/mysystemcall.c创建的文件中定义了该结构。如果我尝试在程序中使用该结构,我会得到error: dereferencing pointer to incomplete type

  2. 如果我取消引用它,我怎么能真正读取这个内存?目前,我使用kmalloc来分配内存;是否需要打开一个标志来访问内存,或者我应该使用其他东西来分配这个内存?

  3. 感谢您提供的任何帮助!

    当前的系统调用实现:

    #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;
    }
    

    编辑:我意识到我可以让我的系统调用获取指向已经分配的内存的指针,并且只是填写用户的值,但是首选(教师偏好)以这种方式进行分配。

1 个答案:

答案 0 :(得分:1)

查看this answer后:

  

不要尝试从内核为用户空间分配内存 - 这个   是一个严重违反内核抽象层次的行为。

在向内核询问需要多少内存之后,我决定让用户空间程序自己分配内存。

这意味着我可以简单地将结构复制到用户和内核空间文件中,并且不需要#include结构定义的内核文件。