「システムコール」という用語を理解したいと思います。私は、ユーザー空間アプリケーションからカーネルサービスを取得するために使用されるシステムコールに精通しています。
明確にする必要があるのは、「システムコール」と「システムコールのC実装」の違いです。
私を混乱させる文章があります。
Unixファミリーシステムでは、このAPIは通常、呼び出すシステムコールと同じ名前で命名されるシステムコールのラッパー関数を提供するglibcなどのCライブラリ(libc)実装の一部です。
「彼らが呼び出すシステムコール」とは何ですか?彼らはどこから来たの?私のコードに直接含めることはできますか?
一般的な意味では、「システムコール」は単なるPOSIX定義のインタフェースではありませんが、実際に実装を見るにはCソースコードをチェックし、実際のユーザー空間でカーネル通信がどのように機能するかを確認できますか?
背景注意:私はすべてのc関数が最終的に/dev
。
答え1
システムコールそれ自体コンセプトです。これは、プロセスがカーネルに実行を要求できることを示します。
これらのシステムコールは、UNIXシリーズシステムのカーネルで実装されています。この実装(Cで書かれており、その程度はasmで書かれています)は、実際にシステムで作業を行います。
その後、プロセスは、インターフェイスを使用してシステムコールを実行するようにシステムに要求します。このインタフェースは POSIX によって指定されます。これはC標準ライブラリの関数セットです。実際には、いくつかのチェックを実行し、カーネルでシステム固有の機能を呼び出して、システムコールを実行するために何をすべきかを知らせるラッパーです。秘密は、インターフェースである関数がシステム呼び出し自体と同じ名前を持ち、しばしば「システム呼び出し」と呼ばれることです。
システム固有のメカニズムにより、システムコールを実行するカーネルの関数を直接呼び出すことができます。問題は、コードを完全に移植できないようにすることです。
したがって、システムコールは次のようになります。
- ユーザープロセスにサービスを提供するためにカーネルが実行する一連のタスクである概念
- カーネルからこのサービスを取得するには、コードでC標準ライブラリ関数を使用する必要があります。
答え2
ㅏシステムコールプログラム自体ができない(または以下の不便な)作業をプログラムの代わりにオペレーティングシステム(カーネル)に要求する方法です。特定のタスクを実行できない理由は、通常、任意のプログラムがそのタスクを実行できるようにすると、I / Oの実行(RAMに直接、上書きする)などのシステムの整合性が損なわれる可能性があるためです。
POSIXは、プログラムへのインタフェース、つまりプログラムが呼び出すことができる特定の機能を定義します。これらのいくつかはシステムコールに直接変換され、一部はより洗練されている必要があります。 POSIXインタフェースを提供し、パラメータを圧縮し、呼び出し元に結果を返すことは、言語(Cライブラリなど)のランタイムです。
Unixy システムは、システムコールの形式で POSIX インタフェースを多少直接的に提供します。通常、システムコールを直接呼び出す方法があります。syscall(2)
Linuxでこの機能を使用する方法の詳細については、こちらをご覧ください。
答え3
もちろん、「この象をどのように多くの方向で見ることができますか?」を見てみましょう。
ビルドしたプログラムでは、実際のシステムコールはカーネルモードへの特権の昇格をトリガするマシン命令ですが、カーネル自体では命令が呼び出すコードです。 libcコード(およびすべての言語ランタイム)は、カーネルコードが見つかると予想される場所(機械命令の制限のために奇妙な場所になる可能性があります)にマシンレジスタと保存パラメータを設定します。
オペレーティングシステムコード自体に入ると、ユーザースペースランタイムが実行する特定のマシン関連の操作の一部をミラーリングしてから、完全に一般的なサブルーチン呼び出しを実行します。
オペレーティングシステム全体でどのように機能するかを正確に確認するには、カーネルソースコード(git clone https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/
)を抽出して実行しますgit grep -i system\ call
。 glibcソースを取得して同じことを行います。
答え4
すべてのシステムコールには関連する整数があります。この整数は、システムコールの戻り値、システムコールの引数数、引数型の関数です。このシステムコール番号は、特権モードでのみアクセスでき、適切なハンドラへのポインタを含むグローバルシステムコールベクトルへのオフセットにすぎません。システムコールの呼び出し中にソフトウェア割り込み(トラップ割り込み)が発生するため、どのシステムコールを呼び出す必要があるかを判断するためにトラップハンドラが実行されます。その後、カーネルはユーザーが渡したシステムコールパラメータをプロセッサレジスタにコピーし、要求されたサービスを完了した後にプロセッサレジスタのデータをスタックにコピーします。これがシステムコール引数が制限される理由の1つです。これは、引数が制限されたレジスタを持つプロセッサレジスタにコピーされるためです。