好的,所以我知道我们所有的 C/C++ 程序员都曾遇到过我们不合时宜的克星,恶魔信号 SIGSEGV,分段错误。现在,我理解(强调过去时)这是某种形式的故障安全/检查系统,它位于由神奇的 GCC(或 g++)编译器或您拥有的机器代码的某些部分中。
但!今天,我在虚拟化 Arch Linux 系统上使用了一些带有良好旧 NASM 的 x86 汇编程序,令我惊讶和懊恼的是,我的编码工作再次被邪恶的 SegFault 挫败。
这是产生可怕信号的代码:
mov eax, 0x7
mov [0xB8000], eax
现在,我知道 Linux 内核将您组装的程序加载到一个 shell 中并从那里执行它,但我认为这个 MOV 指令与处理器进行了 1 对 1 的交互,内核到底如何检测到我正在尝试访问一个它不想让我留下一点记忆,然后停止指令?
我不假装理解当你的程序加载到 shell 时究竟发生了什么,你在 shell 中拥有什么权限,甚至不知道 shell 是什么或它是如何工作的,但我曾经确信 ASM 给了你完全控制处理器。这个神奇的内核如何干扰我对处理器的直接命令,为什么我在编写本质上是纯机器代码时仍然被迫通过这个操作系统命令链?:O