2012-08-25 15 views
0

我見過各種RTOS,這種策略是他們在一個或多個CPU上啓動Windows,然後在其餘CPU上運行實時程序。任何想法如何實現?我可以讓計算機從兩個CPU啓動,然後停止對其餘CPU執行嗎?我應該開始看什麼文檔?我對Linux內核有足夠的經驗,可能我可以弄清楚如何在linux下做到這一點,所以如果有什麼能夠很好地映射到linux上,你可以用它來描述它,那太棒了。強制窗口到一個CPU上,然後接管其餘的部分

+0

我會冒險猜測這通常是使用虛擬機管理程序完成的,因此Windows實際上是在輕量級虛擬機中運行的。 –

+0

我不明白爲什麼人們低估了這個問題。這對我來說似乎是合法的。當你投降時請添加評論。 – Kent

回答

1

您可以在很少的CPU上啓動Windows,而不是輕鬆地啓動Windows。運行msconfig.exe,轉到Boot選項卡,單擊Advanced options...按鈕,檢查number of processors框並設置所需的數字(對於Windows 7,Vista和XP的確切位置可能略有不同)。

但這只是解決問題的一小部分。

您需要實現一個特殊的內核模式驅動程序來啓動這些其他CPU(Windows不會讓你從非內核模式代碼執行此類操作)。你將需要爲這些CPU和一堆其他低級別的東西實現一個線程調度器......你可能想要從Windows中竊取一些物理內存(RAM),並實現一個內存管理器,而這兩者可能是一個非常參與的事情。

要閱讀什麼?英特爾/ AMD CPU文檔(特別是APIC部分),英特爾x86多處理器規範,Windows驅動程序,Windows內部書籍,MSDN等書籍。

1

您不能關閉Windows在一個CPU上,並期望運行您的程序像往常一樣,因爲系統調用是由線程發出系統調用發出同一CPU提供服務。系統調用依靠內核模式可訪問的每線程數據來處理系統調用,因此任何線程(用戶模式或內核模式)只能在Windows執行CPU的每個內核初始化時運行。

看起來您可能正在編寫一款真正需要運行的超級超級超級棒應用程序,例如超級快速,而且您希望其他人都能脫離內核,因此,就像,你會是最快的,但是你並不是真正意識到,如果Windows不在你的核心上,那麼你不能在該核心上使用Windows的任何部分。

如果你真的想這樣做,你必須作爲啓動驅動程序運行。啓動驅動程序將能夠保留啓動過程中初始化的內核之一,防止Windows「看到」該內核。然後,您可以手動構建自己的執行線程以在該核心上運行,但是您需要自己處理分頁,內存分配,調度,NUMA,NMI異常,頁面錯誤和ACPI事件。如果沒有bluescreening Windows,您將無法從該內核調用Windows。你會獨自一人。

你可能想要做的就是將線程鎖定到單個處理器(通過SetThreadAffinity),然後將線程的優先級提高到最大值。當你這樣做的時候,Windows仍然在你的內核上運行,以處理頁面錯誤和硬件中斷等問題,但是沒有低優先級的用戶模式線程將在該內核上運行(它們都將移動到其他內核,除非它們也鎖定到了你的內核處理器)。

相關問題