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


17

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


5
「ほとんどがc」-そして残りは何だと思いますか?;)
goldilocks

@goldilocksは組み立て中です。しかし、なぜ、他の部分はcにあるのでしょうか?
MAKZ

4
私はそれについての専門家ではありませんが、Cで実行できない低レベルのハードウェア関連のものがいくつかあります。これらは通常、アーキテクチャ固有です。「インラインASM」は、その目的のためにCコードでよく使用されるため、たとえばfoobar()、インラインアセンブリを使用して、1つのプラットフォームで別の方法で定義されます。これにより、asmの使用が最小限に抑えられますが、完全に回避することはできません。
goldilocks

Cでグローバル記述子テーブルポインターレジスタをどのように設定しますか?
user253751

回答:


24

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


これが実際の主な理由です。一部の組み込みCコンパイラには、レジスタをアドレス指定できる拡張機能があります(通常、事前に宣言されたグローバル定数/変数を使用)。1つのアーキテクチャのみをターゲットにしているため、彼らはそれを行うことができます。しかし、汎用Cコンパイラは、そのような拡張を合理的にするにはあまりにも多くの異なるアーキテクチャを対象としています。したがって、彼らは通常、asm埋め込みメカニズムを実装するだけでなく(非標準にする)
-slebetman

18

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

これらのことのために、Cで表現できないマシンコードステートメント、およびおそらくCコンパイラアセンブリによって提供されない追加の最適化のために、主にインラインアセンブラーの形式で使用さます。

カーネルソースコードツリーでは、これは下に格納されているarch/<arch>include/asm-<arch>場所<arch>特定のアーキテクチャ名です。実際には、完全なカーネルソースのほんの一部です。


6

Cではこれを行えません:)

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

x86保護モードになろうとしています。明らかに、未加工のマシンコードを「送信」することでCでもこれを行うことができますが、正確なオフセットにアクセスする必要がある場合は、依然として不運です。

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

アセンブリが単に望ましいだけでなく、唯一の手段であるようなケースがさらに多くあります。


-5

asmはより細く、一般にCがライブラリなどに捨てられているよりもはるかに高速であり、OSは常に多くのイベントを処理しています。この機能にはスリムで高速なものが必要です。


2
Cコンパイラテクノロジの最適化はかなり良くなりました。一般に、asmはCよりもはるかに高速であるという神話です。いずれにしても、低レベルのオペレーティングシステム操作でasmが使用される理由はありません。ほとんどの場合、メモリバリアのようにCで表現できない操作に関係し、C以外の呼び出し規約などのダンスを登録します
。– Celada
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.