私が理解していないのは、カーネルがまったく関与していない可能性がある理由です。すべてのルーチンがカーネル サポートを必要とするわけではありませんか?
最も低いレベルでは、そうです。プロセスは、カーネルが起動しなければ存在すらしないためです。両親がいなければあなたは存在しませんが、それは「両親の関与なしに」服を着ることができないという意味ではありません.
単純に引数を逆参照する単純な関数を C で記述した場合、それはルーチンであり、カーネルからのサポートを必要としません。
int func(int* p) { return *p; }
atoi
やなどの一部のライブラリ関数はstrcpy
、カーネルが提供するサービスを利用するためにシステム コールを呼び出しません。
atoi
また、 CPU 計算のみが必要であることがわかるかもしれません。しかしstrcpy
、メモリー操作が必要なのに、カーネルのサポートも必要ないのはなぜですか?
カーネルは、同じアドレス空間内のある場所から別の場所にバイトをコピーするために使用されません。仮想メモリサブシステムは、仮想アドレスを物理アドレスにマップするために非常に低いレベルで関与する可能性がありますが、(レジスタにない場合) の値を読み取ったり設定したりする場合でも、ほとんどすべての操作に当てはまりますint
!
とにかく、atoi
メモリを読み取らなければならないのに、それも「メモリ操作が必要」と考えないのはなぜですか?
一般的に、関数がカーネルを含まないことをどのように認識できますか?
関数のソースを読まなければ、一般的にはできません。ただし、カーネルによって提供されるハードウェアやサービスと対話することなく (新しいプロセスのフォークや他のプロセスとの通信など)、純粋な C で関数を実装できる場合は、システム コールを使用しない可能性があります。一部のオペレーティング システムでは、プロセスが使用するシステム コールを検出する方法が提供されています。たとえば、strace
プロセスがシステム コールを呼び出すたびに通知するユーティリティがあります。介入によってプロセスをトレースしたり、システム コールをインターセプトしたりすることもできますが、これは非常に複雑で、この回答の範囲外です。