[kernel]システムコール

カーネルはハードウェアの提供する機能を全て利用できるが、それ以外のプログラムはハードウェアの機能の中で利用できないものがある。非特権モードで動作しているプログラムがカーネルに依頼する方法がシステムコール

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のインストラクションを呼び出す