ユーザーがシステムコールを実行すると、割り込みが発生し、実行がカーネルモードに移行した後、システムコールの実行を担当する割り込みハンドラが実行されます。今、私はこの割り込みハンドラ(そして他のすべての割り込みハンドラ)がカーネルの一部だと思います。
しかし、システムコールの実装(ファイルにデータを書き込むコマンドやソケットを開くコマンドなど)はどうですか?これらの命令はカーネルの一部と見なされますか、それともオペレーティングシステムの一部ですが、外部にありますか?コア?
答え1
システムコールを実装する方法はいくつかありますが、「ソフトウェア割り込み」(トラップ)はそのうちの1つであり、まだ使用されていますが、コマンドなどの他の方法もありますsyscall
。ここ詳細は)。
したがって、システムコールはカーネルコードを呼び出す方法です。呼び出されるコードはカーネルの一部でなければなりません。呼び出しコードはユーザー空間にあり(明らかに)、通常はライブラリの一部です(例:)libc
。
「XはYの一部です」という質問は、主にYの定義に依存します。 「カーネル」、「オペレーティングシステム」、および「〜の一部」が何を意味するかを定義した場合(人によって異なる方法で定義)、「システムコールはカーネルまたはオペレーティングシステムの一部です」と言えます。
これについて考えるより良い方法は、システムコールがカーネルコード用のアプリケーションプログラミングインタフェース(API)を定義することです。したがって、カーネル(場合によっては特定のバージョンのカーネル)と緊密に結合されます。
答え2
しかし、システムコール(ファイルにデータを書き込むコマンドやソケットを開くコマンド)の実装はどうですか?これらの命令はカーネルの一部と見なされますか?
それらはカーネルの一部です。
しかし、この主張を裏付けるにはいくつかの参考資料が必要になるかもしれません。
システムコールのソースコードread()
は次のとおりです。linux-5.0/fs/read_write.c:571
明らかに、特定のファイルシステムから読み取られたソースコードを見つけるには、多くの関数呼び出しを追跡する必要があります。 :-).
これらのコードはすべて、カーネルイメージに組み込まれているか、必要に応じてロードされ、実行中のカーネルの一部になるモジュールに組み込まれています。 Linuxはさまざまな種類のファイルシステムをサポートしているため、モジュールとして構築されることがよくあります。
ext4
ファイルシステムを使用している可能性がありますvfat
。を使用してロードされたカーネルモジュールのリストを表示できますlsmod
。
私のFedora 29システムでは、ext4
カーネルイメージの一部ですがvfat
ロード可能なモジュールです。したがってlsmod
、表示されませんext4
。しかし、modprobe --show-depends ext4
「ext4組み込み」と言います。
マニュアルページ: