我想在用户空间应用程序中使用monitor
和mwait
指令。不幸的是,它们是只能通过响铃0执行的特权指令。
我的应用程序具有root访问权限。如何将权限升级为响铃0?
我考虑过将内核模块添加为系统调用的内核模块,但这会破坏我需要的性能改进。
编译自定义内核是一种选择。我不知道在源中哪里可以找到切换到环0的位置,也不知道它是否会对例如任何副作用产生任何副作用。虚拟内存。
有什么想法吗?
答案 0 :(得分:1)
使用标准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
以使用0
将响铃设置为regs->cs &= ~0x3;
或类似的东西。
但是,我强烈建议你,不要这样做。