可引导的跨平台应用程序及使用Delphi或Pascal

6

能否使用Delphi或Pascal创建可引导的应用程序(适用于MBR)?(我知道我们不能使用vcl,RTL和其他依赖于操作系统的东西),但是我可以使用至少Readln和writeln吗。

如果可以!!!那么我们可以在其他操作系统下运行该程序。但我知道PE(Windows)和ELF(Linux)格式不同。但是通过一些小的修改,我能做到。


6
Readln和Writeln也会调用操作系统。但是,引导加载程序不是PE格式,BIOS基本上只是跳转到第一条指令并开始执行。 - Blorgbeard
2
@Blorgbeard,你可以覆盖System.pas单元,并将Readln和Writeln内部OS调用替换为任何你需要的内容。对于引导,完全可以启动一个“基本”操作系统(如DOS或你自己的东西),然后使用一些仿真调用来调用PE可执行文件(这是DWPL在DOS引导后所做的)。 - Arnaud Bouchez
但链接器呢?我认为你无法从Delphi链接器中链接平面非PE“ROM镜像”样式的输出。 - Warren P
@Warren PE 的链接并不(那么)困难。看一下 WDOSX 源代码,你就会知道它是如何工作的。它采用某种仿真技术:将外部调用路由到外部库,从而仿真 Windows API。 - Arnaud Bouchez
3个回答

9
值得一提的是,PE格式与ELF格式相比非常多样化。不仅仅是修改几个字节...整个布局和库访问都是多样化的,绑定也完全不同。
为了在控制台模式下启动Delphi应用程序,您可以放置一个小型DOS系统(例如FreeDOS),然后使用DWPL运行您的Delphi应用程序。 DWPL允许使用WDOSX DOS扩展器作为核心,在Delphi 5-7中运行本机32位受保护模式DOS程序。我曾在一些旧硬件上使用过具有网络适配器的DWPL,它的表现非常出色。如果您对此感兴趣,我可以发布一些DWPL的更新代码。
对于这样的目标,您应该看一下Free Pascal。它天生就可以根据您想要的任何目标进行定制。甚至有使用FPC编写的多样化草稿操作系统。例如,请参见ToroClassiOS-最新版本使用Delphi可执行文件作为源代码。
您可以从这里查看Toro的引导代码,以及使用它创建的“主程序”源代码。
但是对于直接引导应用程序来说,引导并不那么困难。真正的问题在于硬件层面。 BIOS给予它非常有限的访问权限。 仅针对网络层,你需要查看EtherBoot网站等获取一些低级网络访问...但手动重写所有这些驱动程序可能非常耗时!
简而言之:所有这些“纯Pascal”操作系统只是理论上的,运行控制台和一些低性能网络(模拟像NE2000这样的差网络适配器)。所以这些“Pascal”操作系统只是概念证明。离实际解决方案还很远!但是无论如何,都是非常好的技术挑战,非常有启发性。
为什么要重复造轮子?如果您想要一个轻量且快速的系统,请使用自定义Linux内核。
然后使用CrossKylix将您的Delphi应用程序(没有用户界面)编译成Linux,甚至更好的是Free Pascal。

ClassiOS是使用Delphi编译器而非FPC构建的。 - Kenneth Cochran
@codeelegance确实很高,但是它可以使用FPC轻松完成(相同的system.pas单元黑客和PE仿真技巧将适用于FPC)。 - Arnaud Bouchez

3

你并不真正将“应用程序”放在MBR中。

MBR的整个大小为512字节,其中只能使用446字节用于代码。

如果您甚至没有操作系统来委派功能,那么祝您好运在其中创建有用的东西。基本上,在MBR中,您所能做的就是放置启动引导程序的代码。

这里有一个反汇编MBR的页面:

http://www.dewassoc.com/kbase/hard_drives/master_boot_record.htm


我只是说“MBR应用程序”来指出可启动的应用程序,就这样。抱歉造成困惑。 - VibeeshanRC

2
为什么必须编写引导程序?
你可以使用现成的引导程序,如GRUB,并从中链入你的PE可执行文件。
当然,这是非常古老和棘手的事情,但在过去,人们使用此方法处理win PE格式的可执行文件和DOS Extender。
对于更加现代的解决方案,为什么不制作自己的可启动REACTOS光盘,并添加自己用Delphi编写的PE可执行文件来处理“用户shell”呢?
你也可以(但这需要许可证)使用Windows PXE。我认为像BartPE这样的项目可能处于法律灰色地带,或者至少是未经许可的。因此,完全不依赖微软的解决方案(reactos)为完全自包含的展示机提供更好的选择。
你能编写自己的操作系统吗?自己的UI层?自己的视频设备驱动程序?我想不行。所以使用DOS和TurboPascal,或ReactOS和PE win可执行程序。或者你可以使用FreePascal,只需在非常轻量级的便携式Linux内核和根文件系统上构建你的应用程序即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接