我见过各种采用这种策略的 RTOS,它们在一个或多个 CPU 上启动 Windows,然后在其余 CPU 上运行实时程序。知道如何实现吗?我可以让计算机启动两个 CPU,然后在其余 CPU 上停止执行吗?我应该开始查看哪些文档?我对 linux 内核有足够的经验,我可能能够弄清楚如何在 linux 下做到这一点,所以如果有任何东西可以很好地映射到 linux 上,你可以用它来描述它,那就太好了。
3 回答
您可以在比可用 CPU 更少的 CPU 上启动 Windows。运行msconfig.exe
,转到Boot
选项卡,单击Advanced options...
按钮,选中该number of processors
框并设置所需的数字(这是针对 Windows 7 的,Vista 和 XP 的确切位置可能略有不同)。
但这只是解决问题的一小部分。
您将需要实现一个特殊的内核模式驱动程序来启动那些其他 CPU(Windows 不会让您从非内核模式代码中执行此类操作)。而且您将需要为这些 CPU 和许多其他低级事物实现线程调度程序......您可能还想从 Windows 窃取一些物理内存 (RAM) 并实现内存管理器,这两个可能是一件很牵涉的事情。
读什么?Intel/AMD CPU 文档(特别是 APIC 部分)、来自 Intel 的 x86 多处理器规范、有关 Windows 驱动程序的书籍、Windows Internals 书籍、MSDN 等。
您不能在一个 CPU 上关闭 Windows 并期望像往常一样运行您的程序,因为系统调用由发出系统调用的线程所在的同一 CPU 提供服务。系统调用依赖于内核模式可访问的每线程数据来处理系统调用,因此任何线程(用户模式或内核模式)只能在 Windows 执行 CPU 的每核初始化时运行。
看起来你正在编写一个超级超级棒的应用程序,它确实需要运行,比如,超级快,你希望其他人都脱离核心,'因为然后,就像,你会完全是最快的,但您并没有真正意识到如果 Windows 不在您的核心上,那么您也不能在该核心上使用 Windows 的任何部分。
如果您确实想这样做,则必须作为引导驱动程序运行。引导驱动程序将能够保留其中一个内核在引导期间不被初始化,从而防止 Windows“看到”该内核。然后,您可以手动构建自己的执行线程以在该内核上运行,但您需要自己处理分页、内存分配、调度、NUMA、NMI 异常、页面错误和 ACPI 事件。如果没有蓝屏 Windows,您将无法从该内核调用 Windows。你会靠自己。
您可能想要做的是将线程锁定到单个处理器(通过 SetThreadAffinity),然后将线程的优先级提高到最大值。当您这样做时,Windows 仍在您的核心上运行以服务诸如页面错误和硬件中断之类的事情,但不会在该核心上运行较低优先级的用户模式线程(它们将全部移动到其他核心,除非它们也被锁定到您的处理器)。
我无法正确理解这个问题。但是,如果您要求将进程调度到内核,那么 linux 可以使用 set affinity 来完成此操作。关注此页面:
http://www.kernel.org/doc/man-pages/online/pages/man2/sched_setaffinity.2.html