カーネルはハードウェアの提供する機能を全て利用できるが、それ以外のプログラムはハードウェアの機能の中で利用できないものがある。非特権モードで動作しているプログラムがカーネルに依頼する方法がシステムコール
e.g.
ネットワークを利用した通信、ファイル入出力、新しいプロセス生成、プロセス間通信、コンテナの生成など
fopen(), fclose(), fread(), fwrite()
システムコールの目的
– ハードウェアを操作するシンプルなインターフェイスの提供
– アプリケーションが安全かつセキュアにOSのリソースを利用できる
### アプリケーションがシステムコールを呼び出す仕組み
– 実行するシステムコールを指定する番号をレジスタにセット
– システムコールに引き渡す引数をレジスタにセット
– システムコールを発動するインストラクションを実行
.intel_syntax noprefix .global main main: push rbp mov rbp, rsp push 0xA216948 // hi mov rax, 1 mov rdi, 1 mov rsi, rsp mov rdx, 4 syscall mov rsp, rbp pop rbp ret
$ gcc -o hi hi.s
$ ./hi
Hi!
x86-64
1. raxにsystem call numberをセット
-> 0 read, 1 write, 2 open, 57 fork
2. システムコールに渡したい引数をレジスタにセット
-> rdi, rsi, rdx, r10, r9, r8に引数を格納していく
3. syscallのインストラクションを呼び出す