Linux Day3: CPUのモード遷移

f:id:dombri:20191117194128j:plain

こんにちは。

昨日に引き続き「Linuxのしくみ」から第2章を読み進めようと思います。

本日の内容は以下です。

2章「ユーザモードで実現する機能」を読む

f:id:dombri:20191124230301j:plain

システムコール

プロセスが、プロセスの生成やハードウェアの操作などでカーネルの助けが必要になったときに処理を依頼する方法のこと。できることは上のイラストの通り。

CPUのモード遷移

カーネルに処理を依頼するためにシステムコールが発行される。するとCPUでは割り込みが発生する。
→CPUのユーザモードからカーネルモードに遷移し、カーネルの処理が開始する

システムコール処理が終了した段階で、ユーザモードに戻り処理を継続する。


プロセスのシステムコール呼び出し

f:id:dombri:20191124230348j:plain

システムコール発行に関する情報は以下のコマンドで確認できる。

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...

ここまでのまとめ

システムコール、あなたがいないとアセンブリ書く羽目になっていたわ。ありがとう。

本日はここまで。