c - 为什么某些内核操作不能用 C 编写

标签 c assembly kernel

如果这听起来微不足道和含糊不清,我深表歉意,但我无法找到一种直观的方式来谷歌它,为什么一些内核操作,如保存寄存器和堆栈的当前状态(仅举几例)被写入在 assembly ?为什么它们不能用 C 编写,因为毕竟,大概,当编译完成时,我们得到的只是目标代码?此外,当您使用 ollydbg 时,您会注意到在函数调用之前(在 C 中),寄存器的当前状态被压入堆栈

最佳答案

编写操作系统时,主要目标是保持最高的抽象,使代码可在不同的架构上重用,但最终不可避免地架构

每台机器都以一种通用编程语言无法支持的特殊方式执行非常低级的功能。

任务切换、总线控制、设备中断处理,仅举几例,无法使用高级语言进行有效编码(考虑指令序列、涉及的寄存器以及最终的关键 CPU 时序和优先级)。

另一方面,使用混合编程,即内联汇编器也不方便,因为精心制作的模块将不再抽象,包含无法重用的特定架构代码。

常见的解决方案是按照最高抽象级别编写所有代码,将专用代码减少到几个模块。这些例程完全用汇编语言编写,通常根据提供的输入和预期的输出进行明确定义,因此程序员可以在不同的体系结构上产生相同的结果。

然后只需切换汇编例程集即可针对不同的 CPU 进行编译。

关于c - 为什么某些内核操作不能用 C 编写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45161517/

相关文章:

c - 自己编写的简单 memset 不适用于 ARMv7 上的 -03 eabi gcc

x86 - 目前哪些汇编器支持 AVX 指令集?

assembly - 了解引导加载程序汇编代码和内存位置

c - Linux 内核模块——冗余包含

linux - Linux 上的 USB HID 设备轮询间隔

c - libxml2 编写器差异

objective-c - Perlin 噪声 : I have the source code, 现在是什么?

c - 如何在 gradle 中的构建类型中为 native 代码定义宏?

linux-kernel - 上下文切换内部

c - 如何在C中声明全局变量?