将枚举从内核模块传递给用户空间程序

Passing enum from kernel module to UserSpace program

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

typedef enum{
KeyOn,
KeyOff,
}State; 

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

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

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

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

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

你传递给内核的指针是用户space进程虚拟内存中的一个虚拟地址。内核需要将该地址转换为相应的物理地址,以便用结果填充该地址。 为此操作 copy_to_user 被创建 - 它在内核地址 space 中获取一个指针并将其复制到用户进程地址 space.

中的指针

从上面写的所有你应该已经明白你的问题是无效的 - 枚举值不是指针,所以没有必要在上面调用 copy_to_user,你可以 return照原样。

接下来我们需要讨论的是什么是 ENUM。枚举是许多现代语言提供的语法糖,允许将值定义为 human-readable 标识符。 枚举键不存在 past-compilation,只有整数值在函数之间传递。它们很像 #define 被翻译成它们的值,命名的键不再重要。

从内核 returning ENUM 时,您唯一需要做的就是确保您 #include 在用户程序中使用正确的 header 以便您可以翻译枚举键在您的程序中正确表示的数字。在运行时 - 传递的都是数字。