如何以编程方式使操作系统关闭,离开并停止执行任何操作,以便程序可以完全控制PC系统?
我对从MS Windows和Linux环境中执行此操作感兴趣。考虑的任何语言或API。
我希望操作系统停止抢占我的程序,停止其虚拟内存管理,停止其设备驱动程序并中断服务程序的运行,基本上就是消失。然后,当我的程序使用裸机时,我希望操作系统能够在没有重启的情况下再次返回。
这甚至可能吗?
答案 0 :(得分:14)
使用Linux,您可以使用kexec jump将控制权完全转移到另一个内核(即您的程序)。当然,强大的功能带来了巨大的责任 - 完全取决于您服务中断,并避免破坏旧内核的内存。您最终必须编写自己的操作系统内核才能执行此操作。此外,控制转移需要相当长的时间,因为内核必须取消初始化所有硬件,然后在恢复时重新初始化它。由于kexec jump最初是为休眠支持而设计的,因此在原始环境中这不是问题,但根据您正在做的事情,这可能是一个问题。
你可能想考虑在操作系统给你的框架内工作 - 只需为你正在做的任何事情写一个普通的驱动程序。
最后,还有一个选择是使用linux Real-Time patchset。这允许您为所有内容分配静态优先级,甚至是中断处理程序;通过运行优先级高于其他任何进程的进程,您可以暂停/几乎/所有 - 系统仍将为中断服务一个小存根,以及某些无法延迟的中断,如时序中断,但最多部分繁重的工作将被推迟,直到你放弃对CPU的控制。
请注意,RT补丁集不会停止虚拟内存等 - mlockall会阻止有效页面上的页面错误,如果这对您来说足够了。
此外,请记住,无论您做什么,系统BIOS仍然可以导致SMM traps,除非通过主板型号特定的方法,否则无法禁用{{3}}。
答案 1 :(得分:2)
有很多非常丑陋的方法可以做到这一点。您可以通过将一些trampoline代码写入/ dev / kmem来修改正在运行的内核,该代码将控制传递给您的应用程序。但我不建议尝试类似的东西!
基本上,您需要将应用程序作为自己的操作系统。如果要从文件中读取数据,则必须确定数据在磁盘上的位置,并生成自己的SCSI请求以与磁盘驱动器进行通信。您必须实现自己的中断处理程序才能在数据准备就绪时收到通知。同样,你必须处理页面错误,内存分配等。大多数用户认为这不值得努力......
你为什么要这样做?
您的应用程序是否需要执行操作系统不会让它执行的操作?您是否关注操作系统对性能的影响?还有别的吗?
答案 2 :(得分:2)
如果您不介意支付现金,可以使用IntervalZero's RTX为Windows系统执行此操作。这是一个硬实时子系统,它被安装在Windows机器上,作为对HAL的攻击并接管机器,让Windows有剩余的CPU周期。
它有自己的调度程序和设备驱动程序,但如果您以最高RTX优先级运行程序,请不要安装任何RTX设备驱动程序(或在此期间禁用中断),然后 nothing 会打断它。
它还支持与Windows端程序的少量交互。
我们使用它作为获取运行Windows的硬实时盒的好方法。
答案 3 :(得分:2)
coLinux将CoLinuxDriver
加载到NT内核中,或将colinux.ko
加载到Linux内核中。它完全符合您的要求 - 它“取消计划”主机操作系统,并运行自己的代码,具有自己的内存管理,中断等。然后,当它完成后,它“重新安排”主机操作系统,允许它继续它停止了。 coLinux使用它来运行与主机操作系统并行的修改后的Linux内核。
与更常见的虚拟化技术不同,coLinux和裸机硬件之间根本没有障碍。但是,如果coLinux来宾在返回主机操作系统之前没有恢复任何东西,那么硬件和主机操作系统往往会感到困惑。
答案 4 :(得分:1)
不是真的。操作系统是一个基础,您的程序运行在它们之上。当您的应用程序发出请求时,操作系统会处理内存访问,磁盘写入操作,通信等,并要求操作系统移开,这意味着您的程序将不得不执行操作系统的工作。
答案 5 :(得分:0)
不是这样,没有。
你想要的基本上是一个成为操作系统的应用程序;一个严重剥离的Linux内核加上一些高度定制和最小化的工具可能是实现这一目标的方法。
答案 6 :(得分:0)
如果你是狡猾的,并且想要避免很多操作系统管理,你可能会把自己挂进司机程序。大声思考,接近黑客攻击。谷歌如何写根工具包。
答案 7 :(得分:-2)
是的伙计,你可以完全这样做,你也可以写一个程序告诉我的银行给你我所有的钱,并给你一个热的俄罗斯。