Syscallとは?
CoddyのAssemblyジャーニー「基礎」セクションの一部。レッスン 31/45。
movやleaのようなアセンブリ命令を書きました。これらの命令はCPU上で直接実行されます。しかし、画面への出力、キーボードからの入力、プログラムの終了など、CPU単体ではできない処理を行う必要がある場合はどうすればよいでしょうか?
これらの課題では、オペレーティングシステム(このコースではLinux)が必要です。
システムコールとは何ですか?
syscall(システムコール)は、プログラムからオペレーティングシステムへの要求です。OSに何かをしてもらうための方法です。
システムコールが必要な理由:
| タスク | CPUだけで実行できる? | システムコールが必要? |
|---|---|---|
| 2つの数値を加算する | はい | いいえ |
| レジスタ間でデータを移動する | はい | いいえ |
| 画面にテキストを表示する | いいえ | はい |
| キーボード入力を読み取る | いいえ | はい |
| プログラムを終了する | いいえ | はい |
| ファイルを開く | いいえ | はい |
システムコールの仕組み:
- システムコール番号を
raxに設定します(OSに何をしたいかを伝えます) - 他のレジスタ(
rdi、rsi、rdxなど)に引数を設定します syscall命令を実行します
- CPUがOSカーネルにジャンプする
- OSが要求を実行する
- OSがプログラムに制御を戻す
たとえ:
システムコールは、役所に問い合わせるようなものだと考えてみましょう。
| 手順 | たとえ | アセンブリでは |
|---|---|---|
| 1 | 必要なサービスを決める | システムコール番号を選ぶ(raxに入れる) |
| 2 | 書類に記入する | 引数をレジスタに入れる |
| 3 | 申請を提出する | syscallを実行する |
| 4 | 役所が処理する | OSカーネルが処理を行う |
| 5 | 結果を受け取る | プログラムが続行する |
このコースで学ぶシステムコール:
| システムコール | 番号 | 機能 | 章 |
|---|---|---|---|
exit | 60 | プログラムを終了する | 第4章 |
write | 1 | 画面にテキストを出力する | 第5章 |
現時点で最も重要なシステムコール: exit
exitがなければ、プログラムは永遠に実行され続けるか、クラッシュしてしまいます。作成するすべてのプログラムは、exitシステムコールで終了しなければなりません。
mov rax, 60 ; exit 用のシステムコール番号
mov rdi, 0 ; 終了コード(0 = 成功)
syscall ; OS に終了を要求する自分で試してみよう
このレッスンにはコードチャレンジは含まれていません。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Assemblyプレイグラウンド