【问题标题】:Is it possible to implement a small Disk OS in C or C++?是否可以用 C 或 C++ 实现小型磁盘操作系统?
【发布时间】:2011-10-10 07:25:09
【问题描述】:

试图做任何这样的事情,但出于好奇,我想知道是否可以实现“整个操作系统”(不一定像 Linux 或 Microsoft Windows 那样大,但更像使用 C 和/或 C++ 编写的类似 DOS 的小型操作系统),不使用或只使用很少的程序集。

通过实现一个操作系统,我的意思是从头开始制作一个操作系统,启动引导加载程序和内核,再到 C 或 C++ 中的图形驱动程序(以及可选的 GUI)。我已经看到通过编译器访问低级功能在 C++ 中完成了一些低级的事情。这可以为整个操作系统完成吗?

我不是在问这是否是一个好主意,我只是在问它是否有可能?

【问题讨论】:

  • +1 - 一直想知道这是否可能
  • 真正早期的 UNIX 是用 C 语言编写的 - 在 DEC PDP 上你可以从贝尔实验室获得一盘带有操作系统 C 代码的磁带。
  • @Schnommus 猜猜我不是唯一一个讨厌用 asm 编码的人。 :D
  • 是的。 Microware Enhanced OS-9 几乎完全用 C 语言编写,并在绝对必要的情况下使用了一些汇编程序。仅供参考 - OS-9 是一个非常强大的多用户 *nix,类似于嵌入式 RTOS。

标签: c++ c operating-system systems-programming


【解决方案1】:

Obligatory link to the OSDev wiki,它描述了在 x86/x64 上创建操作系统所需的大部分步骤。

要回答您的问题,创建引导加载程序并启动保护模式将非常困难/不愉快,而无需借助至少一些程序集,尽管它可以保持在最低限度(特别是如果您没有真正计算诸如使用__asm__ ( "lidt %0\n" : : "m" (*idt) ); 作为“程序集”之类的东西。

一个很大的障碍(同样在 x86 上)是处理器以 16 位实模式启动,因此您需要一些 16 位代码。根据this discussion,您可以让 GCC 生成 16 位代码,但您仍然需要一些方法来设置内存、从某些存储介质加载代码等等,所有这些都需要以标准 C 的方式与硬件接口没有(中断、IO 端口等)的概念。

对于仅通过内存映射 IO 与硬件进行通信的体系结构,您可能会在纯 C 中编写除 C 启动代码(设置堆栈、初始化变量等)之外的所有内容,尽管特定要求中断例程/异常或系统调用门等可能难以实现(因为您必须访问特殊的 CPU 寄存器)。

【讨论】:

  • OTOH,只有 mmaped I/O 的架构往往具有比 PC BIOS 初始化更少硬件的固件(在嵌入式设备的极端情况下,您将不得不初始化 DRAM 和缓存)。
【解决方案2】:

我假设您有一个适用于 x86 的操作系统。在这种情况下,您至少需要几页汇编程序来设置保护模式和类似的东西,除此之外,还有很多关于分页、调用门、响铃、异常等所有东西的知识。如果你要使用某种形式的系统调用,您还需要几行汇编代码来在内核和用户空间模式之间切换。

除了这些之外,操作系统的其余部分都可以轻松地用 C 进行编程。对于 C++,您需要一个运行时环境来支持虚拟成员和异常等内容,但据我所知,这些都可以用 C 进行编程。

看看 Linux kernel source,最重要的汇编代码(用于 x86)可以在 arch/x86/boot 中找到,但您会注意到即使在该目录中,大多数文件也是用 C 编写的。此外您会在 arch/x86/kernel 目录中找到一些用于处理系统调用之类的装配线。

在 arch 目录之外几乎没有使用任何汇编程序(因为汇编程序是特定于机器的,该机器特定的代码属于 arch 目录)。甚至图形驱动程序也不使用汇编程序(例如,驱动程序/gpu/drm/nouveau 中的 nvidia 驱动程序)。

【讨论】:

    【解决方案3】:

    引导加载程序?你可能想跳过那一点。例如,Linux 经常由非 Linux 引导加载程序启动,例如 UBoot。毕竟,一旦系统运行,操作系统就会出现,但不会出现引导加载程序,它只是为了让操作系统正确进入内存。

    一旦您选择了一个不错的现有引导加载程序,其余的几乎都是直截了当的。好吧,您必须自己处理内存和文件;你显然不能依赖fopen。但即使是 C++ 编译器,生成无需操作系统支持即可运行的代码也没有什么问题。

    【讨论】:

      猜你喜欢
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-04
      • 2021-03-28
      • 2019-11-01
      • 2012-08-27
      • 2010-12-31
      相关资源
      最近更新 更多