(Translated by https://www.hiragana.jp/)
システムコール - Wikipedia

システムコール

OSまたべつ応用おうようプログラムからサービスを要求ようきゅうするために応用おうようプログラムにたいもちいられる機構きこう仕組しくみ。

システムコールえい: system callにち: システム呼出よびだ[1][2][3])とは、オペレーティングシステム (OS)(より明確めいかくえばOSのカーネル)の機能きのうすために使用しようされる機構きこうのこと。実際じっさいプログラミングにおいては、OSの機能きのう関数かんすう (API) しによって実現じつげんされるので、OSのそなえる関数かんすう (API) のことをすこともある。なお、μみゅーITRONではサービスコールばれる。また、OSのことをスーパーバイザともぶため、スーパーバイザコールともいう。

たとえば、C言語げんご使用しようできるfopen()やmalloc()などのライブラリ関数かんすうは、その関数かんすうないにおいてシステムコール(たとえばPOSIX準拠じゅんきょのOSであればopen()やsbrk()など)をす。

背景はいけい

編集へんしゅう

現代げんだいのプロセッサは一般いっぱんにいくつかの特権とっけん状態じょうたい命令めいれい実行じっこうする。2つのレベルをつシステムでは、これを通常つうじょうユーザーモードスーパーバイザーモードぶ。このような特権とっけんレベルがあるのは、セキュリティと安定あんていせいたもつためにオペレーティングシステムがその管理かんり動作どうさするプログラムによる操作そうさ制限せいげんできるようにするためである。そのような制限せいげんける操作そうさとしては、ハードウェア機器ききへのアクセス、/不可ふか変更へんこう、プロセッサの特権とっけん状態じょうたい変更へんこうメモリ管理かんりユニットへのアクセスなどがある。オペレーティングシステムのカーネルはスーパーバイザーモードで動作どうさし、ユーザーアプリケーションはユーザーモードで動作どうさする。

このような複数ふくすう特権とっけんレベルをつシステムを開発かいはつするにあたって、ひく特権とっけんレベルからたか特権とっけんレベルへ制御せいぎょ安全あんぜん転送てんそうする機構きこう必要ひつようとなった。ひく特権とっけんレベルのコードが単純たんじゅんたか特権とっけんレベルに移行いこうしたのではセキュリティと安定あんていせいたもてない。たとえば、ひく特権とっけんレベルのコードがたか特権とっけんレベルのコードに間違まちがった処理しょりをさせたり、不正ふせいコールスタックわたすかもしれない。

システムコールは、おおくの場合ばあい専用せんよう命令めいれい(インテルはPentium II以降いこう, ARMは最初さいしょから)もしくはソフトウェアによって実行じっこうされる。CPU動作どうさモードを遷移せんいさせることによって、通常つうじょうのアプリケーションプログラムからはアクセスできない保護ほごされたメモリ領域りょういきにアクセスすることや、保護ほごされたレジスタ操作そうさすること、また、みずからCPUの動作どうさモードを変更へんこうすることなどが可能かのうになる。

システムコールは特殊とくしゅ命令めいれい使つかうことがおおく、それによってCPUたか特権とっけんレベルのコードに制御せいぎょわたす。具体ぐたいてき方法ほうほうはシステムに依存いぞんするが、例外れいがい発生はっせいさせることでたか特権とっけんレベルに移行いこうしたり、特殊とくしゅ分岐ぶんき命令めいれいたか特権とっけんレベルに移行いこうしたりする。このときにシステムコールの種別しゅべつしめ番号ばんごう引数ひきすうレジスタコールスタック格納かくのうされていて、たか特権とっけんレベルのコード(カーネル)がそれを使用しようして処理しょりおこなう。

システムコールがされたとき、したプログラムは中断ちゅうだんされ、あと処理しょり続行ぞっこうするために必要ひつよう情報じょうほう(コンテキスト)が保存ほぞんされる。そしてプロセッサがたか特権とっけんレベルのコードを実行じっこうし、上述じょうじゅつのシステムコールの番号ばんごう引数ひきすう調しらべ、必要ひつよう処理しょりおこなう。このさいがわのアクセスけんなども考慮こうりょして指定していされたシステムコールを実行じっこうする権利けんりがあるかどうかがチェックされる。完了かんりょうするとがわプログラムに復帰ふっきするため、保存ほぞんされていた状態じょうたい情報じょうほうをリストアし、プログラムの処理しょり続行ぞっこうされる。このとき所定しょていのレジスタ(あるいはスタックの所定しょてい位置いち)にリターン設定せっていされる。

おおくの場合ばあい、プログラムへの復帰ふっき即座そくざおこなわれない可能かのうせいがあることに注意ちゅうい必要ひつようである。システムコールでは時間じかんのかかるI/O処理しょりをすることがあり(たとえばディスクやネットワークへのアクセス)、プログラムは中断ちゅうだんされ(「ブロック」状態じょうたい)、その処理しょり完了かんりょうするまで「実行じっこう可能かのう」キューにかれる。必要ひつよう処理しょり完了かんりょうすると、オペレーティングシステムはそれを実行じっこう候補こうほとしてあつかう。

ちゅうあいだそうとしてのライブラリ

編集へんしゅう

一般いっぱんにオペレーティングシステムはユーザープログラムとオペレーティングシステムの中間ちゅうかん位置いちするライブラリ提供ていきょうしている。標準ひょうじゅんCライブラリ実装じっそうしたもの(あるいは同等どうとう機能きのうをもつもの)がおおい。このライブラリない実際じっさいのシステムコール(カーネルへわた情報じょうほう設定せってい特権とっけんモードへの移行いこう)がおこなわれたり、特権とっけんレベルの処理しょり必要ひつようとしない様々さまざまなデータ処理しょりおこなわれる。これにより、オペレーティングシステムとアプリケーションのつながりがゆるめられ、アプリケーションの移植いしょくせいたかまっているとえる。とくダイナミックリンクライブラリ (.dll) であれば、システムコール処理しょり部分ぶぶん実行じっこうにリンクされるため、アプリケーションの実行じっこうファイルをそのままのオペレーティングシステムじょう実行じっこうできる可能かのうせいたかまる。

Exokernelにもとづいたシステムでは、ライブラリがとく重要じゅうようである。Exokernelは非常ひじょうひくいレベルのカーネルAPIしか提供ていきょうせず、LibOSとばれるライブラリが抽象ちゅうしょうやリソース管理かんり機能きのう提供ていきょうしている。

システムコールのれい

編集へんしゅう

POSIXおよび類似るいじのシステムでの主要しゅようなシステムコールとしては、open、read、write、close、wait、execvefork、kill などがある。ファイルシステム・ネットワーク・メモリ・プロセス・スレッド・セキュリティなどの機能きのう提供ていきょうしている。最近さいきんのオペレーティングシステムはすうひゃくのシステムコールをつ。たとえば、Linuxは317(Linux 2.6.35.4現在げんざい, i386アーキテクチャ[4][5])、FreeBSDやく500[6]である。

出典しゅってん

編集へんしゅう
  1. ^ 2.7.6 演習えんしゅう: ユーザーによって実行じっこうされるプロセスのトレース”. Oracle. 2019ねん8がつ18にち閲覧えつらん
  2. ^ カート オール ちょ野村のむら 純子じゅんこ やく「II, 6 システム呼出よびだし」『例題れいだいまなぶLinuxプログラミング』桑村くわむら じゅん(1はん)、ピアソン・エデュケーション、2001ねん5がつ20日はつか原著げんちょ1999ねん12月3にち)。ISBN 4-89471-2865 
  3. ^ シルバーシャッツ アブラハム、ガルビン ピーター ベール、ガニエ グレッグ「I, 2.3 システム呼出よびだし」『オペレーティングシステムの概念がいねん土居どい 範久のりひさかんやく)・大谷おおや しん加藤かとう 和彦かずひこ光来こうらい 健一けんいち清水しみず 謙多郎けんたろう高田たかだ しんわれ高田たかだ ひろあきら千葉ちば しげる野口のぐち 健一郎けんいちろうわけ)(1はん)、共立きょうりつ出版しゅっぱん、2010ねん11月。ISBN 978-4-320-12253-6 
  4. ^ Linux Systemcall Reference
  5. ^ linux/include/uapi/asm-generic/unistd.h - torvalds/linux - GitHub
  6. ^ FreeBSD syscalls.c, the list of syscall names and IDs”. 2013ねん3がつ24にち閲覧えつらん

関連かんれん項目こうもく

編集へんしゅう