操作系统的核心(设备抽象层)是否完全使用C语言编写?(例如:“UNIX是用C语言编写的”)

5
操作系统的核心(设备交互层)是否真的是用C语言编写的,或者“用C语言编写”只是指大部分操作系统都是用C语言编写的,与设备交互的部分是用汇编语言编写的?
我问这个问题的原因是:
1.如果内核是用汇编语言编写的,则无法实现跨平台。 2.如果它是用C语言编写的,则我无法想象如何使用C语言编写。
好的。至于I / O - 我无法想象如何在没有(或仅有少量的)汇编语言的情况下与控制器HDD、USB控制器或其他一些实际的东西进行交互,我们需要发送信号来编写。总之,谢谢。我会查看一些其他网络来源。
PS(水一下)很遗憾我们大学没有操作系统课程,尽管MIPT是MIT的俄罗斯姊妹学校,但我发现没有人像minix那样编写操作系统。

2
大多数操作系统认为进程调度、内存管理、文件系统交互等高级内容是核心,而不是设备交互。 - nos
7个回答

9
Unix的基本思想是几乎所有东西都用C语言编写。所以最初,大约99%的内容都是C语言编写的,这是重点,主要目标是可移植性。
因此,回答您的问题,与设备的交互也是用C语言编写的。即使是非常低级别的东西,在Unix中也是用C语言编写的。但是仍然有很少部分使用汇编语言编写。例如,在x86上,任何操作系统的引导加载程序都将包含一些汇编代码。您可能会发现一些设备驱动程序的小部分是用汇编语言编写的。但这是不常见的,即使这样做,它通常只占最低级别代码的一小部分。具体情况取决于实现方式。例如,NetBSD可以在数十种不同的架构上运行,因此他们尽量避免使用汇编语言;相反,Apple不关心可移植性,因此MacOS libc的相当一部分是用汇编语言编写的。

1
有些东西必须用汇编语言编写,至少在某些架构中,例如任务交换等。但是众所周知,在NetBSD中所有(据我所知)所谓的低级PCI相关内容都是用C语言编写的。 - Prof. Falken
Apple确实关心可移植性。它当前的操作系统必须在i386、x86_64和ARM架构上运行。以前的版本(OS X 10.5)也在PowerPC架构上运行过。我怀疑除了系统调用接口外,它的C库是否有任何汇编语言编写的部分。 - JeremyP
是的,他们确实支持,但我指的是概括性的。与任何直接竞争对手相比,他们支持的硬件配置要少得多,在这个意义上,他们的可移植性问题也要少得多。关于libc,我没有看到源代码;我读到类似strcmp是用汇编语言编写的。 - Jean

3
通常情况下,需要一些汇编代码(因为必须),其余的则用C语言编写并与之交互。您可以在汇编中编写函数,并从C中调用它们,因此您可以封装所需的任何功能。
通过一些特定于实现的技巧,完全可以使用C语言编写驱动程序,因为通常可以创建一个使用内存映射设备寄存器的易失性整数指针(例如volatile int *)。

3

这取决于情况。

对于一个小型嵌入式设备和简单CPU的操作系统,可以完全使用C语言(或者同样使用C++语言)。
对于更复杂的操作系统,例如当前的Windows或Linux,则很可能使用了少量的汇编语言来编写。我预计在任务调度程序中会使用最多,因为它需要对一些特殊的CPU寄存器进行一些棘手的操作,并且可能需要使用一些编译器通常无法生成的特殊指令。

几乎所有的设备驱动程序都可以完全使用C语言编写。


“可以完全用C语言编写” - 这是因为CPU开发人员已经使用C接口以C和ASM代码的形式编写了所有库吗? “设备驱动程序可以” - 如何实现?我认为,当我们例如向HDD写入数据时,必须调用指令来正确地转动HDD的内部元素。 - Ben Usman
1
@MInner:并不是因为CPU开发商提供了特殊库,而是编译器可以生成正确的代码来访问设备(或连接到设备的通信总线)。 - Bart van Ingen Schenau
这个编译器是为这个平台还是任何平台?如果是任何平台...那么编译器应该非常强大或者可调节。 - Ben Usman
@MInner:编译器总是针对特定(一组相关的)平台进行优化。你不能将i386可执行文件在ARM处理器上运行,但是使用两个适当的编译器,你可以从同一源代码创建i386可执行文件和ARM可执行文件。 - Bart van Ingen Schenau
@MInner:大多数硬件都连接到标准通信总线,例如PCI或I2C,因此更换设备可能会改变其可寻址位置或其理解的命令等内容,但不会改变发送命令给设备的方式。对于像硬盘驱动器这样旨在互换的设备,有更高级别的协议规定了您可以使用的(最小)命令集。 - Bart van Ingen Schenau
显示剩余2条评论

3

有些操作系统是用汇编语言编写的,但更常见的情况是使用高级语言(如C语言)编写内核以实现可移植性。通常情况下(尽管不总是这样),用高级语言编写的内核也会包含一些汇编代码,因为编译器无法表达某些内容并且需要用汇编语言编写。 典型示例包括:

  • 特定于内核模式的指令,用于操作MMU或执行其他特权操作,标准编译器无法生成。在这种情况下,必须使用汇编语言编写代码。

  • 平台特定的性能优化。例如,X64架构具有端点交换指令,而ARM具有可用于加载操作的旋转位移器(将读取的单词旋转N位)。

  • 用汇编“粘合”来接口无法与(例如)C的堆栈帧结构、数据格式或参数布局约定相适应的内容。



1

你不必对这些问题感到疑惑。去获取Linux内核源代码并自行查看即可。大部分汇编语言存储在arch目录下,按体系结构分类。绝大多数都是C语言也并不奇怪。毕竟编译器生成本地机器码。它也不一定非得是C语言。我们工作中的嵌入式内核是用C++编写的。


但这正是SO记录所有编程事实,无论简单还是复杂的原因。 - Prof. Falken

1

如果你对特定的指针感兴趣,那么可以考虑Linux内核。整个软件树几乎全部都是用C语言编写的。内核中最著名的汇编部分是entry.S,它是针对每种架构特定的:

http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=arch/x86/kernel/entry_64.S;h=17be5ec7cbbad332973b6b46a79cdb3db2832f74;hb=HEAD

此外,针对每种架构,无法在 C 语言中实现的功能和优化(例如自旋锁、原子操作)可以用汇编语言实现:

http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=arch/x86/include/asm/spinlock.h;h=3089f70c0c52059e569c8745d1dcca089daee8af;hb=HEAD


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接