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...
ここまでのまとめ
システムコール、あなたがいないとアセンブリ書く羽目になっていたわ。ありがとう。
本日はここまで。