0

我想在用户空间应用程序中使用monitormwait说明。不幸的是,它们是只能由 ring 0 执行的特权指令。

我的应用程序具有 root 访问权限。如何将权限升级到响铃 0?

我考虑过将它们添加为系统调用的内核模块,但这破坏了我需要它们的性能改进。

编译自定义内核是一种选择。但是,我不知道到环 0 的开关可能位于源中的哪个位置,也不知道它是否会对例如虚拟内存产生任何副作用。

有任何想法吗?

4

1 回答 1

2

使用标准 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 设置为0withregs->cs &= ~0x3;或类似的东西。

但是,我再次强烈建议您,不要这样做。

于 2013-08-18T14:54:34.603 回答