如何在内核C中将size_t转换为char *?

时间:2018-02-12 13:00:53

标签: c kernel kernel-module

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

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

我使用这个使用vfs_write的函数(我在互联网上找到它):

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转换为char*,但内核会立即崩溃。这是我的代码。

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

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

2 个答案:

答案 0 :(得分:1)

当然它会崩溃 - 你试图写出100个字节的任何内存位置nbytes指向的位置。因为它不是指针,所以极不可能是有效的内存区域。即使它是,它可能不是100字节大小。

您希望传递给vfs_write的是指向nbytes的指针。其大小为sizeof(nbytes)。所以你要像这样调用你的包装函数

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

这将写出size_tnbytes

的内存位置有多少字节

如果你想写出nbytes的值,这与你在问题中看到的不同,你需要将它存储在一个字符串中并将其传递给你的函数,如下所示: / p>

char temp_string[20];
sprintf(temp_string,"%zu",nbytes);
file_write(index_file, 0, temp_string, strlen(temp_string));

答案 1 :(得分:1)

  

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

是的。 您应该在sprintf库中使用linux/kernel.h函数

所以你应该做这样的事情:

sprintf(destination_char_star, "%zu", your_s_size_var);

小心你应该在需要时为char星分配内存。