memcpy-无法处理内核空指针取消引用

问题描述 投票:0回答:1

我正在编写一个内核模块,我需要返回给用户很多数据。

我有一个以log_list_head为头的链表(他是空的)和函数print_log,它将log_list数据传输到字符串并将其存储在缓冲区中。

ssize_t my_read(struct file *filp, char *buff, size_t length, loff_t *offp){
    struct log_list *temp;
    char *buffer;
    buffer = (char *)kmalloc(1024 *sizeof(char),GFP_KERNEL);
    temp = log_list_head->next;

    while (temp != NULL){
        print_log(temp->data,buffer);
        copy_to_user(buff, buffer, strlen(buffer));  //This is not correct

        temp=temp->next;
    }
    copy_to_user(buff, message, strlen(buffer));
    kfree(buffer);
    return 0;

}

我有两个问题

  1. 用户没有得到任何东西,运行打印(缓冲区)后它是空的
  1. 我知道 copy_to_user 无法打印多行。有没有办法逐字符串返回(我需要逐行打印它),我被告知它可能会很长。

我想一次向用户发送一个缓冲区。

谢谢你,

linux-kernel linux-device-driver kernel-module
1个回答
0
投票

目前你每次都会覆盖用户增益。

如果你让

buffer
足够大以容纳数据+消息的最大大小,你可以一次性完成:

int i=0;
while (temp != NULL){
    print_log(temp->data, buffer+i);  //offset by amount already done
    i = strlen(buffer);
    temp=temp->next;
}
strcat(buffer, message);
copy_to_user(buff, buffer, strlen(buffer)+1);  // include terminator

如果 print_log 跟踪缓冲区的末尾,可以提高效率,但这可能是不成熟的优化。

© www.soinside.com 2019 - 2024. All rights reserved.