暂时挂起PC操作系统

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

我有兴趣从MS Windows和Linux环境中做这个。 任何语言或API考虑。

我希望操作系统停止抢占我的程序,停止其虚拟内存pipe理,停止设备驱动程序和中断运行的服务例程,基本上就要消失了。 然后,当我的程序与裸机有了邪恶的方式时,我希望操作系统在不重启的情况下再次回来。

这甚至有可能吗?

在Linux下,你可以使用kexec jump将控制权完全转移给另一个内核(即你的程序)。 当然,拥有巨大的权力是很重要的 – 完全取决于你维护中断,避免破坏旧内核的内存。 你最终将不得不编写自己的操作系统内核来做到这一点。 另外,控制的转移需要相当长的一段时间,因为内核必须对所有硬件进行初始化,然后在恢复时重新初始化。 由于kexec jump最初是为了支持休眠而设计的,在原来的环境中这不是问题,但是根据你在做什么,这可能是一个问题。

你可能想考虑在OS给你的框架内工作 – 只要为你正在做的任何事情写一个正常的驱动程序。

最后,还有一个选择是使用linux Real-Time补丁集 。 这使您可以为每个事物分配静态优先级,甚至中断处理程序。 通过运行一个比其他任何更高优先级的进程,你都可以挂起/几乎/所有的东西 – 系统仍然会服务于一个小的中断,以及某些不能延迟的中断,比如定时中断,但是对于最部分的繁重工作将推迟到您放弃对CPU的控制。

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

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

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

基本上,您需要将您的应用程序作为自己的操作系统。 如果要从文件中读取数据,则必须确定数据在磁盘上的位置,并生成自己的SCSI请求以与磁盘驱动器进行通信。 数据准备就绪后,您将必须实现自己的中断处理程序才能收到通知。 同样,你将不得不处理页面错误,内存分配等。大多数用户觉得这是不值得的努力…

你为什么要这样做?

有没有什么你的应用程序需要做的操作系统不会让它这样做? 你关心操作系统对性能的影响吗? 别的东西?

如果您不介意放弃一些现金,则可以使用IntervalZero的RTX为Windows系统执行此操作。 这是一个硬实时子系统,它被安装在一个Windows机器上,作为对HAL的一种攻击,并接管机器,让Windows有剩余的CPU周期。

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

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

我们使用它作为一个很好的方式来获得一个运行Windows的硬实时框。

coLinux将CoLinuxDriver加载到NT内核或colinux.ko到Linux内核中。 它完全符合你所要求的 – 它“调度”主机操作系统,并用自己的内存管理,中断等运行自己的代码。然后,当它完成时,它“重新安排”主机操作系统,允许它从它离开的地方。 coLinux使用它来运行与主机操作系统平行的经过修改的Linux内核。

与更常见的虚拟化技术不同,coLinux和裸机硬件之间没有任何障碍。 但是,如果coLinux guest在返回主机操作系统之前触摸任何东西而不恢复它,则硬件和主机操作系统往往会感到困惑。

不是真的。 操作系统是一个基础,你的程序运行在它们之上。 操作系统处理内存访问,磁盘写入操作,通信等等,当你的应用程序发出请求,并要求操作系统移出的方式意味着你的程序将不得不做的操作系统的工作。

不是这样,不。

你想要的基本上是一个成为操作系统的应用程序; 一个严重剥离的Linux内核加上一些高度定制和最小化的工具可能是这样的方式。

如果你是狡猾的,并且想要避免很多操作系统内务,你可能会把自己陷入一个驱动程序。 大声思考,接近黑客。 谷歌如何编写根套件。

对,你可以完全做到这一点,你也可以写一个程序,告诉我的银行给你我所有的钱,并给你一个热门的俄罗斯。