gpt4 book ai didi

linux - 防止覆盖 char 驱动程序 linux 的 WRITE 函数

转载 作者:太空宇宙 更新时间:2023-11-04 09:06:48 24 4
gpt4 key购买 nike

我的驱动程序必须从用户缓冲区写入一个名为 msg 的字符数组,该数组在全局范围内

//global scope
...
#define SIZE 64;
char msg[SIZE];
...

所以这是写函数。

static ssize_t  Dev_Write(struct file *flip, const char __user *buffer, size_t length, loff_t *offset)
{

copy_from_user(msg + *offset, buffer, length); //I hope *offset = 0 at the first call
printk(KERN_INFO "message from UserSpace is: %s \n", msg);
*offset += length;

return length;
}

当我依次调用此函数两次时,它会覆盖 msg 中的第一个数据。我希望它只是从最后一个位置继续。我想我必须用 *offset

做点什么

这是用户程序:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <iostream>
using namespace std;

#define BUFFER_SIZE 64

int main (int argc, char ** argv)
{
int fd;
ssize_t read_bytes;
ssize_t written_bytes;
char buffer[BUFFER_SIZE] = "aaaaaa";
char buffer1[BUFFER_SIZE] = "bbbbbb";
char buffer2[BUFFER_SIZE];
fd = open ("/dev/2", O_RDWR);
if (fd < 0)
{
fprintf (stderr, "Cannot open file\n");
exit (1);
}


written_bytes = write (fd, buffer, BUFFER_SIZE);
write (fd, buffer1, BUFFER_SIZE);
read_bytes = read (fd, buffer2, BUFFER_SIZE);
cout<<buffer<<endl;
if(written_bytes < 0)
{
fprintf (stderr, "myread: Cannot write to file\n");
exit (1);
}
if (read_bytes < 0)
{
fprintf (stderr, "myread: Cannot read from file\n");
exit (1);
}
close (fd);
exit (0);
}

谢谢。

最佳答案

虽然根本问题还不完全清楚,但您确实遇到了一个将您推向未定义行为的错误。您的用户空间程序每次写入 64 个字节 (BUFFER_SIZE),但您的内核缓冲区只有 64 个字节长。第二次写入会导致溢出。

要调试您的问题,请执行以下步骤。在写入函数的入口处调试消息的长度和偏移量:

printk(KERN_INFO "Size from userspace is: %d offset %d\n", length, *offset);

此外,限制副本大小,以免覆盖缓冲区:

if (*offset > SIZE)
return -ENOSPC;
if (*offset + length > SIZE)
length = SIZE - *offset;

在这些测试之后,您可以执行您的copy_from_user。测试是必要的,但我不确定它们是否足够解决问题。调试行可能会揭示其他事情正在混淆这种情况。

关于linux - 防止覆盖 char 驱动程序 linux 的 WRITE 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9411057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com