Linuxでは、少なくともシステムコールメカニズムは、特定の形式のデータ(通常は何らかのc構造体)をレジスタまたは定義済みメモリアドレスに配置することで、ほとんどのアーキテクチャで機能します。
ただし、問題は実際にCPUにカーネルスペースへの切り替えを強制し、特権カーネルコードを実行して呼び出しを処理できるようにすることです。これは、ある種の障害(0による除算、未定義のオーバーフロー、またはセグメンテーション違反など)を強制することで行われ、これにより、カーネルが強制的に実行を引き継いで障害を処理します。
通常、カーネルは原因となっているプロセスを強制終了するか、ユーザー提供のハンドラーを実行することで障害を処理します。ただし、syscallの場合、代わりに事前定義されたレジスタとメモリの場所をチェックし、syscall要求が含まれている場合は、メモリ内構造体のユーザープロセスによって提供されたデータを使用して実行します。これは通常、特別に手作りされたアセンブリを使用して実行する必要があり、ユーザーのsyscallの使用を容易にするために、システムのCライブラリはそれを関数としてラップする必要があります。下位レベルのインターフェイスについては、syscallの動作方法と、Cラッパーなしでそれを呼び出す方法に関する情報については、http: //man7.org/linux/man-pages/man2/syscall.2.html を参照してください。
これは単純化されすぎており、すべてのアーキテクチャに当てはまるわけではなく(mipsには特別なsyscall命令があります)、必ずしもすべてのOSで同じように動作するわけではありません。それでも、コメントや質問がある場合はお問い合わせください。
修正済み:/ dev /にあるものについてのコメントに関して、これは実際にはカーネルに対するより高いレベルのインターフェースであり、低いインターフェースではありません。これらのデバイスは、実際に(約)4つのシステムコールを下で使用します。それらへの書き込みは、書き込みシステムコール、読み取りシステムコールの読み取り、オープンおよびクローズシステムコールと同等のオープン/クローズ、およびioctlの実行と同じであり、システムの多くのioctlの1つにアクセスするためのインターフェースである特別なioctl syscallを引き起こします呼び出し(特別な、通常は使用量が狭すぎてシステムコール全体を記述できないデバイス固有の呼び出し)。