我在谷歌上搜索了一下,我读到了......
是的,你可以。这种情况发生在嵌入式系统
中我想不,这是不可能的。任何平台都必须具有操作系统。否则,您的程序本身必须是一个操作系统。 无论是软线还是硬线。没有操作系统,您的组件将无法工作。
我是对的,还是有人可以解答我的答案? (我对嵌入式系统没有任何想法......)
答案 0 :(得分:19)
当然可以。所有(典型的)CPU需求都是电源和对存储器的访问,然后它将执行其硬编码的启动序列。
通常这将涉及读取一些预定义的地址,将其中的内容解释为指令,并开始运行它们。
这些指令当然可以来自C程序,尽管在这个级别上,在汇编中编写非常早期的阶段(称为bootstrapping)更为常见。
这当然并不意味着,如果我按字面意思阅读你的问题标题,任何C程序都是以这种方式运行的。如果程序假定有操作系统,但没有操作系统,则无法运行。这应该是非常明显的。
答案 1 :(得分:6)
您可以在没有操作系统的系统中运行程序......该程序本身不必是操作系统。
想想汽车里面的所有电脑(或者你喜欢的处理器):发动机管理,空调,ABS,......,...... 所有这些系统都有一个程序(可能用C语言编写)运行。没有一个处理器有操作系统。
标准明确区分hosted implementations
和freestanding 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部分的初始化)。当然,这意味着您无法利用操作系统提供的多线程,消息传递和同步服务。我会试着把它分解成一些步骤来给你一个想法: