Linux Day3: CPUのモード遷移

こんにちは。
昨日に引き続き「Linuxのしくみ」から第2章を読み進めようと思います。
本日の内容は以下です。
2章「ユーザモードで実現する機能」を読む

システムコール
プロセスが、プロセスの生成やハードウェアの操作などでカーネルの助けが必要になったときに処理を依頼する方法のこと。できることは上のイラストの通り。
CPUのモード遷移
カーネルに処理を依頼するためにシステムコールが発行される。するとCPUでは割り込みが発生する。
→CPUのユーザモードからカーネルモードに遷移し、カーネルの処理が開始する
システムコール処理が終了した段階で、ユーザモードに戻り処理を継続する。
プロセスのシステムコール呼び出し

システムコール発行に関する情報は以下のコマンドで確認できる。
strace コマンド
# Hello World を出力するC言語のプログラムを作成し、コンパイル、以下を実行。
$ strace -o hello.log ./hello
Hello World!
$ cat hello.log
execve("./hello", ["./hello"], [/* 51 vars */]) = 0
brk(NULL) = 0x55ee70a68000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
:
brk(NULL) = 0x55ee70a68000
brk(0x55ee70a89000) = 0x55ee70a89000
write(1, "Hello World!\n", 13) = 13
exit_group(0) = ?
+++ exited with 0 +++
sarコマンド
各CPUコアがどんな処理を実行しているかがわかる。
# 1秒ごとに処理状態を取得する $ sar -P ALL 1
- 各行1つのCPU
- ユーザモードは%user + %nice の割合
- カーネルモードは%system
ラッパー
lddコマンド
$ ldd /bin/echo
linux-vdso.so.1 (0x00007ffea3960000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fca7587f000)
/lib64/ld-linux-x86-64.so.2 (0x00007fca75e26000)
- プログラムがどのようなライブラリをリンクしているかがわかる
OSが提供するプログラム
- 殆どのプログラムにとって必要なプログラムを提供する
- OSの挙動を変更するためのプログラムを含む
例)
init:システムの初期化
sysctl, nice, sync:OSの挙動を変更する
touch, mkdir:ファイルの操作
etc...
ここまでのまとめ
システムコール、あなたがいないとアセンブリ書く羽目になっていたわ。ありがとう。
本日はここまで。