- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要将内核空间中的curr_task->pid
,一个pid_t
,复制到用户空间中一个结构体的域中,该结构体的域有很长的空间。由于这是一个不断扩大的转换,我预计不会出现任何问题。
但是,我收到了一个烦人的编译器警告(copy_long_to_user
的所有意图和目的与 copy_to_user
相同):
cs300/process_ancestors.c:31:3: warning: passing argument 2 of ‘copy_long_to_user’ from incompatible pointer type [enabled by default]
if(copy_long_to_user(&info_array[num_filled_kernel].pid, &curr_task->pid)) {
^
cs300/process_ancestors.c:9:5: note: expected ‘long int *’ but argument is of type ‘pid_t *’
这个警告是我可以放心忽略的吗(编译器会为我进行转换)吗?如果我需要将 curr_task->pid
显式转换为 long,我该如何在使用 copy_to_user
的上下文中执行此操作?我的猜测是它类似于:(copy_long_to_user(&info_array[num_filled_kernel].pid, &((long)curr_task->pid)))
最佳答案
您需要一个辅助变量才能正确执行此操作。
long curr_pid = curr_task->pid;
copy_long_to_user(&info_array[num_filled_kernel].pid, &curr_pid);
获取辅助变量的地址是合法的,临时地址(由强制转换生成)则不合法。
关于转换和 copy_to_user 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36658773/
我已经为我的内核模块实现了一个字符设备,并为其实现了一个读取函数。读取函数调用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
我是一名优秀的程序员,十分优秀!