私はシステムコールがどのように機能するのか、システムコールの一般的な要件をよく理解しています。しかし、なぜcreate()ファイル、read()ファイル、close()などの特定のシステムコールがカーネルモードでのみ実行できるのかわかりません。
たとえば、create() および read() ファイルのユーザー空間またはユーザーモードでは、なぜこれが発生しないのですか?ユーザーがファイルを作成して読み取ってシステムを破損する方法は何ですか? close() システムコールについても同じ質問があります。
答え1
create() ファイル、read() ファイル、close() などのシステムコールがカーネルモードでしか実行できない理由はわかりません。
定義によると、システムコールはカーネルモードで実行されます。ユーザースペースでは、通常、同じ名前のライブラリラッパー関数を介して使用できます。からman 2 intro
:
システムコールはLinuxカーネルのエントリポイントです。通常、システムコールは直接呼び出されません。代わりに、ほとんどのシステムコールには、システムコールを呼び出すために必要なステップ(カーネルモードでトラップなど)を実行する対応するCライブラリラッパー関数があります。したがって、システムコールを実行することは、通常のライブラリ関数を呼び出すのと同じように見えます。
(あなたも確認できますman 2 syscall
)
@dirktと@StephenKittがコメントで述べたように、言及したシステムコールはファイル記述子テーブルに書き込み、ファイルI / Oドライバにアクセスし、アクセスを確認する必要があるため、カーネルスペースで実行する必要があります。
答え2
たとえば、ファイル内では
create()
なぜread()
ユーザースペースでこれが起こり得ないのですか?
Linuxベースのプラットフォームを含む一部のプラットフォームでは、ユーザー空間でファイルシステムIOを実行できます。 FUSEと呼ばれ、読むことができます。ユーザー空間のファイルシステムテーマの紹介です。
以下を含むさまざまなFUSEベースのファイルシステムを使用できます。SSHFS(ファイルシステムssh
)とS3QL(クラウドストレージのファイルシステム)。
カーネルはユーザー空間クライアント (アプリケーション) と FUSE 実装の間の階層を仲介し、ファイルシステムの意味が検証され一貫していますが、、、などの実際のcreat()
IO コードはすべてユーザー空間サービスによって実行されます。open()
read()
write()
fcntl()
close()