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

时间:2009-11-12 14:46:10

标签: c operating-system

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

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

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

我是对的,还是有人可以解答我的答案? (我对嵌入式系统没有任何想法......)

9 个答案:

答案 0 :(得分:19)

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

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

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

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

答案 1 :(得分:6)

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

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

标准明确区分hosted implementationsfreestanding implementations

    5.1.2.1 Freestanding environment
1   In a freestanding environment (in which C program execution may take place
    without any benefit of an operating system), the name and type of the
    function called at program startup are implementation-defined. Any library
    facilities available to a freestanding program, other than the minimal set
    required by clause 4, are implementation-defined.
2   The effect of program termination in a freestanding environment is
    implementation-defined.

    5.1.2.2 Hosted environment
1   A hosted environment need not be provided, but shall conform to the
    following specifications if present.
    ...

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

例如:Building Bare-Metal ARM Systems with GNU

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

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

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

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

答案 6 :(得分:0)

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

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

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

有意义吗?

答案 7 :(得分:0)

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

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

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

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

答案 8 :(得分:0)

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

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