什么阻止我使用ASM跳转到任何绝对地址?

时间:2016-07-15 08:39:03

标签: assembly operating-system

什么阻止我执行jmp @9274592,即使它超出了我的计划限制?不要直接写入CPU吗?在我假设的操作系统中,究竟是什么阻止命令被执行?

2 个答案:

答案 0 :(得分:11)

这取决于您的操作系统和硬件。在现代系统上,操作系统控制硬件提供的内存保护

在20世纪80年代的典型微处理器中,没有什么能阻止在存储空间中的任何地方访问(包括执行) - 并且错误的代码可能会使机器崩溃。对于具有协作式多任务处理的早期单用户计算机也是如此,例如DOS和原始Mac。

在现代工作站级计算机中,处理器包含Memory Management Unit (MMU),用于控制对内存的访问。最广泛使用的机制是virtual memory,具有每页权限位。每个进程都有自己的虚拟地址空间。

Unix或Linux等操作系统写入MMU以指定当前进程可以读取/写入/执行哪些页面(写入MMU是一种特权操作,不能由进程本身完成)

跳转到没有执行权限的页面中的某个位置会导致处理器陷阱;这会将处理器切换到特权模式并进入内核,然后内核可以决定做什么。通常,这意味着向进程发送SIGSEGV信号(这就是为什么在程序崩溃时可能会看到Segmentation fault之类的错误消息。

当在time-sliced environment中同时运行多个用户进程时,在每个上下文切换时切换MMU内容是内核的工作。 invalidating the TLB on an address-space switch (and the resulting TLB misses)的成本可能构成分时系统的主要开销。

答案 1 :(得分:1)

如果你跳到任意位置,很多事情可能会出错:

假设您目前没有进行系统逻辑内存转换,可能会发生这样的事情:

  1. 内存位置不存在。
  2. 内存位置未正确对齐指令(某些处理器)
  3. 内存位置不包含有效指令。
  4. 如果您使用的是具有逻辑内存转换的系统:

    1. 内存位置没有页表条目。
    2. 内存位置的页表条目标记为无效。
    3. 页表条目标记为no execution。
    4. 页表条目被标记为具有更多权限访问模式。
    5. 内存位置标识尝试访问内存的指令,该内存导致上述任何内容。
    6. 内存位置是一种特权指令,无法在当前访问模式下执行。
    7. 以上任何一种情况都会触发故障或陷阱。