用户空间中的汇编程序编程

时间:2010-01-25 16:13:57

标签: c assembly linux-kernel arm

是否有可能在用户空间中拥有这样的代码? 我的意思是可以在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();
}

3 个答案:

答案 0 :(得分:1)

用户空间无权访问特权指令或寄存器。查看汇编程序手册,了解您使用的指令和寄存器是否具有特权。

答案 1 :(得分:0)

您可能必须通过在其上应用suid位来更改二进制可执行文件的权限,它将以root身份运行,我知道,这听起来像是一个安全漏洞,但不幸的是,root将拥有运行它的特权,而不是普通用户。

或者您可以使用/dev/mydev创建一个设备即mknod并编写一个设备驱动程序,然后普通用户可以在其中与设备驱动程序交互,而设备驱动程序又在内核空间中运行并执行组装魔术并将其返回到用户空间,这种方法更可取。

希望这有帮助, 最好的祝福, 汤姆。

答案 2 :(得分:0)

是的,您可以以用户身份读/写协处理器寄存器。例如,所有浮点指令都是协处理器指令,用户空间二进制文件非常高兴地调用它们,向/从ARM寄存器读取/写入FPU寄存器值。

指令可用性取决于CPU模式,这在用户进程中与内核执行时不同,因此可能是某些指令(无论是在协处理器还是主处理器上)仅在内核模式下允许。停止CPU的指令是一个非coproc示例。

如果你在评论中说出了神秘的mrc指令应该实现的目标,那么就更容易判断这是否是特权指令。

希望有所帮助