「open」、「read」、「write」などの関数を呼び出すために、オペレーティングシステムがユーザースペースからカーネルに移行するために使用するシステムコールメカニズムの優れた入門書または技術的な説明を探しています。
ウィキペディアのエントリ以外に何かありますか?ウェブサイト、PDF、本、ソースコード、すべて大歓迎です:)
「open」、「read」、「write」などの関数を呼び出すために、オペレーティングシステムがユーザースペースからカーネルに移行するために使用するシステムコールメカニズムの優れた入門書または技術的な説明を探しています。
ウィキペディアのエントリ以外に何かありますか?ウェブサイト、PDF、本、ソースコード、すべて大歓迎です:)
正確な方法は、プロセッサ アーキテクチャと、カーネル モードに移行するために定義されている操作によって異なります。1 つのアプローチ (x86 での従来のアプローチ) は、ソフトウェア割り込みを使用することでした。これは一般的なケースではあまり高速ではないことが判明したため、後で Intel が追加SYSCALL
し、AMD が追加しましSYSENTER
た。Windows XP 以降では、起動時にプラットフォームに適したシステム コール手法を選択します。
特定の機能に対して特定のソフトウェア割り込み番号を使用することを選択できますが、通常、プロセッサにはすべてのシステム機能をカバーするのに十分な割り込みがないため、レジスタの 1 つに必要な機能番号を含める必要があります。どうせやるなら、システムコール関数を1つだけ使うのはたいした苦労ではありません。
バージョン 6.0 より前の Windows CE では、プロセスが相互に直接呼び出すことを実際に許可するサイド バイ サイド プロセス仮想アドレス モデルを使用します。これが行われると、アクセス違反フォルトが発生するようにページ保護が設定されます。カーネルが制御を取得し、プロセスのアドレス空間を修正し (呼び出されたプロセスをスロット 0 に移動します)、スロット 0 ベースの引数をポイントするように修正します。呼び出しプロセスに戻り、ユーザー モードに戻ります。戻りアドレスは別のプロセスにあるため、関数呼び出しが戻ると、逆のプロセスが発生します。残念ながら、このモデルでは、各プロセス (32MB) と少数のプロセス (32) に対して非常に小さな仮想アドレス空間しか許可されないため、Windows CE 6.0 は従来のシステム コール モデルに戻ります。
ソースコードについては、掘り下げるオープンソースカーネルがたくさんあります。
本に関しては、Linuxカーネルに関するRobertLoveの本は非常に有益です。
minix カーネルを見てみたいと思うかもしれません。これはオープン ソースであり、シンプルになるように設計されており、多くのユニレベル OS コースで使用されています。/usr/src/kernel/proc.c、特にsys_call関数とその周辺機能を掘り下げてください。minix はマイクロカーネルであるため、慣れ親しんでいるものとは微妙に異なる場合があることに注意してください。
*nix プログラミングに非常に役立つ本を購入したい場合。Stevens と Rago による「UNIX 環境での高度なプログラミング」をお勧めします。詳細な説明とコード例があります。
Linuxでのシステムコールの適切な説明については、Linuxデバイスドライバーのサンプルデバイスドライバーを参照してください。
これはアーキテクチャに依存しており、コンピュータ アーキテクチャの理解が必要です。Tanenbaum の「Structured Computer Organisation」には、システム コールの基本がよくまとめられています。詳細については、オペレーティング システムの設計に関する教科書を読んでください。