我必须跟踪KeyStates,我想使用下面的枚举,
typedef enum{
KeyOn,
KeyOff,
}State; 我想把这个传递给用户空间程序。我不知道该如何编写我的copy_to_user()函数。如何将按键的状态传递给用户空间?
发布于 2017-07-29 09:05:04
让我们首先讨论copy_to_user做什么以及为什么需要它的问题?
现代计算机使用的是一种叫做虚拟存储器的机制。这是一种允许两种主要功能的机制--在不同进程之间分离内存,以及分配比机器上的物理内存更多的虚拟内存。
对于每个进程,都有一个不同的虚拟内存空间,不同的进程可以有相同的虚拟地址指向不同的物理地址。
内核在进程的虚拟地址空间之间映射到它们的物理地址。但是,当您传递内核一个指针时会发生什么呢?
您传递给内核的指针是用户空间中处理虚拟内存的虚拟地址。内核需要将该地址转换为相应的物理地址,以便用结果填充该地址。对于该操作,创建了copy_to_user --它在内核的地址空间中获取一个指针,并将其复制到用户进程地址空间中的指针中。
从上面所写的所有内容中,您应该已经了解到您的问题是无效的-- Enum值不是指针,因此没有必要在上面调用copy_to_user,您可以按原样返回它。
接下来我们需要讨论的是什么是ENUM。枚举是许多现代语言提供的一种语法糖,它允许将值定义为人类可读的标识符。枚举键在编译后不存在,只有函数之间传递的整数值。它们很像#define,被转换成它们的值,命名的键不再重要。
在从内核返回ENUM时,唯一需要做的事情是确保您在用户程序中#include适当的头,以便您可以转换枚举键在程序中正确表示的数字。在运行时,所有传递的都是数字。
https://stackoverflow.com/questions/45387179
复制相似问题