【问题标题】:Can I execute any c made prog without any os platform?我可以在没有任何操作系统平台的情况下执行任何 c 制作的 prog 吗?
【发布时间】:2010-12-15 21:55:12
【问题描述】:

我在谷歌上搜索了一下,在某处我读到了....

是的,你可以。这发生在嵌入式系统中

我认为不,这是不可能的。任何平台都必须有操作系统。否则,您的程序本身必须是一个操作系统。 无论是软线还是硬线。如果没有操作系统,您的组件将无法工作。

我是对的还是有人可以解释一下答案吗? (我对嵌入式系统一无所知...)

【问题讨论】:

    标签: c operating-system


    【解决方案1】:

    当然可以。 (典型的)CPU 需要的只是电源和对内存的访问,然后它将执行其硬编码的启动序列。

    通常这将涉及读取一些预定义的地址,将那里的内容解释为指令,然后开始运行它们。

    这些指令当然可以来自 C 程序,尽管在这个级别更常见的是在汇编中编写非常早期的阶段(称为引导)。

    这当然并不意味着,如果我从字面上阅读您的问题标题,任何 C 程序 都以这种方式运行。如果程序假设有一个操作系统,但没有,它就不会工作。这应该很明显。

    【讨论】:

    • 我坐在嵌入式系统课上,非常困惑为什么我们要使用 C,而我的印象是 C 程序需要操作系统才能运行(而且嵌入式系统有时没有操作系统。这个答案直接为我消除了困惑;感谢您的解释。
    【解决方案2】:

    您绝对不需要操作系统来在任何系统上运行您的 C 代码。您将需要两段初始化代码 - 一段用于初始化所需的硬件(处理器、时钟、内存),另一段用于设置堆栈和 C 运行时(即数据和 BSS 部分的初始化)。当然,这意味着您无法利用操作系统提供的多线程、消息传递和同步服务。我会试着把它分解成几个步骤给你一个想法:

    1. 编写一个在板子启动时运行的“reset_routine”。这将初始化时钟和所需的任何外部存储器。 (该例程必须从内部存储器或可以在外部初始化和编程的存储器中执行)。
    2. 在硬件初始化之后,reset_routine 将控制转移到“sw_runtime_init”例程,该例程将设置堆栈和应用程序定义的全局变量。 (从 reset_routine 跳转到 sw_runtime_init 而不是调用以避免堆栈使用)。
    3. 编译并将其链接到您的应用程序,同时确保“reset_routine”链接到重置向量指向的位置。
    4. 将其加载到您的目标上并祈祷。

    【讨论】:

      【解决方案3】:

      例如:Building Bare-Metal ARM Systems with GNU

      许多嵌入式系统没有足够的资源来运行完整的操作系统,有些可能使用调度程序内核或 RTOS,有些则被编码为“裸机”。复位后进入 main() C 入口点。只需要少量的汇编代码来初始化微处理器,执行 C 代码。通常,所有 C 需要运行的是一个堆栈 - 通常只是将堆栈指针初始化为特定地址的情况。可能还需要对中断/异常向量、系统时钟、内存控制器等进行一些特定于处理器的初始化。

      在台式 PC 上,通常您有一个 BIOS 来处理基本硬件初始化,例如 SDRAM 控制器设置和计时,然后从磁盘引导扇区引导,然后引导操作系统。这些代码中的任何一个都可以用 C 编写(其中一些可能是),它可以做除了启动操作系统之外的其他事情——它可以做任何事情——它只是代码。

      操作系统对于非专用计算设备很有用,在这些设备中,最终用户可以选择许多程序中的一个来执行,并且可能同时执行多个程序。大多数嵌入式系统只做一件事,软件通常从 ROM 加载或直接从 ROM 执行,并且永远不会更改并无限期执行(通常仅通过掉电停止)。

      当然,您仍然可以实现设备驱动程序等,但它们通常是应用程序的一个组成部分,而不是一个单独的实体。即使您确实在嵌入式系统中使用 RTOS,它通常仍然是您的应用程序的组成部分,而不是您可能理解的操作系统。在这些情况下,RTOS 就像任何其他库一样只是一个库,并且通常从 main() 初始化和启动,而不是您可能期望的相反方式。

      【讨论】:

      • 我已经在只有 128 字节 RAM(即 128 字节,不是千字节或兆字节)并且包括堆栈空间的系统(基于 8051)上运行 c。显然那里没有操作系统的空间。
      • @chrisharris:我不会这么说。由于它有八个重复的寄存器组,任务上下文切换非常容易实现。在 90 年代初期,我使用 8051(当时它们还是英特尔的部件)和 iDCX-51,一个用于 MCS-51 设备的实时执行程序。然后没有 C 编译器,而是使用 PLM/51 或汇编程序。可以说,实时执行程序不是操作系统,但定义各不相同。 8051 有许多 RTOS 内核,尽管大多数现代 8051 架构部件拥有更好的资源。
      【解决方案4】:

      我认为编写旨在在 QEMU(或虚拟化平台,Xen + MiniOS 是我的最爱之一)等模拟器下运行的“玩具”内核会很有趣。没有(太多)困难,您可以启动并运行基本控制台并开始向其打印内容。它真的很有趣,有教育意义,而且令人满意。

      如果你在 x86 上工作 .. 并且让你的漂亮内核在 QEMU 下工作 .. 很有可能它也可以在真实硬件上工作。你可能会喜欢它。

      无论如何,您的问题的答案是肯定的。如果您碰巧使用的是引导加载程序,它会特别容易......例如,google memtest86 并获取代码。

      【讨论】:

      • 你有这方面的教程链接吗?
      【解决方案5】:

      显然,如果没有某种操作系统或等效操作系统,您将无法执行任意 C 程序。同样,我可以在 Linux 下编写一个不能在 Microsoft Windows 下运行的 C 程序。

      但是,您几乎可以在任何东西上编写 C 程序。这是一种为嵌入式系统编写软件的流行语言,而且它们通常没有操作系统。

      许多嵌入式系统只有一个连接到 ROM 的 CPU,其引脚从芯片出来,直接连接到输入和输出。没有用户 I/O,没有文件系统,没有进程调度,没有你通常想要的操作系统。在这些情况下,C 程序员可能会编写一个烧录到 ROM 中的程序,它会自己处理所有事情。

      (一些嵌入式系统更复杂,可以使用操作系统。Linux 经常使用,因为它可以免费使用,可以做得非常紧凑,并且可以在任何级别进行更改。但并非所有人都这样做。)

      【讨论】:

      • 在我看来,引导加载程序有点不同意你的逻辑?不,您不能链接某些 ELF 并期望它启动,但是您可以制作一些启动并执行原始操作的东西,而不会带来太多麻烦。 IE。 ... memtest :)
      • 取决于程序,以及它是进行系统调用、接收系统调用还是编造它们。
      【解决方案6】:

      您可以在没有操作系统的系统中运行程序......并且该程序本身不必是操作系统。

      想想车内的所有计算机(或处理器,如果您愿意的话):发动机管理、空调、ABS、...、...
      所有这些系统都有一个程序(可能用 C 编写)正在运行。所有处理器都没有操作系统。

      标准明确区分hosted implementationsfreestanding implementations

      5.1.2.1 独立环境 1 在一个独立的环境中(C 程序可能在其中执行) 没有任何操作系统的好处),名称和类型 程序启动时调用的函数是实现定义的。任何图书馆 独立程序可用的设施,除了最小设置 第 4 条要求的,是实现定义的。 2 程序终止在独立环境中的影响是 实现定义。 5.1.2.2 托管环境 1 无需提供托管环境,但应符合 以下规格(如果存在)。 ...

      【讨论】:

        【解决方案7】:

        每个硬件都必须有一个运行它的软件,无论是嵌入式固件(较小且相对固定,如 vxworks)还是可以在其上运行复杂任意代码的操作系统软件(如 windows、 linux 或 mac)。

        把它想象成一个堆栈。在底部,你有硬件。最重要的是,一个可以控制该硬件的软件。最重要的是,你可以拥有各种各样的东西。对于 voip 电话,您将让 vxworks 控制硬件,并在其上处理所有电话应用程序。

        所以回到你的问题,是的,你可以在任何东西上运行任何 c 程序,但这取决于它是什么类型的 c 程序。如果它是一个可以与硬件对话的低级 c 程序,那么除了程序和硬件之外,你不需要任何东西。如果它是更高级别的 c 程序(如聊天程序),那么您的程序和硬件之间需要一大堆东西。

        有意义吗?

        【讨论】:

          【解决方案8】:

          嵌入式系统本身就是合法的操作系统,只是不是通用操作系统。任何用户态程序(即本身不是操作系统的程序)都需要在其上运行操​​作系统。

          【讨论】:

          • 某些通用计算机甚至不是这样。我的旧 TRS-80 有一些程序可以进行自己的显示和磁盘处理,完全绕过 TRS-DOS。键盘和显示器是内存映射的,所以 Z80 处理器可以直接处理。有一条直接通往 1771 (?) 软盘控制器的硬件路由。
          • @David Thornley:再后来,DOS 下的 DesqView 之类的程序。
          【解决方案9】:

          通常,任何 C 程序都会有各种依赖于操作系统的系统调用。例如, printf 进行系统调用以写入屏幕缓冲区。打开文件之类的也是系统调用。

          所以基本上,您可以在处理器上运行刚刚编译并组装成机器代码的 C 代码,但是如果代码进行任何系统调用,它只会在处理器尝试跳转到内存时冻结处理器它认为是操作系统的位置。这当然取决于您是否能够让程序首先运行,如果没有操作系统,这也不容易。

          【讨论】:

          • 为直接在硬件上运行而编写的程序显然不使用系统调用,并且是在运行在通用计算机上的系统上开发的,这些计算机通常模拟真实事物并编译用于实际硬件。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-20
          • 2017-04-17
          • 2010-10-26
          • 2016-02-22
          相关资源
          最近更新 更多