教育原則は次のとおりです。愚かな質問のようなものはありません。この背後にある基本的な考え方は、人々は尋ねることによって学ぶということです。私は、「すべてのタスクがすべての命令を実行できた場合に何が起こるかをプログラミングレベルで示して説明できますか?」と尋ねられました。
私はコードを与えました
main(){
_asm_("cli;");
while(1);
}
そしてそれを説明しました(良いために凍結されたシステム-UP)
それから私は尋ねられました:「この割り込みのクリアが行われてもシステムがフリーズしないように例を挙げてもらえますか?」
私は前の例を変更しました:
私はコードを与えました
main(){
_asm_("cli;");
i=i/0;
while(1);
}
と説明しました。
自明: デマンド ページング i=i/0 がある場合、最初にページ フォールト (データ ページが存在しない) が発生し、ディスクの読み取り中に有効な割り込みを実行するように他のタスクをスケジュールでき、後でゼロで除算すると、このタスクが破棄されます。永久に。
しかし、答えはUPに基づいていました。SMPはどうですか?答えが不完全であることを言わなければなりません。構築するのはまだ簡単です:
int i;
main(){
for(i=0;i<100;i++)// Suppose we have less than 100 CPUs
if(fork())
{ sleep(5);//The generating task has (most probable) time to do all forks
_asm_("cli;");
while(1);
}
}
すべての CPU が有毒なタスクを実行するため、すべての CPU の割り込みを無効にします。
これまでのところ、ばかげた質問によって、初心者が学ぶべき多くのことが明らかになりました: 特権命令、ページング、障害処理、DMA 中のスケジューリング、フォーク ..... しかし、最初のプログラムの実行については、ちょっとした疑問が残ります (恥ずべきことです)。 SMP で。
1 つの CPU が恒久的に使用不能になるかどうか。他の CPU は続行し、re_schedule() IPI メッセージを送信できます。その後どうなりますか?割り込みが無効になっているため、フリーズした CPU がウェイクアップしないと簡単に推測できます。しかし、完全に確信するには、もっと知らなければなりません。
私の質問は、プロセッサ間割り込み (IPI) はマスク可能ですか、それともマスク不可能ですか? つまり、最も一般的な「人気のある」実装では?
私のばかげた質問を許してください。答えを見つけるのはそれほど難しいことではありません。私はそれを求めます。私は割り込みピン番号を意味します(マスカブルを伝えます、私は推測します)。
私自身の答え - 正しいですか?他の誰もそれを好まなかったので、私はこの問題を研究し、次の考えに至りました。
重要なリアルタイム アプリケーションでは、長い間ウォッチドッグ タイマーを使用してきました (HW が CPU に割り込み、何らかの方法で「私は生きています」と応答します)。たとえば、メインのコンピューターがダウンした場合にシステムを処理するメインの制御コンピューターとスタンバイのコンピューターがあります。
Linuxはどうですか?どのような番犬を持っていますか? ウォッチドッグの有無にかかわらず、Linux カーネルをコンパイルできます。
Linuxウォッチドッグは何をしますか? 多くの ( ! ) x86/x86-64 タイプのハードウェアには、「ウォッチドッグ NMI 割り込み」を生成できる機能があります。/proc/sys/kernel/nmi_watchdog に「0」を書き込むことで、実行時に NMI ウォッチドッグを無効にすることもできます。システム内のいずれかの CPU が周期ローカル タイマー割り込みを 5 秒以上実行しない場合、APIC はマスク不可能な割り込みによって状況を修正しようとします(CPU はハンドラーを実行し、プロセスを強制終了します)。(SCC Linux は、NMI に関しては別のケースです。)
私の答え (元の質問) は、ウォッチドッグのないシステムに基づいていました! 一般的なレベルで答えて、いくつかの固定システムに基づいて例を挙げるのは問題があります。答えは、CPU、構成、および設定に応じて、正しい場合と正しくない場合があります。
とにかく、NMI について話すのは意味がありましたか? それをやった?