所以我试图在模块初始化时动态分配缓冲区。缓冲区需要始终在范围内,因为它存储用户空间程序与之交互的数据。所以这是我的代码:
static char* file_data
#define MAX_SIZE 256
.
.
.
{
file_data = kzalloc(MAX_SIZE, GFP_KERNEL)
.
.
.
}
然而,当我sizeof file_data
时,它总是会返回4.我做错了什么?
编辑:缓冲区存储来自用户空间程序的输入,但是可以存储4个字符。
size_t read_file(char* __user buf, size_t count)
{
unsigned int len = 0;
len = copy_to_user(buf, file_data, count);
return count;
}
ssize_t write_file(char* __user buf, size_t count)
{
if(count >= MAX_SIZE)
return -EINVAL;
copy_from_user(file_data, buf,count)
return count;
}
答案 0 :(得分:4)
file_data
是一个指针。在32位平台上,它的大小是32位,或4个字节。您想知道的是 file_data
指向的数据的大小。您不能使用sizeof
运算符,因为sizeof
是编译时操作。你不能在运行时动态分配的东西上使用它。
(此外,您已经知道file_data
指向的数据的大小 - 它是MAX_SIZE
?)
答案 1 :(得分:3)
char *file_data
是指向char的指针。显然你在32位系统上,所以任何指针都是4个字节。编译器(处理sizeof
)不知道或不关心你为file_data
分配多少内存,它只知道你要求指针的大小(你无论你是否愿意)。如果你想要它指向的内存大小,你必须自己跟踪它。