我在内核模块中使用了一个size_t变量。当我要将其写入文件时,必须根据char*签名将其转换为vfs_write

extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *);

我使用这个函数,它使用vfs_write(我在internet上找到它):
int file_write(struct file *file, unsigned long long offset, unsigned
char *data, unsigned int size)
{
    mm_segment_t oldfs;
    int ret;

    oldfs = get_fs();
    set_fs(get_ds());

    ret = vfs_write(file, data, size, &offset);

    set_fs(oldfs);
    return ret;
}

nbytes变量是size_t我尝试将(char *)强制转换为nbytes但内核立即崩溃。这是我的密码。
index_filename = "/home/rocket/Desktop/index_pool";
index_file = file_open(index_filename,O_WRONLY | O_CREAT, 0644);
if(index_file == NULL)
    printk(KERN_ALERT "index_file open error !!.\n");
else{
    // file_write(index_file, 0, nbytes, nbytes); => this crashs also
    file_write(index_file, 0, (char*) nbytes, 100);
    file_close(index_file);
}

有没有办法在内核中将char*类型安全地转换为size_t类型?

最佳答案

当然,它会崩溃-您正在尝试写入nbytes指向的任何内存位置的100字节。因为它不是指针,所以它不太可能是内存的有效区域。即使是,它的大小也可能不是100字节。
您想要传递给vfs_write的是指向nbytes的指针。它的大小是sizeof(nbytes)。所以你可以这样调用包装函数

file_write(index_file, 0, (char*) &nbytes, sizeof(nbytes));

它将写出asize_tnbytes的内存位置有多少字节
如果要写出nbytes的值,这与您在问题中提出的问题不同,则需要将其存储在字符串中,并将其传递给函数,如下所示:
char temp_string[20];
sprintf(temp_string,"%zu",nbytes);
file_write(index_file, 0, temp_string, strlen(temp_string));

10-08 00:17