![カーネルからの結果がどのプロセスに返されましたか?](https://rvso.com/image/52097/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%8B%E3%82%89%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%8C%E3%81%A9%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AB%E8%BF%94%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%81%8B%3F.png)
プロセスがカーネル モードを必要とするアクションを必要とする場合、システム コールが使用されます。では、結果はどのようにプロセスに返されるのでしょうか。
答え1
注記:以下の情報はすべて参照サイトからのものです
からこれリンクから、以下の情報が見つかりました。
あシステムコールは、ユーザー空間アプリケーションとカーネルが提供するサービスとの間のインターフェースです。サービスはカーネル内で提供されるため、直接呼び出すことはできません。代わりに、ユーザー空間/カーネル境界を越えるプロセスを使用する必要があります。
システムコールの使用
ユーザー空間アプリケーションからこれらを使用するために必要なものを見てみましょう。新しいカーネル システム コールを使用する方法は 2 つあります。1 つ目は便利な方法 (製品コードではおそらく実行したくない方法) で、2 つ目は少し手間がかかる従来の方法です。最初の方法では、syscall 関数を通じてインデックスで識別される新しい関数を呼び出します。syscall 関数を使用すると、呼び出しインデックスと一連の引数を指定してシステム コールを呼び出すことができます。たとえば、以下に示す短いアプリケーションは、sys_getjiffies
インデックスを使用して呼び出します。
#include <linux/unistd.h>
#include <sys/syscall.h>
#define __NR_getjiffies 320
int main()
{
long jiffies;
jiffies = syscall( __NR_getjiffies );
printf( "Current jiffies is %lx\n", jiffies );
return 0;
}
ご覧のとおり、syscall 関数には、使用するシステム コール テーブルのインデックスが最初の引数として含まれています。渡す引数がある場合は、呼び出しインデックスの後に渡されます。ほとんどのシステム コールには、_ へのマッピングを指定するための SYS_ シンボリック定数が含まれています。NRインデックス。たとえば、次のように syscall を使用してインデックス __NR_getpid を呼び出します。
syscall( SYS_getpid )
syscall関数はアーキテクチャ固有ですが、カーネルに制御を移すメカニズムを使用します。引数は_のマッピングに基づいています。NRはSYSにインデックスを付けるによって提供されるシンボル/usr/include/bits/syscall.h
(libc のビルド時に定義されます)。このファイルを直接参照しないでください。代わりに を使用してください/usr/include/sys/syscall.h
。