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