我想在用户空间应用程序中使用monitor
和mwait
说明。不幸的是,它们是只能由 ring 0 执行的特权指令。
我的应用程序具有 root 访问权限。如何将权限升级到响铃 0?
我考虑过将它们添加为系统调用的内核模块,但这破坏了我需要它们的性能改进。
编译自定义内核是一种选择。但是,我不知道到环 0 的开关可能位于源中的哪个位置,也不知道它是否会对例如虚拟内存产生任何副作用。
有任何想法吗?
我想在用户空间应用程序中使用monitor
和mwait
说明。不幸的是,它们是只能由 ring 0 执行的特权指令。
我的应用程序具有 root 访问权限。如何将权限升级到响铃 0?
我考虑过将它们添加为系统调用的内核模块,但这破坏了我需要它们的性能改进。
编译自定义内核是一种选择。但是,我不知道到环 0 的开关可能位于源中的哪个位置,也不知道它是否会对例如虚拟内存产生任何副作用。
有任何想法吗?
使用标准 linux 内核无法从用户空间获取 ring0。最好编写一个内核模块来做你想做的事情。但是如果你真的想在用户空间有一个 ring0,我会给你一个起点。
x86 处理器将当前特权级别存储在寄存器的两个最低有效位中cs
。
当创建新线程时,Linux 内核会检查该线程是用户线程还是内核一,并cs
为该任务存储适当的值。(证明:copy_thread()
在arch/x86/kernel/process_32.c
)。
task_pt_regs()
因此,您可以使用( arch/x86/include/asm/processor.h
) 宏获取指向任务寄存器的指针,cs
并将 ring 设置为0
withregs->cs &= ~0x3;
或类似的东西。
但是,我再次强烈建议您,不要这样做。