【问题标题】:assembler programming in user space用户空间中的汇编程序
【发布时间】:2010-01-25 16:13:56
【问题描述】:

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

【问题讨论】:

    标签: c assembly linux-kernel arm


    【解决方案1】:

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

    【讨论】:

    • 谁允许/禁止他们?内核或 CPU 有一些技术可以做到这一点?
    【解决方案2】:

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

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

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

    【讨论】:

    • 是否是 root 对您可以执行哪些指令没有影响。不同之处在于 CPU 运行的模式,这在用户进程和内核运行时是不同的。毕竟,进程的 user-id 只不过是存储在内核内存结构中的一个整数。
    • 唯一明显的例外可能是,如果用户进程执行了一个特权 inst,内核捕获了非法指令陷阱,认为没问题,为您执行指令,然后将您隐形返回到特权之后的指令。这就是浮点指令有时在没有物理 FPU 的情况下模拟的方式,或者黑客在 armv4t 处理器上运行 armv5t 代码的方式(例如benno.id.au/blog/2007/11/21/android-neo1973),但我从未听说过这种机制用于过滤特权指令到 root仅处理。
    【解决方案3】:

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

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

    如果您在评论中说神秘的 mrc 指令应该实现什么,则更容易判断这是否是特权指令。

    希望有帮助

    【讨论】:

      猜你喜欢
      • 2011-05-04
      • 2020-02-10
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      相关资源
      最近更新 更多