为什么有些操作系统的事件处理是用 asm 而不是 c 编写的?

MAK*_*AKZ 17 c kernel assembly

我的问题是为什么现在一些操作系统事件处理仍然用汇编语言而不是更高级的语言(如 C)编写,而内核本身主要是用 C 编写的?

小智 25

该语言抽象了对 CPU 寄存器的访问,并且操作系统在处理事件时必须保存上下文,因此它需要在事件点访问寄存器,从而破坏了 C 规范。


小智 19

C 是对机器上运行的机器代码的抽象(尽管比大多数其他语言更接近)。

对于那些不能用 C 表达的机器代码语句,可能使用 C 编译器未提供的额外优化,主要以内联汇编器的形式。

在内核源代码树,这是存储在arch/<arch>include/asm-<arch>其中<arch>一个特定的架构名称。它实际上只是完整内核源代码的一小部分。


小智 7

你不能在 C 中做到这一点 :)

lgdt[xxxx]
mov eax, cr0
or al, 0x01
mov cr0, eax
Run Code Online (Sandbox Code Playgroud)

我正在尝试进入 x86 保护模式。显然,我仍然可以通过“发出”原始机器代码在 C 中做到这一点,但仍然万一我需要访问精确的偏移量 - 我主要是运气不好。

第二个例子是 BootLoader。在 x86 系统上,要求传统的引导代码长度恰好为 512 字节,最后两个字节分别为 0xAA 和 0x55(或 55 AA)...以一种奇妙的方式工作。

还有更多这样的情况,其中汇编不仅是可取的,而且是唯一的手段。