我问这个问题的原因是:
1.如果内核是用汇编语言编写的,则无法实现跨平台。 2.如果它是用C语言编写的,则我无法想象如何使用C语言编写。
好的。至于I / O - 我无法想象如何在没有(或仅有少量的)汇编语言的情况下与控制器HDD、USB控制器或其他一些实际的东西进行交互,我们需要发送信号来编写。总之,谢谢。我会查看一些其他网络来源。
PS(水一下)很遗憾我们大学没有操作系统课程,尽管MIPT是MIT的俄罗斯姊妹学校,但我发现没有人像minix那样编写操作系统。
volatile int *
)。这取决于情况。
对于一个小型嵌入式设备和简单CPU的操作系统,可以完全使用C语言(或者同样使用C++语言)。
对于更复杂的操作系统,例如当前的Windows或Linux,则很可能使用了少量的汇编语言来编写。我预计在任务调度程序中会使用最多,因为它需要对一些特殊的CPU寄存器进行一些棘手的操作,并且可能需要使用一些编译器通常无法生成的特殊指令。
几乎所有的设备驱动程序都可以完全使用C语言编写。
有些操作系统是用汇编语言编写的,但更常见的情况是使用高级语言(如C语言)编写内核以实现可移植性。通常情况下(尽管不总是这样),用高级语言编写的内核也会包含一些汇编代码,因为编译器无法表达某些内容并且需要用汇编语言编写。 典型示例包括:
特定于内核模式的指令,用于操作MMU或执行其他特权操作,标准编译器无法生成。在这种情况下,必须使用汇编语言编写代码。
平台特定的性能优化。例如,X64架构具有端点交换指令,而ARM具有可用于加载操作的旋转位移器(将读取的单词旋转N位)。
用汇编“粘合”来接口无法与(例如)C的堆栈帧结构、数据格式或参数布局约定相适应的内容。
你不必对这些问题感到疑惑。去获取Linux内核源代码并自行查看即可。大部分汇编语言存储在arch
目录下,按体系结构分类。绝大多数都是C语言也并不奇怪。毕竟编译器生成本地机器码。它也不一定非得是C语言。我们工作中的嵌入式内核是用C++编写的。
如果你对特定的指针感兴趣,那么可以考虑Linux内核。整个软件树几乎全部都是用C语言编写的。内核中最著名的汇编部分是entry.S
,它是针对每种架构特定的: