2

如何以编程方式使操作系统关闭、离开并停止执行任何操作,以便程序可以完全控制 PC 系统?

我有兴趣在 MS Windows 和 Linux 环境中执行此操作。考虑的任何语言或 API。

我希望操作系统停止抢占我的程序,停止其虚拟内存管理,停止其设备驱动程序并中断服务例程的运行,然后基本上就消失了。然后,当我的程序在裸机上遇到问题时,我希望操作系统在不重新启动的情况下再次返回。

这甚至可能吗?

4

8 回答 8

14

在 Linux 中,您可以使用kexec jump将控制权完全转移到另一个内核(即您的程序)。当然,强大的力量伴随着巨大的责任——服务中断和避免损坏旧内核的内存完全取决于你。您最终将不得不编写自己的操作系统内核来执行此操作。此外,控制转移需要相当长的时间,因为内核必须取消初始化所有硬件,然后在需要恢复时重新初始化它。由于 kexec jump 最初是为支持休眠而设计的,因此在其原始上下文中这不是问题,但取决于您在做什么,这可能是一个问题。

您可能需要考虑改为在操作系统提供给您的框架内工作 - 只需为您正在做的任何事情编写一个普通的驱动程序。

最后,另一种选择是使用 linux Real-Time 补丁集。这使您可以为所有内容分配静态优先级,甚至是中断处理程序;通过运行优先级高于其他任何进程的进程,您可以暂停 / 几乎 / 一切 - 系统仍会为中断服务一个小存根,以及某些无法延迟的中断,如计时中断,但大多数情况下部分繁重的工作将被推迟,直到您放弃对 CPU 的控制。

请注意,RT 补丁集不会停止虚拟内存等 - mlockall将防止有效页面上的页面错误,如果这对您来说已经足够了。

另外,请记住,无论您做什么,系统 BIOS 仍然会导致SMM 陷阱,除非通过特定于主板型号的方法,否则无法禁用该陷阱。

于 2009-07-15T15:57:31.863 回答
2

如果您不介意花一些钱,您可以使用IntervalZero 的 RTX为 Windows 系统执行此操作。这是一个硬实时子系统,它安装在 Windows 机器上,作为对 HAL 的一种入侵并接管机器,让 Windows 拥有剩余的任何 CPU 周期。

它有自己的调度程序和设备驱动程序,但是如果您以最高 RTX 优先级运行程序,请不要安装任何 RTX 设备驱动程序(或在此期间禁用中断),那么什么都不会中断它。

它还支持与 Windows 端程序的少量交互。

我们使用它作为获得运行 Windows 的硬实时框的好方法。

于 2009-07-15T17:03:42.497 回答
2

coLinux加载CoLinuxDriver到 NT 内核或colinux.koLinux 内核中。它完全按照您的要求执行 - 它“取消调度”主机操作系统,并运行自己的代码,具有自己的内存管理、中断等。然后,当它完成后,它“重新调度”主机操作系统,允许它从它停止的地方。coLinux 使用它来运行与主机操作系统并行的修改后的 Linux 内核。

与更常见的虚拟化技术不同,coLinux 和裸机硬件之间完全没有障碍。但是,如果 coLinux 来宾在返回主机操作系统之前没有恢复任何东西,硬件和主机操作系统往往会混淆。

于 2009-07-15T17:53:51.117 回答
2

有很多非常丑陋的方法可以做到这一点。您可以通过将一些蹦床代码写入 /dev/kmem 来修改正在运行的内核,从而将控制权传递给您的应用程序。但我不建议尝试这样的事情!

基本上,您需要让您的应用程序充当它自己的操作系统。如果你想从文件中读取数据,你必须弄清楚数据在磁盘上的位置,并生成你自己的 SCSI 请求来与磁盘驱动器通信。您必须实现自己的中断处理程序才能在数据准备好时收到通知。同样,您将不得不处理页面错误、内存分配等。大多数用户认为这不值得付出努力......

你为什么要这样做?

您的应用程序是否需要做一些操作系统不允许它做的事情?您是否担心操作系统对性能的影响?还有什么?

于 2009-07-15T16:01:47.690 回答
1

并不真地。操作系统是基础,您的程序在它们之上运行。当您的应用程序发出请求时,操作系统会处理内存访问、磁盘写入操作、通信等,而要求操作系统移开将意味着您的程序将不得不代替操作系统完成工作。

于 2009-07-15T15:59:13.517 回答
0

不是这样的,不。

你想要的基本上是一个成为操作系统的应用程序;一个严重精简的 Linux 内核加上一些高度定制和最小化的工具可能是实现这一目标的方法。

于 2009-07-15T15:56:19.980 回答
0

如果你是狡猾的,并且想要避免大量的操作系统内务管理,你可能会将自己挂钩到驱动程序例程中。大声思考,接近黑客攻击。谷歌如何编写 root 工具包。

于 2009-07-15T16:12:27.560 回答
-2

是的,伙计,你完全可以做到这一点,你也可以编写一个程序告诉我的银行把我所有的钱都给你,然后给你发一个热俄罗斯。

于 2009-07-15T16:01:29.517 回答