0

Advanced Programming in the UNIX Environment 2nd Edition』の第 01 章第 11 節に、次の文があります。

たとえば、printf 関数は write システム コールを使用して文字列を出力する場合がありますが、strcpy (文字列をコピー) および atoi (ASCII を整数に変換) 関数はカーネルにまったく関与しません。

私が理解していないのは、カーネルがまったく関与していない可能性がある理由です。すべてのルーチンがカーネル サポートを必要とするわけではありませんか?

atoiまた、 CPU 計算のみが必要であることがわかるかもしれません。しかしstrcpy、メモリー操作が必要なのに、カーネルのサポートも必要ないのはなぜですか?

一般的に、関数がカーネルを含まないことをどのように認識できますか?

4

2 に答える 2

5

その文の文脈から、「カーネルを関与させない」ということで、関数がシステムコールにつながらないという意味のようです。

于 2013-10-29T14:52:50.393 に答える
3

私が理解していないのは、カーネルがまったく関与していない可能性がある理由です。すべてのルーチンがカーネル サポートを必要とするわけではありませんか?

最も低いレベルで、そうです。プロセスは、カーネルが起動しなければ存在すらしないためです。両親がいなければあなたは存在しませんが、それは「両親の関与なしに」服を着ることができないという意味ではありません.

単純に引数を逆参照する単純な関数を C で記述した場合、それはルーチンであり、カーネルからのサポートを必要としません。

int func(int* p) { return *p; }

atoiやなどの一部のライブラリ関数はstrcpy、カーネルが提供するサービスを利用するためにシステム コールを呼び出しません。

atoiまた、 CPU 計算のみが必要であることがわかるかもしれません。しかしstrcpy、メモリー操作が必要なのに、カーネルのサポートも必要ないのはなぜですか?

カーネルは、同じアドレス空間内のある場所から別の場所にバイトをコピーするために使用されません。仮想メモリサブシステムは、仮想アドレスを物理アドレスにマップするために非常に低いレベルで関与する可能性がありますが、(レジスタにない場合) の値を読み取ったり設定したりする場合でも、ほとんどすべての操作に当てはまりますint!

とにかく、atoiメモリを読み取らなければならないのに、それも「メモリ操作が必要」と考えないのはなぜですか?

一般的に、関数がカーネルを含まないことをどのように認識できますか?

関数のソースを読まなければ、一般的にはできません。ただし、カーネルによって提供されるハードウェアやサービスと対話することなく (新しいプロセスのフォークや他のプロセスとの通信など)、純粋な C で関数を実装できる場合は、システム コールを使用しない可能性があります。一部のオペレーティング システムでは、プロセスが使用するシステム コールを検出する方法が提供されています。たとえば、straceプロセスがシステム コールを呼び出すたびに通知するユーティリティがあります。介入によってプロセスをトレースしたり、システム コールをインターセプトしたりすることもできますが、これは非常に複雑で、この回答の範囲外です。

于 2013-10-29T15:01:09.973 に答える