web-dev-qa-db-ja.com

一部のオペレーティングシステムのイベント処理がcではなくasmで記述されているのはなぜですか?

私の質問は、カーネル自体がほとんどCで書かれているのに、最近のオペレーティングシステムイベント処理の一部が、Cなどの高水準言語ではなく、アセンブリ言語でまだ書かれている理由です。

17
MAKZ

この言語は、CPUレジスタへのアクセスを抽象化し、OSはイベントを処理するときにコンテキストを保存する必要があるため、イベントの時点でレジスタにアクセスする必要があるため、C仕様に違反します。

24
WrinkleFree

Cは、マシン上で実行されるマシンコードからの抽象化です(他のほとんどの言語よりもはるかに近いですが)。

Cで表現できないマシンコードステートメントや、Cコンパイラでは提供されない追加の最適化のために、ほとんどの場合 インラインアセンブラ の形式でアセンブリが使用されます。

カーネルソースコードツリーでは、これはArch/<Arch>およびinclude/asm-<Arch> どこ <Arch>は特定のアーキテクチャ名です。実際には、完全なカーネルソースのほんの一部にすぎません。

18
anyone

Cではできません:)

lgdt[xxxx]
mov eax, cr0
or al, 0x01
mov cr0, eax

X86保護モードに入ろうとしています。もちろん、未加工のマシンコードを「発行」することで、Cでこれを行うことができますが、正確なオフセットにアクセスする必要がある場合でも、私はほとんど運がありません。

2番目の例はBootLoaderです。 x86システムでは、従来のブートコードは正確に512バイト長で、最後の2バイトはそれぞれ0xAAと0x55(または55 AA正確)である必要があります... Cコンパイラでそのようなことを保証するのは悪夢であり、アセンブラは素晴らしい方法で仕事。

アセンブリが好まれるだけでなく、それが唯一の手段であるような多くのそのようなケースがあります。