什么阻止我执行jmp @9274592
,即使它超出了我的计划限制?不要直接写入CPU吗?在我假设的操作系统中,究竟是什么阻止命令被执行?
答案 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)
如果你跳到任意位置,很多事情可能会出错:
假设您目前没有进行系统逻辑内存转换,可能会发生这样的事情:
如果您使用的是具有逻辑内存转换的系统:
以上任何一种情况都会触发故障或陷阱。