使用C语言和图形库编写独立于操作系统的程序

Which C language and Graphic library should be use to write OS independent program?

本文关键字:独立 操作系统 程序 语言 图形库 使用      更新时间:2023-10-16

我正在尝试编写一个程序,我想在启动系统之前运行,就像Windows XP的安装程序一样。问题是我不知道应该使用哪个版本的C/c++编程语言。因为据我所知,C语言有很多版本,它们只适用于DOS、Windows和Linux。或者有没有办法在Visual c++或Turbo C中编写可以在没有任何操作系统的情况下运行的程序?

我的下一个问题是,在C语言中可以使用哪个图形库来创建和显示屏幕上的图像和形状,设置背景颜色等。

我在维基百科上读了一篇关于Windows的文章,我发现它是用c++写的。所以我想我也可以用c++编写类似的程序,而不用切换到汇编语言。

您想编写一个程序,直接运行启动,没有操作系统加载?很抱歉,如果你要问该用哪种语言,那么你面前的学习曲线是如此陡峭,你应该考虑在第一次尝试时大幅降低你的目标。

在过去的糟糕日子里,当空间非常宝贵时,引导加载程序是用原始汇编编写的。今天大多数的功能都是用C(或者c++)编写的,但是在最早期的阶段仍然需要汇编器来接管BIOS,从磁盘加载比BIOS提供的单扇区更多的代码,并将处理器置于保护模式,以便它可以访问超过1mb的RAM。

C和c++之间的选择主要取决于个人喜好。c++倾向于需要更复杂的程序集介绍,以便按照编译后的代码所期望的那样设置其运行时环境。在这两种情况下,您都没有太多可用的标准库。没有malloc/free/new/delete,除非你自己实现它们,例如。

无论使用什么语言,您都需要自定义链接阶段,而不是使用现成的编译器工具链通过一个简单的命令为您所做的。

如果您使用的是x86机器,那么您将不得不学习如何使用默认的VGA缓冲区,或者如果您想要更高分辨率的图形,则可能使用VBE模式缓冲区。其中大部分都必须通过调用BIOS中断或使用专用于控制VGA缓冲区的MMIO端口来设置。在任何一种情况下,这都必须是汇编和C的混合……在这种情况下,你不能真正利用c++的优势,因为你不会使用通常提供支持许多c++特定语言特性(如异常等)的操作系统运行时。如果你想要这些类型的功能,你将不得不自己设置运行时。

这里是一个很好的网站,可以通过x86 MMIO访问VGA寄存器的信息:http://www.osdever.net/FreeVGA/home.htm

C/c++无关紧要,因为每个系统都会将其编译成该机器的正确机器码。我不记得具体的步骤了,但是你肯定要把你的代码复制到引导扇区,等等。

您将不可避免地必须编写一些汇编语言,以便能够编写在操作系统之前启动的东西。首先,您必须编写引导加载程序。

至于图形库,如果你想要图形,你将不得不自己动手,因为大多数库至少使用底层操作系统的一些功能,无论它们是多么跨平台。例如,您会注意到,Windows安装程序在启动到第一次设置的Windows之前都是文本。

正如您自己提到的,您需要编写一个引导加载程序,也就是说,在编译引导加载程序之后,您必须以某种方式安装它(我对这部分不太确定),但这通常涉及将其复制到硬盘的某个位置,由主引导记录引用。

对于图形(或者更好地说是图形卡),以及您希望在启动时与之交互的任何其他设备,您只需要加载它们的驱动程序。因此,原则上,引导加载程序开始运行,将自身的更大一部分加载到内存中,完成后,它开始加载驱动程序并开始工作(类似于操作系统的引导方式,但要简单得多)。驱动程序通常非常有限,但非常通用,您可以自己编写或在互联网上找到。