c – 如何创建可在特定处理器体系结构(而不​​是某些操作系统)上运行的可执行文件?

所以我在Visual Studio中使用我的C程序,编译,它会吐出一个漂亮的小EXE文件.但是EXE只能在 windows上运行,我听到很多关于C/C++如何编译成汇编语言的东西,它直接在处理器上运行. EXE在 Windows的帮助下运行,或者我可以有一个程序来生成在mac上运行的可执行文件.但是,我不是将C代码编译成汇编语言,这是处理器特定的吗?

我的见解:

>我猜我可能不是.我知道有一个英特尔C编译器,所以它会制作特定于处理器的汇编代码吗? EXE在Windows上运行,因此它们已经建立了很多东西,从图形包到大规模的.NET框架.特定于处理器的可执行文件将从头开始,仅使用处理器的指令集.
>这个可执行文件是文件类型吗?我们可以运行Windows并打开它,但之后只能控制切换到处理器?我假设这个可执行文件类似于操作系统,因为它必须在启动任何其他操作之前运行,并且只有处理器指令设置为“use”.

解决方法

让我们来看看“跑”是什么意思……

有些东西必须将二进制代码加载到内存中.这是一个操作系统功能. .EXE或二进制可执行文件或包或其他任何内容都以特定于操作系统的方式格式化,以便操作系统可以将其加载到内存中.

必须将控制权交给那些二进制代码.还有操作系统.

I / O例程(在C中,但在大多数地方都是如此)只是一个封装OS API的库. Drat那OS,它无处不在.

回忆.

在过去(是的,我已经老了)我在没有操作系统的机器上工作.我们也没有C.

我们使用“汇编程序”和“链接器”等工具编写机器代码,以创建可以加载到机器中的大型二进制映像.我们不得不通过痛苦的引导过程加载这些二进制图像.

我们使用前面板键将足够的代码加载到内存中,以读取像打孔纸带读取器这样的便携式设备.这将加载一小块相当标准的引导链接加载器软件. (我们使用聚酯薄膜胶带,因此不会磨损.)

然后,当我们在内存中有这个链接加载器时,我们可以用汇编程序提供我们之前准备的磁带.

我们编写了自己的设备驱动程序或者我们使用源代码形式的库例程,在纸带上打孔.

一个“补丁”实际上修补了纸带.此外,由于还存在很少的错误,我们必须根据手写指令调整内存映像 – 未放入磁带的补丁.

后来,我们有简单的操作系统,它有简单的API,简单的设备驱动程序,以及一些实用程序,如“文件系统”,“编辑器”和“编译器”.这是一种叫做Jovial的语言,但我们有时也使用过Fortran.

我们必须焊接串行接口板,以便我们可以插入设备.我们不得不编写设备驱动程序.

底线.

您可以轻松编写不需要操作系统的C程序.

>了解处理器芯片组中的硬件BIOS(或类似BIOS)设施.大多数现代硬件都有一个连接到ROM的简单操作系统,可以进行开机自检(POST),加载一些简单的驱动程序,并找到启动块.
>了解如何编写自己的引导块.这是在POST之后加载的第一个正确的“软件”事物.这并不是那么难.您可以使用各种分区工具将引导块程序强制到磁盘上,并且您可以完全控制硬件.没有OS.
>了解GRUB,LILO或BootCamp如何启动操作系统.这并不复杂.一旦它们被启动,它们就可以加载你的程序,然后你就可以运行了.这稍微简单一些,因为您创建了引导加载程序要加载的分区类型.以Linux为核心,你会更开心.不要试图弄清楚Windows的启动方式 – 它太复杂了.
>阅读ELF. http://en.wikipedia.org/wiki/Executable_and_Linkable_Format>了解如何编写设备驱动程序.如果您不使用操作系统,则需要编写设备驱动程序.

相关文章

一.C语言中的static关键字 在C语言中,static可以用来修饰局...
浅谈C/C++中的指针和数组(二) 前面已经讨论了指针...
浅谈C/C++中的指针和数组(一)指针是C/C++...
从两个例子分析C语言的声明 在读《C专家编程》一书的第三章时...
C语言文件操作解析(一)在讨论C语言文件操作之前,先了解一下...
C语言文件操作解析(三) 在前面已经讨论了文件打开操作,下面...