コンピューティングでは、 システムコール コンピュータ プログラムが、それが実行されているオペレーティング システムのカーネルにサービスを要求するプログラム的な方法です。システムコールは、プログラムが次のことを行うための手段です。 オペレーティングシステムと対話する 。コンピューター プログラムは、オペレーティング システムのカーネルにリクエストを行うときにシステム コールを実行します。システムコール 提供します アプリケーション プログラム インターフェイス (API) を介して、オペレーティング システムのサービスをユーザー プログラムに提供します。これは、プロセスとオペレーティング システム間のインターフェイスを提供し、ユーザー レベルのプロセスがオペレーティング システムのサービスを要求できるようにします。システムコールは、システムへの唯一のエントリポイントです。 カーネル システム。リソースを必要とするすべてのプログラムはシステム コールを使用する必要があります。
ユーザー プログラムは、システム コールを使用してオペレーティング システムと対話できます。プログラムによって多数のサービスが要求され、OS は要求を満たすために多数のシステム コールを起動して応答します。システム コールは、C や Pascal などの高級言語、またはアセンブリ言語で作成できます。高級言語が使用される場合、オペレーティング システムは、事前定義された関数であるシステム コールを直接呼び出すことがあります。
システムコールは、プログラムがサービスを要求するために使用するメカニズムです。 オペレーティング·システム (OS)。簡単に言うと、ハードウェア リソースへのアクセスや特権操作の実行など、プログラムが基盤となるシステムと対話する方法です。
システム コールは、プログラムが特定の命令を実行することによって開始され、これにより、次への切り替えがトリガーされます。 カーネル モードを使用して、プログラムが OS にサービスを要求できるようにします。その後、OS がリクエストを処理し、必要な操作を実行して、結果をプログラムに返します。
システム コールは、プログラムがシステム リソースにアクセスするための標準化された方法を提供するため、オペレーティング システムが適切に機能するために不可欠です。システム コールがなければ、各プログラムはハードウェアおよびシステム サービスにアクセスするための独自のメソッドを実装する必要があるため、一貫性がなくエラーが発生しやすい動作が発生します。
システムコールによって提供されるサービス
- プロセスの作成と管理
- メインメモリ管理
- ファイル アクセス、ディレクトリ、およびファイル システムの管理
- デバイスハンドリング(I/O)
- 保護
- ネットワーキングなど
- プロセス制御: メモリの終了、中止、作成、終了、割り当て、および解放。
- ファイル管理: ファイルの作成、開く、閉じる、削除、読み取りなど。
- 端末管理
- 情報保守
- コミュニケーション
システムコールの特徴
- インターフェース: システム コールは、ユーザー プログラムとオペレーティング システムの間に明確に定義されたインターフェイスを提供します。プログラムは特定の関数を呼び出してリクエストを行い、オペレーティング システムはリクエストされたサービスを実行して結果を返すことで応答します。
- 保護: システム コールは、通常のユーザー プログラムでは利用できない特権操作にアクセスするために使用されます。オペレーティング システムは、この権限を使用して、悪意のあるアクセスまたは不正なアクセスからシステムを保護します。
- カーネルモード: システムコールが発行されると、プログラムは一時的にユーザーモードからカーネルモードに切り替わります。カーネル モードでは、プログラムはハードウェア、メモリ、その他のプロセスを含むすべてのシステム リソースにアクセスできます。
- コンテキストの切り替え: システム コールにはコンテキスト スイッチが必要です。これには、現在のプロセスの状態を保存し、要求されたサービスを実行するためにカーネル モードに切り替えることが含まれます。これによりオーバーヘッドが発生し、システムのパフォーマンスに影響を与える可能性があります。
- エラー処理: システム コールは、要求されたサービスの問題を示すエラー コードを返すことがあります。プログラムはこれらのエラーをチェックし、適切に処理する必要があります。
- 同期: システム コールを使用すると、ファイルやネットワーク接続などの共有リソースへのアクセスを同期できます。オペレーティング システムは、ロックやセマフォなどの同期メカニズムを提供し、複数のプログラムがこれらのリソースに安全にアクセスできるようにします。
システムコールの利点
- ハードウェア リソースへのアクセス: システム コールを使用すると、プログラムはディスク ドライブ、プリンター、ネットワーク デバイスなどのハードウェア リソースにアクセスできます。
- メモリ管理: システム コールは、プログラムがメモリの割り当てと割り当て解除を行うだけでなく、メモリ マップされたハードウェア デバイスにアクセスするための方法を提供します。
- プロセス管理: システム コールを使用すると、プログラムはプロセスを作成および終了したり、プロセス間通信を管理したりできます。
- 安全: システム コールは、システム設定を変更したり、管理者権限が必要な操作を実行したりする機能など、プログラムが特権リソースにアクセスする方法を提供します。
- 標準化: システム コールは、プログラムがオペレーティング システムと対話するための標準化されたインターフェイスを提供し、さまざまなハードウェア プラットフォームやオペレーティング システムのバージョン間での一貫性と互換性を確保します。
システムコールはどのように機能するのでしょうか?
システムコールがどのように機能するかを段階的に詳しく説明します。
- ユーザーには特別なリソースが必要です: 場合によっては、プログラムは、ファイルからの読み取り、ファイルへの書き込み、ハードウェアからの情報の取得、メモリ内のスペースの要求など、OS の許可がなければ実行できない特別な処理を実行する必要があります。
- プログラムはシステムコール要求を行います。 オペレーティング システムにリクエストを行うための特別な事前定義された命令があります。これらの命令は単なるシステムコールです。プログラムは、必要に応じてコード内でこれらのシステム コールを使用します。
- オペレーティング システムはシステム コールを認識します。 OS がシステムコールを認識すると、現時点ではプログラムが助けを必要としていると認識し、プログラムの実行を一時的に停止し、「カーネル」と呼ばれる自身の特別な部分にすべての制御を渡します。今度は「カーネル」がプログラムの必要性を解決します。
- オペレーティング システムは次の操作を実行します。 ここで、オペレーティング システムはプログラムによって要求された操作を実行します。例: ファイルからのコンテンツの読み取りなど。
- オペレーティング システムが制御をプログラムに戻します。 特別な操作を実行した後、OS はプログラムをさらに実行するために制御をプログラムに戻します。
Windows および Unix でのシステム コールの例
Windows と Unix のシステム コールにはさまざまな形式があります。これらは次の表にリストされています。
プロセス | ウィンドウズ | ユニックス |
---|---|---|
プロセス制御 | CreateProcess() 終了プロセス() WaitForSingleObject() | フォーク() 出口() 待って() |
ファイル操作 | CreateFile() ReadFile() WriteFile() 逆文字列Java | 開ける() 読む() 書く() 近い() |
端末管理 | SetConsoleMode() ReadConsole() WriteConsole() Javaのobj | Ioctl() 読む() 書く() |
情報保守 | GetCurrentProcessID() SetTimer() 寝る() | Getpid() 警報() 寝る() |
コミュニケーション | CreatePipe() CreateFileMapping() MapViewOfFile() | パイプ() シュムゲット() Mmap() |
保護 | SetFileSecurity() InitializeSecurityDescriptor() SetSecurityDescriptorgroup() | Chmod() マスク解除() チョーン() |
開ける(): ファイル システム上のファイルへのアクセスは、open() システム コールを使用して可能です。必要なファイル リソースとプロセスが使用できるハンドルを提供します。ファイルは複数のプロセスで同時に開くことも、1 つのプロセスだけで開くこともできます。すべては構造とファイル システムに基づいています。
読む(): ファイル システム上のファイルからのデータは、それを使用して取得されます。一般に、次の 3 つの引数を受け入れます。
- ファイルの説明。
- 読み取りデータを保存するためのバッファー。
- ファイルから何バイト読み取る必要があるか
読み取る前に、読み取るファイルはファイル記述子によって識別され、open() 関数を使用して開くことができます。
待って(): 一部のシステムでは、プロセスを続行する前に、別のプロセスの実行が終了するまで保留する必要がある場合があります。親プロセスが子プロセスを作成すると、子プロセスが完了するまで親プロセスの実行が停止されます。親プロセスは wait() システムコールを使用して停止されます。子プロセスの実行が終了すると、親プロセスは制御を取り戻します。
書く(): ユーザー バッファからのデータは、それを使用してファイルなどのデバイスに書き込まれます。プログラムはこれを使用して一方向にデータを生成できます。 システムコール 。一般に、次の 3 つの引数があります。
- ファイルの説明。
- データが保存されるバッファへの参照。
- バッファから書き込まれるデータの量 (バイト単位)。
フォーク(): fork() システム コールは、プロセス自体のコピーを作成するためにプロセスによって使用されます。これは、オペレーティング システムでプロセスを作成するために最も頻繁に使用される方法の 1 つです。親プロセスが子プロセスを作成すると、子プロセスが終了するまで親プロセスの実行は一時停止されます。子プロセスの実行が終了すると、親プロセスは制御を取り戻します。
出口(): プログラムを終了するには、exit() と呼ばれるシステムコールが使用されます。複数のスレッドがある環境では、この呼び出しはスレッドの実行が終了したことを示します。 exit() システム関数を使用した後、オペレーティング システムはプロセスによって使用されていたリソースを回復します。
OSにパラメータを渡すメソッド
システムコールが発生した場合、オペレーティングシステムのカーナル部分にパラメータを渡す必要があります。
たとえば、指定されたものを見てください 開ける() システムコール:
C
jsオンロード
//function call example> #include> int> open(> const> char> *pathname,> int> flags, mode_t mode);> |
>
>
ここ パス名 、 フラグ そして モードt はパラメータです。
したがって、次のことに注意してください。
- 通常の関数呼び出しのようにパラメータを直接渡すことはできません。
- カーナル モードでは、関数呼び出しを実行する別の方法があります。
したがって、プロセスがすでに作成した通常のアドレス空間では実行できません。したがって、オペレーティング システムのカーナルが処理に使用できないため、スタックの最上位にパラメータを配置することもできません。そのため、パラメータを OS のカーナルに渡すために他の方法を採用する必要があります。
VBA
私たちはそれをやり遂げることができます、
- パラメータをレジスタに渡す
- ブロックのアドレスはレジスタ内のパラメータとして渡されます。
- パラメータはスタックにプッシュされます。
それぞれの点について詳しく説明します。
1. パラメータをレジスタに渡します。
- 3つの方法の中で最も簡単な方法です
- ここではパラメータをレジスタに直接渡します。
- ただし、パラメータの数がレジスタの数よりも多い場合に制限されます。
- C プログラム コードは次のとおりです。
C
// Passing parameters in registers.> #include> #include> int> main()> {> > const> char> * pathname => 'example.txt'> ;> > int> flags = O_RDONLY;> > mode_t mode = 0644;> > int> fd = open(pathname, flags, mode);> > // in function call open(), we passed the parameters pathanme,flags,mode to the kernal directly> > if> (fd == -1) {> > perror> (> 'Error opening file'> );> > return> 1;> > }> > // File operations here...> > close(fd);> > return> 0;> }> |
>
>
2.ブロックのアドレスをパラメータとして渡す
- パラメータの数がレジスタの数よりも多い場合に適用できます。
- パラメータはブロックまたはテーブルに保存されます。
- ブロックのアドレスはパラメータとしてレジスタに渡されます。
- Linux と Solaris で最も一般的に使用されます。
- C プログラム コードは次のとおりです。
C
//Address of the block is passed as parameters> #include> #include> int> main() {> > const> char> *pathname => 'example.txt'> ;> > int> flags = O_RDONLY;> > mode_t mode = 0644;> > int> params[3];> > // Block of data(parameters) in array> > params[0] = (> int> )pathname;> > params[1] = flags;> > params[2] = mode;> > int> fd = syscall(SYS_open, params);> > // system call> > if> (fd == -1) {> > perror> (> 'Error opening file'> );> > return> 1;> > }> > // File operations here...> > close(fd);> > return> 0;> }> |
>
>
3.パラメータはスタックにプッシュされます
- この方法では、プログラムを使用してパラメータをプッシュインし、オペレーティング システムを使用してポップアウトできます。
- したがって、カーナルはスタックの最上位から情報を取得することでデータに簡単にアクセスできます。
- これがCプログラムのコードです
C
//parameters are pushed into the stack> #include> #include> #include> int> main() {> > const> char> *pathname => 'example.txt'> ;> > int> flags = O_RDONLY;> > mode_t mode = 0644;> > int> fd;> > asm> volatile> (> > 'mov %1, %%rdi
'> > 'mov %2, %%rsi
'> > 'mov %3, %%rdx
'> > 'mov , %%rax
'> > 'syscall'> > :> '=a'> (fd)> > :> 'r'> (pathname),> 'r'> (flags),> 'r'> (mode)> > :> '%rdi'> ,> '%rsi'> ,> '%rdx'> > );> > if> (fd == -1) {> > perror> (> 'Error opening file'> );> > return> 1;> > }> > // File operations here...> > close(fd);> > return> 0;> }> |
>
>
パンダの標準偏差
よくある質問
Q.1: システムコールはどのように機能しますか?
答え:
プログラムがシステム コールを実行すると、ユーザー モードからより高い特権モードであるカーネル モードに移行します。移行は通常、特定の関数を呼び出すか、プログラミング言語またはオペレーティング システムによって提供される命令を中断することによって開始されます。
カーネル モードになると、システム コールはオペレーティング システムによって処理されます。カーネルはプログラムに代わって要求された操作を実行し、結果を返します。その後、制御はユーザーレベルのプログラムに戻り、実行が継続されます。
Q.2: システムコールはなぜ必要ですか?
答え:
システムコールが必要な理由はいくつかあります。
特権操作へのアクセス: ハードウェア デバイスの管理やシステム構成の変更などの多くの操作には、システム コールを通じてのみアクセスできる、より高い特権が必要です。
資源管理: システム コールは、メモリ、ファイル、デバイスなどのシステム リソースの割り当てと管理のための標準化されたインターフェイスを提供し、さまざまなプロセスによる公平で制御されたアクセスを保証します。
抽象化: システム コールはオペレーティング システムの根底にある複雑さを抽象化し、アプリケーション開発者がより高いレベルでプラットフォームに依存しない方法でシステムと対話できるようにします。
セキュリティと保護: システム コールは、アクセス制御とセキュリティ ポリシーを強制し、機密リソースへの不正アクセスを防止し、システムの整合性を保護します。