操作系统的核心(设备交互级别)是否真的用C语言编写,或者“用C语言编写”意味着只有大部分操作系统是用C语言编写的,与设备的交互是用asm编写的?
为什么我要问:
行。那我到底怎么样?我无法想象如何与控制器硬盘或USB控制器或其他一些我们应该发送信号的实际内容进行交互而不用(或少量)asm。 毕竟,谢谢。我将看看其他一些网络来源。
PS(洪水)很可惜我们在大学没有操作系统课程,尽管MIPT是麻省理工学院的俄罗斯双胞胎,但我发现没有人在这里编写像minix这样的操作系统。答案 0 :(得分:9)
Unix中的基本思想是用C写几乎所有东西。所以最初,99%的东西是C,这是重点,主要目标是可移植性。
所以为了回答你的问题,与设备的交互也用C编写,是的。即使非常低级的东西也是用C语言编写的,特别是在Unix中。但是用汇编语言编写的部分仍然很少。例如,在x86上,任何操作系统的引导加载程序都将包含汇编程序中的某些部分。您可能使用汇编语言编写设备驱动程序的一小部分。但它并不常见,即使它已经完成,它通常只是最低级别代码的一小部分。多少完全取决于实现。例如,NetBSD可以运行在几十种不同的体系结构上,因此它们不惜一切代价避免使用汇编语言;相反,Apple并不关心可移植性,因此MacOS libc的一个不错的部分是用汇编语言编写的。
答案 1 :(得分:3)
通常,组装量很少(因为你需要一些),其余部分用C语言编写并与之接口。您可以在汇编中编写函数并从C调用它们,这样就可以封装您想要的任何功能。
通过一些特定于实现的技巧,可以完全用C编写驱动程序,因为通常可以创建一个使用内存映射设备寄存器的volatile int *
。
答案 2 :(得分:3)
取决于。
具有简单CPU的小型嵌入式设备的操作系统可以完全用C语言编写(或C ++)。 对于更复杂的操作系统,例如当前的Windows或Linux,很可能是在汇编中编写了一些小部件。我期望它们在任务调度程序中最常见,因为它有一些棘手的特殊CPU寄存器,它可能需要使用编译器通常不会生成的一些特殊指令。
设备驱动程序几乎总是可以用C语言编写。
答案 3 :(得分:3)
有些操作系统是用汇编语言编写的,但是为了便携性,用C语言等高级语言编写内核更为常见。通常(although this is not always the case),用高级语言编写的内核也会为编译器无法表达的项目提供一些小的汇编语言,并且由于某种原因需要在汇编程序中编写。典型的例子是:
某些仅内核模式的指令 操纵MMU或执行 标准编译器无法生成其他特权操作。在这种情况下,代码必须用汇编语言编写。
特定于平台的性能优化。例如,X64架构具有端到端交换指令,ARM具有桶形移位器(将字旋转为N位读取),可用于加载操作。
将“胶水”装配到与(例如)C的堆栈帧结构,数据格式或参数布局约定不能很好地匹配的东西上。
答案 4 :(得分:2)
还有其他语言编写的操作系统,例如:
答案 5 :(得分:1)
您不必怀疑这些问题。去抓取linux内核源代码并自己寻找。大多数程序集都存储在arch
目录中的每个体系结构中。绝大多数都在C中,这并不奇怪。毕竟,编译器会生成本机机器码。它也不一定是C。我们工作的嵌入式内核是用C ++编写的。
答案 6 :(得分:1)
如果您对特定指针感兴趣,请考虑Linux内核。整个软件树几乎都是用C语言编写的。内核中使用的最着名的汇编部分是entry.S
,它特定于每个架构:
此外,对于每个体系结构,C中不可能的功能和优化(例如自旋锁,原子操作)可以在汇编中实现: