1

所以我试图在模块初始化时动态分配一个缓冲区。缓冲区需要始终在范围内,因为它存储用户空间程序与之交互的数据。所以这是我的代码:

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

2 回答 2

4

file_data是一个指针。在 32 位平台上,它的大小为 32 位或 4 个字节。您想知道的是指向的数据file_data的大小。您不能sizeof为此使用运算符,因为sizeof它是编译时操作。你不能在运行时动态分配的东西上使用它。

(此外,您已经知道所指向的数据的大小file_data——它是MAX_SIZE?)

于 2012-05-23T18:32:38.287 回答
3

char *file_data是一个指向字符的指针。显然,您使用的是 32 位系统,因此任何指针都是 4 个字节。编译器(它处理sizeof)不知道或关心您要分配多少内存file_data来指向,它只知道您要询问指针的大小(无论您是否有意)。如果您想要它指向的内存大小,您必须自己跟踪它。

于 2012-05-23T18:34:51.017 回答