我可以在没有任何操作系统平台的情况下执

我用谷歌搜索了一下,我读到了……

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

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

我是对的还是任何人都能解释我的答案? (我对嵌入式系统没有任何想法…)

当然可以。 所有(典型的)CPU需求都是电源和对存储器的访问,然后它将执行其硬编码的引导序列。

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

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

这当然不意味着,如果我从字面上读你的问题标题,那么任何C程序都是以这种方式运行的。 如果程序假定有操作系统,但没有操作系统,则无法运行。 这应该是非常明显的。

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

想想汽车里面的所有电脑(或者你喜欢的处理器):发动机管理,空调,ABS,……,……
所有这些系统都有一个程序(可能用C语言编写)运行。 没有处理器具有OS。

该标准明确区分了hosted implementationsfreestanding implementations

     5.1.2.1独立环境
 1在独立环境中(可能在其中执行C程序)
    没有任何操作系统的好处),的名称和类型
    在程序启动时调用的函数是实现定义的。 任何图书馆
    除了最小的设置之外,独立项目可用的设施
    第4条要求的是实现定义的。
 2程序终止在独立环境中的影响是
    实现定义。

     5.1.2.2托管环境
 1无需提供托管环境,但应符合
    以下规格(如果有)。
     ...

我认为你会很乐意编写’玩具’内核,这些内核旨在在QEMU(或虚拟化平台,Xen + MiniOS是我最喜欢的模拟器)之类的模拟器下运行。 如果没有(太多)困难,您可以启动并运行基本控制台并开始向其打印内容。 它非常有趣,有教育意义并且令人满意。

如果你正在使用x86 ..并且让你的spiffy内核在QEMU下运行..那么它很有可能在真正的硬件上工作。 你可能会喜欢它。

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

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

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

嵌入式系统本身就是合法的操作系统,它们不仅仅是通用操作系统 。 任何用户程序(即本身不是操作系统的程序)都需要操作系统才能运行。

例如: 使用GNU构建裸金属ARM系统

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

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

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

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

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

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

所以回到你的问题,是的,你可以运行任何c程序,但它取决于它是什么样的c程序。 如果它是一个可以与硬件通信的低级别c程序,那么除了你的程序和硬件之外你不需要任何其他东西。 如果它是一个更高级别的c程序(如聊天程序),那么你需要在程序和硬件之间添加大量内容。

合理?

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

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

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

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

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

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