强制窗口进入一个CPU,然后接管其余的CPU

时间:2012-08-25 21:07:00

标签: windows operating-system kernel

我见过各种具有此策略的RTOS,它们在一个或多个CPU上启动Windows,然后在其余CPU上运行实时程序。知道如何实现这一目标吗?我可以让计算机从两个CPU启动,然后停止在其余CPU上执行吗?我应该开始考虑哪些文档?我有足够的linux内核经验,我可能能够弄清楚如何在linux下做到这一点,所以如果有任何地方很好地映射到linux上你可以用它来描述它,那就太棒了。

3 个答案:

答案 0 :(得分:1)

您可以在比可用的CPU更少的CPU上启动Windows。运行msconfig.exe,转到Boot标签,点击Advanced options...按钮,检查number of processors框并设置所需的号码(这是针对Windows 7的确切位置) Vista和XP可能略有不同)。

但这只是问题的一小部分解决方案。

您需要实现一个特殊的内核模式驱动程序来启动其他CPU(Windows不允许您从非内核模式代码中执行此类操作)。你需要为这些CPU和一堆其他低级别的东西实现一个线程调度程序......你可能也想从Windows中窃取一些物理内存(RAM)并实现一个内存管理器,这两个可能是一个非常复杂的事情。

阅读什么?英特尔/ AMD CPU文档(特别是APIC部分),英特尔的x86多处理器规范,有关Windows驱动程序,Windows Internals书籍,MSDN等的书籍。

答案 1 :(得分:1)

您无法在一个CPU上关闭Windows并希望像往常一样运行您的程序,因为系统调用由发出系统调用的线程所在的同一CPU提供服务。系统调用依赖于内核模式可访问的每线程数据来处理系统调用,因此任何线程(用户模式或内核模式)只能在Windows执行CPU的每个核心初始化时运行。

你似乎有可能正在编写一款真正绝对需要运行的超级超级超级应用程序,比如超快速,你希望其他人都能脱离核心,'那么,就像,你将成为最快的,但你并不真正欣赏如果Windows不在你的核心,那么你就不能使用Windows的任何部分在那个核心上。

如果您确实想要这样做,那么您必须作为启动驱动程序运行。引导驱动程序将能够保留其中一个核心在引导期间初始化,从而阻止Windows查看"那个核心。然后,您可以手动构建自己的执行线程以在该核心上运行,但您需要自己处理分页,内存分配,调度,NUMA,NMI异常,页面错误和ACPI事件。您无法在不对Windows进行蓝屏的情况下从该核心调用Windows。你自己就可以了。

您可能想要做的是将线程锁定到单个处理器(通过SetThreadAffinity),然后将线程的优先级上升到最大值。执行此操作时,Windows仍然在您的核心上运行以处理诸如页面故障和硬件中断之类的操作,但在该核心上不会运行优先级较低的用户模式线程(除非它们也被锁定,否则它们都会移动到其他核心到处理器)。

答案 2 :(得分:0)

我无法正确理解这个问题。但是如果你要求调度进程到核心,那么linux可以使用set affinity完成此任务。请关注此页:

http://www.kernel.org/doc/man-pages/online/pages/man2/sched_setaffinity.2.html