gpt4 book ai didi

c - 在ioctl linux设备驱动中读写

转载 作者:太空宇宙 更新时间:2023-11-03 23:58:58 26 4
gpt4 key购买 nike

我正在为 x86 定制板实现 Linux USB 驱动程序。我已经实现了 ioctl 来与用户空间通信。

我在硬件中有一个用户需要读取的缓冲区..

struct piclet_port_data
{
unsigned int num_bytes;
unsigned char *data;
}__attribute__((packed));

用户填写 num_bytes 值请求读取的字节数,内核驱动程序将数据放入结构中传递的缓冲区中。

内核 IOCTL 代码:

case GEN_IOCTL_PORT_READ:
{
struct piclet_port_data port_data;
retval = copy_from_user(&port_data.num_bytes,
&((struct piclet_port_data *)arg)->num_bytes,
sizeof(port_data.num_bytes));
if (!retval) {
dev_info(&dev->interface->dev, "%s: Requested:%d"
"bytes\n", __func__, port_data.num_bytes);
port_data.data =
kzalloc(port_data.num_bytes, GFP_KERNEL);
if (!port_data.data) {
dev_err(&dev->interface->dev, "%s: Failed to allocate memory\n",
__func__);
retval = -ENOMEM;
}
else {
retval = read_port(dev, &port_data);
dev_info(&dev->interface->dev, "%s: read_port ret:%d\n",
__func__, retval);
if (!retval) {
retval = copy_to_user(((struct piclet_port_data *)arg)->data,
port_data.data,
(port_data.num_bytes));
dev_info(&dev->interface->dev, "%s: data[0]:%c\n",
__func__, ((struct piclet_port_data *)arg)->data[0]);

}
}
kfree(port_data.data);
}
else {
retval = -EFAULT;
}
}

代码在以下行失败,无法处理分页请求。

 retval = copy_to_user(((struct piclet_port_data *)arg)->data,
port_data.data,
(port_data.num_bytes));

你们能帮我看看是否有可能以这种方式在 ioctl 中访问读取和写入。感谢您的宝贵时间。

最佳答案

您如何创建 ioctl 编号——例如您在创建该 ioctl 编号时设置了哪些方向参数。

如果您使用 _IOWR() 创建了它,那么读写应该可以工作。

 #define GEN_IOCTL_PORT_READ _IOW(type,nr,size)

我猜你是用 IOR() 创建的,所以只有读取对你有用。

关于c - 在ioctl linux设备驱动中读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52658307/

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