1 つまたは複数の CPU で Windows を起動し、残りの CPU でリアルタイム プログラムを実行するというこの戦略を持つさまざまな RTOS を見てきました。これをどのように達成できるか考えていますか? コンピュータを 2 つの CPU から起動させ、残りの CPU で実行を停止することはできますか? どのドキュメントを見始める必要がありますか? 私は Linux カーネルで十分な経験を持っているので、Linux でそれを行う方法を理解できるかもしれません。そのため、Linux に適切にマッピングされ、それを説明できるものがあれば、それは素晴らしいことです。
3 に答える
簡単に利用できるよりも少ない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など。
syscall は、syscall を発行するスレッドが発行されたのと同じ CPU によって処理されるため、1 つの CPU で Windows をオフにして、通常どおりプログラムを実行することはできません。syscall は、syscall を処理するためにカーネル モードでアクセス可能なスレッドごとのデータに依存しているため、Windows が CPU のコアごとの初期化を実行した場合にのみ、任意のスレッド (ユーザー モードまたはカーネル モード) を実行できます。
あなたが作成しているアプリは、超高速で実行する必要があり、他のすべての人にコアから降りてもらいたいと考えているようです。完全に最速ですが、Windowsがコアにない場合、そのコアでWindowsのどの部分も使用できないことを本当に感謝していません.
本当にこれを行いたい場合は、ブート ドライバーとして実行する必要があります。ブート ドライバーは、ブート中にコアの 1 つが初期化されないように予約できるため、Windows がそのコアを「認識」できなくなります。その後、そのコアで実行する独自の実行スレッドを手動で構築できますが、ページング、メモリ割り当て、スケジューリング、NUMA、NMI 例外、ページ違反、および ACPI イベントを自分で処理する必要があります。Windows をブルースクリーン処理しないと、そのコアから Windows を呼び出すことはできません。あなたは一人でいるでしょう。
おそらくやりたいことは、(SetThreadAffinity を介して) スレッドを単一のプロセッサにロックしてから、スレッドの優先度を最大値まで上げることです。その場合、Windows はページ フォールトやハードウェア割り込みなどのサービスを提供するために引き続きコアで実行されますが、優先度の低いユーザー モード スレッドはそのコアで実行されません (他のコアにロックされていない限り、それらはすべて他のコアに移動します)。プロセッサ)。
質問を正しく理解できませんでした。ただし、プロセスをコアにスケジュールするように要求する場合、Linux はアフィニティの設定を使用してこれを実現できます。このページに従ってください:
http://www.kernel.org/doc/man-pages/online/pages/man2/sched_setaffinity.2.html