- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试添加一个 proc 文件以从内核中读取一些信息。但是当我尝试从 proc 文件中 cat
信息时,它给出了“错误地址”错误。
int proc_read(char *buffer, char **starter, off_t off, int count,
int *eof, void *data)
{
if (off > 0)
{
*eof = 1;
return 0;
}
if (copy_to_user(buffer, info_str, info_str_size))
{
return -EFAULT;
}
return info_str_size;
}
insmod
后,使用cat
读取proc文件,但给出bad address错误; info_str
是一个全局的 char
数组。
最佳答案
您的问题的答案非常简单。在 proc_read
函数中,您不需要使用 copy_to_user
:一个简单的 memcpy
就可以完成这项工作,因为缓冲区位于内核内存中。但是,如果您正在创建一个 proc_write
函数,您确实需要使用 copy_from_user
,因为在这种情况下缓冲区位于用户内存中。
一个提示是,您可能还应该在成功时发出 EOF
信号。这将使您的函数免于被调用两次。
以下应该足够了:
int proc_read(char *buffer, char **starter, off_t off, int count,
int *eof, void *data)
{
if (off > 0)
{
*eof = 1;
return 0;
}
memcpy(buffer, info_str, info_str_size);
*eof = 1;
return info_str_size;
}
您还应该注意,这种编写文件条目的方式已经很老了,您应该避免使用它。 seq_file
接口(interface)更不容易出错(并且可以像 less 和 more 这样的分页器一起工作)。看看http://lwn.net/Articles/22355/如果你有兴趣。
关于c - 当使用 copy_to_user 时,它给出了错误的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12344910/
我已经为我的内核模块实现了一个字符设备,并为其实现了一个读取函数。读取函数调用copy_to_user将数据返回给调用者。我最初以阻塞方式实现读取功能(使用 wait_event_interrupti
我的内核驱动程序中有一个 ioctl,需要在读取时返回一些数据。当我在用户空间中读回它时,它没有显示预期的结果。 用户空间片段: typedef struct abc_T { int size
当条件失败时,我正在尝试从内核空间向用户空间获取一些消息! 这是我的内核代码: #define MESSAGTOUSER 1 int ret_val; struct siginfo sinfo; pi
我需要将内核空间中的curr_task->pid,一个pid_t,复制到用户空间中一个结构体的域中,该结构体的域有很长的空间。由于这是一个不断扩大的转换,我预计不会出现任何问题。 但是,我收到了一个烦
我必须在 Linux 内核中添加一个系统调用,该系统调用将打印进程树,仅显示用户代码的 PID。我必须在这里使用 copy_to_user 。但我不明白这个功能的用途。你们中的任何人都可以举一个例子来
copy_to_user 和 copy_from_user 函数在 Linux 系统的什么地方定义和实现? 最佳答案 它在 asm/uaccess.h 中定义,例如,在 /usr/src/linux-
我一直被告知(在书籍和教程中)在将数据从内核空间复制到用户空间时,我们应该使用 copy_to_user() 并且使用 memcpy() 会给系统带来问题。最近我错误地使用了 memcpy(),它工作
我试图在内核模块读取函数中使用 copy_to_user,但无法将数据从内核复制到用户缓冲区。如果我做错了什么,谁能告诉我。我的内核版本是 2.6.35。我给出了内核模块的一部分以及用于测试它的应用程
我正在尝试将自定义系统调用添加到 linux 内核中。这是一个简单的代码: #include #include #include #include asmlinkage int sys_mys
我正在 Linux 内核中编写一个系统调用,它给定一个虚拟地址和一个无符号长指针,找到相应的页表条目,然后将其内容复制到无符号长指针中。这是系统调用: SYSCALL_DEFINE2(readMMU,
在用户空间程序中,我通过 mmap 分配一些内存,如下函数调用: void *memory; int fd; fd = open(filepath, O_RDWR); if (fd < 0) r
我了解到,当 copy_to_user 函数发生页面错误时,将使用异常表。 但我发现几乎所有的修复都会设置返回值并跳转到触发页面错误的指令之后的下一条指令。 内核在哪里做用户空间地址的映射工作? 我的
我有一个邮箱链接列表,我正在尝试将它们的 ID 复制到用户空间变量 mbxList,但打印不正确。 asmlinkage long sys_listMailboxes(unsigned long *
这个问题在这里已经有了答案: copy_to_user vs memcpy (2 个答案) 关闭 7 年前。 让我们考虑以下代码。对于阅读 Linux 设备驱动程序的人来说,上下文会很清楚。 简而言
我一直认为当内核通过 procfs 写入用户时,copy_to_user 是必要的。 虽然我忘了做一次(我使用了 snprintf),但一切正常。既然我注意到了,我就一直在寻找。我找到了 this l
为什么内核要使用copy_to_user函数? 直接操作用户空间的数据不行吗? 最佳答案 内核和用户空间应用程序具有不同的地址空间,因此复制到用户空间需要更改地址空间。每个进程都有自己的(用户)地址空
我正在尝试定义一个系统调用来修改传递给它的字符缓冲区。具体来说,像这样: ... asmlinkage int sys_mycall( char __user *buff, int len ) {
以下是我的简单驱动程序代码的摘录。 int vprobe_ioctl( struct file *filep, unsigned int cmd, void *UserInp) { case
我正在开发 Linux 驱动程序,发现在某些情况下 copy_to_user() 花费的时间比预期的要长得多。我想它可能正在等待 mm->mmap_sem 信号量,也许吧?在不利情况下似乎还有额外的
披露:我是 C 的新手。如果您能详细解释任何答案,我将不胜感激。 我正在编写一个 linux 内核模块,在我正在编写的其中一个函数中,我需要将一个结构复制到用户空间,如下所示: typedef str
我是一名优秀的程序员,十分优秀!