在用户空间中有可能有这样的一段代码吗?我的意思是,在Netbsd / Linux的用户空间中读/写协处理器寄存器是可能的吗?
XYZ]# cat pmc.c
static inline int
arm11_pmc_ctrl_read(void)
{
unsigned int val;
__asm volatile ("mrc p15, 0, %0, c15, c12, 0" : "=r" (val));
return val;
}
int main(){
unsigned int ctrl;
ctrl = arm11_pmc_ctrl_read();
}发布于 2010-01-26 00:24:53
您可能必须通过在二进制可执行文件上应用suid位来更改它的权限,它将以root用户身份运行,我知道,这听起来可能是一个安全漏洞,但不幸的是,root用户将拥有运行它的权限,而不是普通用户。
或者您可以使用mknod创建一个设备,即/dev/mydev,然后编写一个设备驱动程序,普通用户可以在其中与设备驱动程序交互,设备驱动程序反过来在内核空间中运行,并进行汇编魔术,然后将其返回到用户空间,这种方法更可取。
希望这能有所帮助,致以最好的问候,汤姆。
发布于 2010-01-26 00:18:08
用户空间不能访问特权指令或寄存器。查看你的汇编手册,看看你使用的指令和寄存器是否有特权。
发布于 2010-01-30 19:42:10
可以,您可以以用户身份读/写协处理器寄存器。例如,所有的浮点指令都是协处理器指令,用户空间的二进制代码非常愉快地调用它们,从ARM寄存器读取/写入FPU寄存器值。
指令的可用性取决于CPU模式,这种模式在用户进程中与内核执行某些操作时不同,因此可能某些指令,无论是在协处理器上还是在主处理器上,都只允许在内核模式下使用。停止CPU的指令是一个非coproc示例。
如果你在评论中说了神秘的mrc指令应该实现什么,那么就更容易判断这是否是特权指令。
希望这能有所帮助
https://stackoverflow.com/questions/2133638
复制相似问题