0

我正在尝试为 linux 内核开发一个新的系统调用。此系统调用将在作为参数的用户缓冲区上写入信息,例如:

asmlinkage int new_syscall(..., char *buffer,...){...}

在用户空间中,这个缓冲区被静态分配为:

char buffer[10000];

有一种方法(作为用户级别的 sizeof() )可以知道整个缓冲区大小(在这种情况下为 10000)?我已经尝试过strlen_user(buffer),但它返回了当前进入缓冲区的字符串的长度,所以如果缓冲区为空,它返回 0。

4

1 回答 1

0

您可以尝试传递包含缓冲区指针和缓冲区大小的结构。但同样的结构也应该在用户空间应用程序和内核的系统调用代码中定义。

struct new_struct
{
   void *p;  //set this pointer to your buffer...
   int size;
};
//from user-application...

int main()
{
   ....
   struct new_struct req_kernel;
   your_system_call_function(...,(void *)&req_kernel,...);
}
........................................................................................
      //this is inside your kernel...
     your_system_call(...,char __user optval,...)
     {
            .....
            struct new_struct req;
            if (copy_from_user(&req, optval, sizeof(req)))

            return -EFAULT;
            //now you have the address or pointer & size of the buffer
            //which you want in kernel with struct req...
    }
于 2013-02-07T04:53:23.213 回答