将枚举从内核模块传递给用户空间程序
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 以便您可以翻译枚举键在您的程序中正确表示的数字。在运行时 - 传递的都是数字。
我必须跟踪 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 以便您可以翻译枚举键在您的程序中正确表示的数字。在运行时 - 传递的都是数字。