Memory 硬件和编译器如何处理交叉到不可执行页的x86指令?

Memory 硬件和编译器如何处理交叉到不可执行页的x86指令?,memory,compiler-construction,assembly,x86,Memory,Compiler Construction,Assembly,X86,与(大多数)RISC arch不同,x86指令具有可变长度。指令的开始/结束不必对齐。如果编译器不这样做,则一条指令可能正好位于页边距上 假设指令的第一个字节位于标记为可执行的页面的最后一个字节。指令的其余字节位于第二页,该页标记为不可执行 在这种情况下,当执行到达该指令时,CPU中会发生什么 编译器需要注意这种情况吗?硬件将(应该,还没有测试)生成GPF 编译器不应该在意。向上投票,原因不明的向下投票。当下一页可执行时,它就可以工作了。获取是在对齐的块中完成的,为解码器提供一个队列。从单独的页

与(大多数)RISC arch不同,x86指令具有可变长度。指令的开始/结束不必对齐。如果编译器不这样做,则一条指令可能正好位于页边距上

假设指令的第一个字节位于标记为可执行的页面的最后一个字节。指令的其余字节位于第二页,该页标记为不可执行

在这种情况下,当执行到达该指令时,CPU中会发生什么

编译器需要注意这种情况吗?

硬件将(应该,还没有测试)生成GPF


编译器不应该在意。

向上投票,原因不明的向下投票。当下一页可执行时,它就可以工作了。获取是在对齐的块中完成的,为解码器提供一个队列。从单独的页面合并字节发生在提取之后的一段时间,在TLB检查之后,所以这不像页面分割数据加载。我似乎想起了早期的iapx286芯片在保护模式下的一个错误。要么它无法对跨越边界的指令执行GPF,要么它会错误地对应该正好适合内部的指令执行GPF。现在想不起来了#琐事:-)