将枚举从内核模块传递给UserSpace程序

时间:2017-07-29 08:34:04

标签: c linux-kernel driver linux-device-driver device-driver

我必须跟踪KeyStates,我想使用以下枚举,

typedef enum{
KeyOn,
KeyOff,
}State; 

我想将此传递给用户空间程序。我不确定应该如何编写copy_to_user()函数。 如何将按键状态传递给用户空间?

1 个答案:

答案 0 :(得分:1)

让我们首先解决copy_to_user做什么以及为什么需要它的问题?

现代计算机使用称为Virtual Memory的机制。这是一种允许两个主要内容的机制 - 不同进程之间的内存分离,以及比计算机上的物理内存分配更多的虚拟内存。

对于每个进程,都有一个独特的虚拟内存空间,不同的进程可以具有相同的虚拟地址指向不同的物理地址。

内核将进程的虚拟地址空间映射到其物理地址。但是当你向内核传递指针时会发生什么?

传递给内核的指针是用户空间处理虚拟内存中的虚拟地址。内核需要将该地址转换为相应的物理地址,以便用结果填充该地址。 对于该操作copy_to_user已创建 - 它在内核的地址空间中使用指针并将其复制到用户进程地址空间中的指针。

从上面的所有内容中你已经明白你的问题是无效的 - 枚举值不是指针,因此不需要在其上调用copy_to_user,你可以按原样返回。

我们需要讨论的下一件事是什么是ENUM。枚举是许多现代语言提供的语法糖,允许将值定义为人类可读的标识符。 枚举键不存在过去编译,只有函数之间传递的整数值。它们的翻译方式与#define非常相似,而且命名密钥不再重要。

从内核返回ENUM时,您唯一需要做的就是确保#include用户程序中的正确标题,以便您可以在程序中正确翻译枚举键所代表的数字。在运行时 - 数字就是所有传递的。