【发布时间】:2010-12-15 21:55:12
【问题描述】:
我在谷歌上搜索了一下,在某处我读到了....
是的,你可以。这发生在嵌入式系统中
我认为不,这是不可能的。任何平台都必须有操作系统。否则,您的程序本身必须是一个操作系统。 无论是软线还是硬线。如果没有操作系统,您的组件将无法工作。
我是对的还是有人可以解释一下答案吗? (我对嵌入式系统一无所知...)
【问题讨论】:
标签: c operating-system
我在谷歌上搜索了一下,在某处我读到了....
是的,你可以。这发生在嵌入式系统中
我认为不,这是不可能的。任何平台都必须有操作系统。否则,您的程序本身必须是一个操作系统。 无论是软线还是硬线。如果没有操作系统,您的组件将无法工作。
我是对的还是有人可以解释一下答案吗? (我对嵌入式系统一无所知...)
【问题讨论】:
标签: c operating-system
当然可以。 (典型的)CPU 需要的只是电源和对内存的访问,然后它将执行其硬编码的启动序列。
通常这将涉及读取一些预定义的地址,将那里的内容解释为指令,然后开始运行它们。
这些指令当然可以来自 C 程序,尽管在这个级别更常见的是在汇编中编写非常早期的阶段(称为引导)。
这当然并不意味着,如果我从字面上阅读您的问题标题,任何 C 程序 都以这种方式运行。如果程序假设有一个操作系统,但没有,它就不会工作。这应该很明显。
【讨论】:
您绝对不需要操作系统来在任何系统上运行您的 C 代码。您将需要两段初始化代码 - 一段用于初始化所需的硬件(处理器、时钟、内存),另一段用于设置堆栈和 C 运行时(即数据和 BSS 部分的初始化)。当然,这意味着您无法利用操作系统提供的多线程、消息传递和同步服务。我会试着把它分解成几个步骤给你一个想法:
【讨论】:
例如:Building Bare-Metal ARM Systems with GNU
许多嵌入式系统没有足够的资源来运行完整的操作系统,有些可能使用调度程序内核或 RTOS,有些则被编码为“裸机”。复位后进入 main() C 入口点。只需要少量的汇编代码来初始化微处理器,执行 C 代码。通常,所有 C 需要运行的是一个堆栈 - 通常只是将堆栈指针初始化为特定地址的情况。可能还需要对中断/异常向量、系统时钟、内存控制器等进行一些特定于处理器的初始化。
在台式 PC 上,通常您有一个 BIOS 来处理基本硬件初始化,例如 SDRAM 控制器设置和计时,然后从磁盘引导扇区引导,然后引导操作系统。这些代码中的任何一个都可以用 C 编写(其中一些可能是),它可以做除了启动操作系统之外的其他事情——它可以做任何事情——它只是代码。
操作系统对于非专用计算设备很有用,在这些设备中,最终用户可以选择许多程序中的一个来执行,并且可能同时执行多个程序。大多数嵌入式系统只做一件事,软件通常从 ROM 加载或直接从 ROM 执行,并且永远不会更改并无限期执行(通常仅通过掉电停止)。
当然,您仍然可以实现设备驱动程序等,但它们通常是应用程序的一个组成部分,而不是一个单独的实体。即使您确实在嵌入式系统中使用 RTOS,它通常仍然是您的应用程序的组成部分,而不是您可能理解的操作系统。在这些情况下,RTOS 就像任何其他库一样只是一个库,并且通常从 main() 初始化和启动,而不是您可能期望的相反方式。
【讨论】:
我认为编写旨在在 QEMU(或虚拟化平台,Xen + MiniOS 是我的最爱之一)等模拟器下运行的“玩具”内核会很有趣。没有(太多)困难,您可以启动并运行基本控制台并开始向其打印内容。它真的很有趣,有教育意义,而且令人满意。
如果你在 x86 上工作 .. 并且让你的漂亮内核在 QEMU 下工作 .. 很有可能它也可以在真实硬件上工作。你可能会喜欢它。
无论如何,您的问题的答案是肯定的。如果您碰巧使用的是引导加载程序,它会特别容易......例如,google memtest86 并获取代码。
【讨论】:
显然,如果没有某种操作系统或等效操作系统,您将无法执行任意 C 程序。同样,我可以在 Linux 下编写一个不能在 Microsoft Windows 下运行的 C 程序。
但是,您几乎可以在任何东西上编写 C 程序。这是一种为嵌入式系统编写软件的流行语言,而且它们通常没有操作系统。
许多嵌入式系统只有一个连接到 ROM 的 CPU,其引脚从芯片出来,直接连接到输入和输出。没有用户 I/O,没有文件系统,没有进程调度,没有你通常想要的操作系统。在这些情况下,C 程序员可能会编写一个烧录到 ROM 中的程序,它会自己处理所有事情。
(一些嵌入式系统更复杂,可以使用操作系统。Linux 经常使用,因为它可以免费使用,可以做得非常紧凑,并且可以在任何级别进行更改。但并非所有人都这样做。)
【讨论】:
您可以在没有操作系统的系统中运行程序......并且该程序本身不必是操作系统。
想想车内的所有计算机(或处理器,如果您愿意的话):发动机管理、空调、ABS、...、...
所有这些系统都有一个程序(可能用 C 编写)正在运行。所有处理器都没有操作系统。
标准明确区分hosted implementations 和freestanding implementations:
【讨论】:
每个硬件都必须有一个运行它的软件,无论是嵌入式固件(较小且相对固定,如 vxworks)还是可以在其上运行复杂任意代码的操作系统软件(如 windows、 linux 或 mac)。
把它想象成一个堆栈。在底部,你有硬件。最重要的是,一个可以控制该硬件的软件。最重要的是,你可以拥有各种各样的东西。对于 voip 电话,您将让 vxworks 控制硬件,并在其上处理所有电话应用程序。
所以回到你的问题,是的,你可以在任何东西上运行任何 c 程序,但这取决于它是什么类型的 c 程序。如果它是一个可以与硬件对话的低级 c 程序,那么除了程序和硬件之外,你不需要任何东西。如果它是更高级别的 c 程序(如聊天程序),那么您的程序和硬件之间需要一大堆东西。
有意义吗?
【讨论】:
嵌入式系统本身就是合法的操作系统,只是不是通用操作系统。任何用户态程序(即本身不是操作系统的程序)都需要在其上运行操作系统。
【讨论】:
通常,任何 C 程序都会有各种依赖于操作系统的系统调用。例如, printf 进行系统调用以写入屏幕缓冲区。打开文件之类的也是系统调用。
所以基本上,您可以在处理器上运行刚刚编译并组装成机器代码的 C 代码,但是如果代码进行任何系统调用,它只会在处理器尝试跳转到内存时冻结处理器它认为是操作系统的位置。这当然取决于您是否能够让程序首先运行,如果没有操作系统,这也不容易。
【讨论】: