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

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

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

答案1

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

答案2

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

对于那些无法用 C 语言表达的机器代码语句,并且可能使用 C 编译器程序集未提供的额外优化,主要采用以下形式内联汇编器

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

答案3

你不能在 C 中这样做:)

lgdt[xxxx]
mov eax, cr0
or al, 0x01
mov cr0, eax

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

第二个例子是BootLoader。在 x86 系统上,要求传统的引导代码长度恰好为 512 字节,最后两个字节分别为 0xAA 和 0x55(或确切的 55 AA)...确保 C 编译器实现这样的事情是一场噩梦,而汇编器则需要这样做工作以一种奇妙的方式。

在很多这样的情况下,装配不仅是首选,而且是唯一的手段。

答案4

asm 更精简,而且通常比 C 的库等垃圾要快得多,并且操作系统一直在处理大量事件。您需要纤薄且快速的功能来实现此功能。

相关内容