
私の質問は、最近、いくつかのオペレーティングシステムのイベント処理はまだCのような高度な言語ではなくアセンブリ言語で書かれていますが、カーネル自体はほとんどCで書かれている理由です。
答え1
言語はCPUレジスタへのアクセスを抽象化し、オペレーティングシステムはイベントを処理するときにコンテキストを保存する必要があるため、イベントが発生したときにレジスタにアクセスする必要があるため、C仕様に違反します。
答え2
Cは、マシンで実行されているマシンコードの抽象化です(他のほとんどの言語よりも近いですが)。
C言語で表現できず、Cコンパイラアセンブリによって提供されない追加の最適化を使用できる機械語ステートメントの場合、主に次の形式を使用します。インラインアセンブラ。
カーネルソースツリーは特定のアーキテクチャ名で保存されますarch/<arch>
。実際には、カーネル全体のソースコードのほんの一部です。include/asm-<arch>
<arch>
答え3
Cではこれはできません:)
lgdt[xxxx]
mov eax, cr0
or al, 0x01
mov cr0, eax
x86保護モードに入ろうとしています。明らかに、生のマシンコードを「エクスポート」することでCでこれを行うことができますが、まだ正確なオフセットにアクセスする必要がある場合に備えて、ほとんど運が悪いです。
2番目の例はBootLoaderです。 x86システムでは、既存のブートコードの長さは正確に512バイトでなければならず、最後の2バイトは0xAAと0x55(またはまさに55 AA)です...そして、アセンブラはこれを優れた方法で行う必要があります。
この場合、ほとんどの場合、リギングは最初の選択だけでなく唯一の手段です。
答え4
asm は C ライブラリのようなゴミより一般的に薄く、一般的にはるかに高速で、オペレーティングシステムは常に多くのイベントを処理します。これには薄くて速いものが必要です。