gpt4 book ai didi

c - 在 Minix 中制作设备驱动程序

转载 作者:行者123 更新时间:2023-12-03 17:42:11 27 4
gpt4 key购买 nike

我正在尝试在 Minix 上创建一个字符设备驱动程序。我希望它能够接受read()write()调用。我的理解是我需要使用 sys_safecopyfrom()对于运行 read() 的函数功能和 sys_safecopyto()对于运行 write() 的函数功能。问题是当我像这样运行它时,我不断收到类似的错误(虽然不完全相同,但我认为差异在于内存位置)。错误是:

verify_grant: grant verify failed: access invalid: want 0x..., have 0x...
grant 2 verify to copy ... -> ... by ... failed err -1
read: Operation not permitted

“...”是内存位置,除了内存位置之外,写入的错误类似,并且在最后一行显示“写入”而不是“读取”。

我认为相关代码如下:
#include <minix/drivers.h>
#include <minix/chardriver.h>
#include <stdio.h>
#include <stdlib.h>
#include <minix/ds.h>
...
static struct chardriver hello_tab =
{
.cdr_open = hello_open,
.cdr_close = hello_close,
.cdr_read = hello_read,
.cdr_write = hello_write,
};
...
static ssize_t hello_read(devminor_t UNUSED(minor), u64_t position,
endpoint_t endpt, cp_grant_id_t grant, size_t size, int UNUSED(flags),
cdev_id_t UNUSED(id))
{
u64_t dev_size;
char *ptr;
int ret;
char *buf = HELLO_MESSAGE;

printf("hello_read()\n");

/* This is the total size of our device. */
dev_size = (u64_t) strlen(buf);

/* Check for EOF, and possibly limit the read size. */
if (position >= dev_size) return 0; /* EOF */
if (position + size > dev_size)
size = (size_t)(dev_size - position); /* limit size */

/* Copy the requested part to the caller. */
ptr = buf + (size_t)position;
if ((ret = sys_safecopyfrom(endpt, grant, 0, (vir_bytes) ptr, size)) != OK)
return ret;

/* Return the number of bytes read. */
printf("Message is :%s", ptr);
return size;
}
static ssize_t hello_write(devminor_t UNUSED(minor), u64_t position,
endpoint_t endpt, cp_grant_id_t grant, size_t size, int UNUSED(flags),
cdev_id_t UNUSED(id))
{
u64_t dev_size;
char *ptr;
int ret;
char *buf = HELLO_MESSAGE;

printf("hello_write()\n");

/* This is the total size of our device. */
dev_size = (u64_t) strlen(buf);

/* Check for EOF, and possibly limit the read size. */
if (position >= dev_size) return 0; /* EOF */
if (position + size > dev_size)
size = (size_t)(dev_size - position); /* limit size */

/* Copy the requested part to the caller. */
ptr = buf + (size_t)position;
if ((ret = sys_safecopyto(endpt, grant, 0, (vir_bytes) ptr, size)) != OK)
return ret;

/* Return the number of bytes read. */
return size;
}

hello_read 函数基于 hello_write 函数,但我认为它应该仍然有效并且应该将信息读入 ptr。

另外,我对如何在 write() 中获得第二个参数有点模糊。我的 hello_write() 中的函数(缓冲区)功能。它是否包含在 hello_read() 之一中的论点?

谢谢你的帮助!

最佳答案

所以,我知道这已经很长时间了,这里没有事件,但我想我会回答这个问题。

我首先要说在将错误的参数传递到 sys_safecopyto/from 时会发生错误。

现在要真正调试它,我想查看您拥有的其余代码。但是对于遇到此问题的其他任何人,我将提供一些提示

  • 看看你传递了多少字节的 sys_safecopy 函数
  • 确保在写入时使用缓冲区放置正确的偏移量。为了
    我使用它的情况是 (buffer_ptr + current_size)
  • 确保您使用的是较早版本的 minix,您将正确数量的参数放入 sys_safecopy 函数中(可以是 5 个参数或 6 个参数,用于 hello 驱动程序的旧版本 minix 上的最后一个将是“D";) )
  • 关于c - 在 Minix 中制作设备驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33360104/

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