私の質問は、カーネル自体がほとんどCで書かれているのに、なぜ最近いくつかのオペレーティングシステムイベント処理がCなどの高レベル言語ではなくアセンブリ言語で書かれているのかということです。
foobar()
、インラインアセンブリを使用して、1つのプラットフォームで別の方法で定義されます。これにより、asmの使用が最小限に抑えられますが、完全に回避することはできません。
私の質問は、カーネル自体がほとんどCで書かれているのに、なぜ最近いくつかのオペレーティングシステムイベント処理がCなどの高レベル言語ではなくアセンブリ言語で書かれているのかということです。
foobar()
、インラインアセンブリを使用して、1つのプラットフォームで別の方法で定義されます。これにより、asmの使用が最小限に抑えられますが、完全に回避することはできません。
回答:
この言語はCPUレジスタへのアクセスを抽象化し、イベントを処理するときのOSはコンテキストを保存する必要があるため、イベントの時点でレジスタにアクセスする必要があり、C仕様に違反します。
Cではこれを行えません:)
lgdt[xxxx]
mov eax, cr0
or al, 0x01
mov cr0, eax
x86保護モードになろうとしています。明らかに、未加工のマシンコードを「送信」することでCでもこれを行うことができますが、正確なオフセットにアクセスする必要がある場合は、依然として不運です。
2番目の例はBootLoaderです。x86システムでは、従来のブートコードの長さは正確に512バイトで、最後の2バイトはそれぞれ0xAAと0x55(または55 AA)である必要があります。Cコンパイラでこのようなことを行うのは悪夢であり、アセンブラは素晴らしい方法で仕事をします。
アセンブリが単に望ましいだけでなく、唯一の手段であるようなケースがさらに多くあります。