As rookie

ルーキーインフラエンジニアがインフラのこと以外も結構書いてしまうブログ

『試して理解 Linuxのしくみ』を試してLinuxを理解する(PART.2)

前書き

こんにちは。

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

こちらの本を通して、Linuxを理解していきたいと思っています。
この記事はパート1です。

章ごとに記事を分けて投稿していこうと思っております。

本の内容をそのまま載せるのは良くないと思いますので、この本を読んで試したこと、理解したことのアウトプットが中心になると思います。
「わたしもやってみたい!」と思った人は、早速ポチりましょう。

本編

3章:プロセス管理

仮想記憶がない場合の単純な場合について説明してくれる。
実際の生成、削除のしくみは5章において説明してくれる

2つのプロセス生成がある

  • 同じプログラムの処理を複数のプロセスに分けて処理
    • fork()
  • まったく別のプログラムを生成する
    • exevce()

試す:fork()関数

forkの動き 1. 子プロセス用メモリ領域を作成して、親プロセスのメモリをコピーする 2. 親プロセスと子プロセスは違うコードを実行するように分岐する

子プロセスが自身PIDを出力て終了し、親プロセスが自身のPIDと子プロセスのPIDを出力して終了するプログラムの作成

プログラムを実行すると、fork関数がプロセスのメモリを子プロセスのメモリとしてコピーする。
そして処理を実行する。
例のプログラムでは、fork()関数の復帰時の * 親プロセスには子プロセスのPIDを * 子プロセスには0を 返すというのを利用して、処理を分岐させていた。

読む:execve()関数

全く別のプログラムを生成する場合は、「execve()関数」を発行する。

カーネルがプロセスを実行する流れ

  1. 実行ファイルを読み出し、プロセスのメモリマップに必要な情報を読み出す。
  2. 現在のプロセスのメモリを新しいプロセスのデータで上書きする。
  3. 新しいプロセスの最初の命令から実行開始する。

プロセスが増えるのではなく、プロセスを別のプロセスに置き換える

メモリマップ開始アドレスが必要な理由はCPU上で実行される機械語命令においては特定のメモリアドレスを指定する必要があるから。

ELF

ELF = 実行ファイルに用いいられるフォーマット。

「Executable Linkable Format」(多分本誤字ってる。)

readelf というコマンドでELFフォーマットのファイルの情報を確認する事ができる。

$ readelf -h /bin/sleep
ELF ヘッダ:
  マジック:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
  クラス:                            ELF64
  データ:                            2 の補数、リトルエンディアン
  バージョン:                        1 (current)
  OS/ABI:                            UNIX - System V
  ABI バージョン:                    0
  型:                                EXEC (実行可能ファイル)
  マシン:                            Advanced Micro Devices X86-64
  バージョン:                        0x1
  エントリポイントアドレス:               0x401760
  プログラムの開始ヘッダ:          64 (バイト)
  セクションヘッダ始点:          29552 (バイト)
  フラグ:                            0x0
  このヘッダのサイズ:                64 (バイト)
  プログラムヘッダサイズ:            56 (バイト)
  プログラムヘッダ数:                9
  セクションヘッダ:                  64 (バイト)
  セクションヘッダサイズ:            29
  セクションヘッダ文字列表索引:      28
readelf -S /bin/sleep

で大量の情報が出力される。

セクションヘッダ:
  [番] 名前              タイプ           アドレス          オフセット
       サイズ            EntSize          フラグ Link  情報  整列

「.txt」が、コード領域の情報
「.data」が、データ要域の情報

プログラム実行時に作成されたプロセスのメモリマップは「/proc/pid/mpas」というファイルによって得られる。

fork and exec

  • 親となるプロセスからfork()を発行し
  • 復帰後に子プロセスがexec()を呼ぶ

終了処理

  • exit_groupシステコール(exit関数)でプロセスに割り当てていたメモリを全て回収する。

3章終了。 次回は来週

トップへ
PART.1 PART.2 PART.3