Linux kernel 如何知道从用户空间传递的缓冲区大小?
我正在尝试为linux内核开发一个新的系统调用。此系统调用将在作为参数的用户缓冲区上写入信息,例如:Linux kernel 如何知道从用户空间传递的缓冲区大小?,linux-kernel,buffer,sizeof,Linux Kernel,Buffer,Sizeof,我正在尝试为linux内核开发一个新的系统调用。此系统调用将在作为参数的用户缓冲区上写入信息,例如: asmlinkage int new_syscall(..., char *buffer,...){...} 在用户空间中,此缓冲区静态分配为: char buffer[10000]; 有没有一种方法(如用户级别的sizeof())可以知道整个缓冲区大小(本例中为10000)? 我已经尝试了strlen\u user(buffer),但它会返回当前缓冲区中字符串的长度,因此如果缓冲区为空,则
asmlinkage int new_syscall(..., char *buffer,...){...}
在用户空间中,此缓冲区静态分配为:
char buffer[10000];
有没有一种方法(如用户级别的sizeof())可以知道整个缓冲区大小(本例中为10000)?
我已经尝试了strlen\u user(buffer),但它会返回当前缓冲区中字符串的长度,因此如果缓冲区为空,则返回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...
}
否。将缓冲区的大小传递给系统调用。好的!我要用这种方式试试!谢谢我还建议将
char*buffer
定义为char\uu user*buffer
并使用copy\u From\u user
谢谢akp,这应该是个好主意,但我决定在syscall的参数中传递缓冲区的大小。无论如何,谢谢你:)