代码之家  ›  专栏  ›  技术社区  ›  Ben Usman

OSs的核心(设备抽象层)是完全用C语言编写的吗?(例如:“UNIX是用C编写的”)

  •  5
  • Ben Usman  · 技术社区  · 15 年前

    OSs(设备交互层)的核心是真的用C写的,还是“用C写的”意味着只有大部分操作系统是用C写的,与设备的交互是用asm写的?

    我为什么这么问:

    1. 如果core是用asm编写的,那么它不能跨平台。

    好 啊。我真的无法想象如何与控制器HDD或USB控制器或其他一些我们应该在没有(或少量)asm的情况下发送要写入的信号的真实东西进行交互。 毕竟,谢谢。我来看看其他的网络资源。

    很遗憾我们大学里没有操作系统课程,尽管MIPT是麻省理工学院的俄罗斯双胞胎,但我发现这里没有人写过像minix这样的操作系统。

    7 回复  |  直到 15 年前
        1
  •  3
  •   Bart van Ingen Schenau    15 年前

    这要看情况。

    一个小的、嵌入式的、具有简单CPU的设备的OS可以完全用C(或C++)编写。
    对于更复杂的操作系统,如当前的Windows或Linux,很可能有小部分是用汇编编写的。我希望它们大部分都在任务调度程序中,因为它在处理特殊的CPU寄存器时有一些棘手的问题,而且它可能需要使用一些编译器通常不会生成的特殊指令。

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

        2
  •  9
  •   Jean    15 年前

    Unix的基本思想是用C语言编写几乎所有的东西,所以最初,99%是C语言,这是重点,主要目标是可移植性。

        3
  •  3
  •   David Thornley    15 年前

    通常情况下,只有很少的程序集(因为您需要一些程序集),其余的程序集是用C语言编写的,并与之接口。可以在程序集中编写函数并从C调用它们,这样就可以封装任何需要的功能。

    通过一些特定于实现的技巧,完全用C编写驱动程序是可能的,因为通常可以创建 volatile int * 将使用内存映射设备寄存器的。

        4
  •  3
  •   ConcernedOfTunbridgeWells    15 年前

    although this is not always the case ),用高级语言编写的内核也会有一些汇编语言的小部分,用于编译器无法表示的项,并且由于某种原因需要用汇编语言编写。典型的例子有:

    • 某些仅限内核模式的指令 其他特权操作不能由标准编译器生成。在这种情况下,代码必须用汇编语言编写。

    • 平台特定性能优化。例如,X64体系结构有一个端部交换指令,ARM有一个桶形移位器(将要读取的字旋转N位),可用于加载操作。

        6
  •  1
  •   Karl Bielefeldt    15 年前

    你不必对这样的问题感到疑惑。去获取linux内核源代码并寻找自己。大多数程序集存储在 arch 目录。绝大多数都在C语言中并不奇怪,毕竟编译器会生成本机代码。也不一定是C。我们在工作中嵌入的内核是用C++编写的。

        7
  •  1
  •   Noah Watkins    15 年前

    如果您对特定的指针感兴趣,那么请考虑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

    推荐文章