Commits

Anonymous committed 179403a

(2+1) まとめ

  • Participants
  • Parent commits aed353c

Comments (0)

Files changed (2)

+=======================================
+ 第(2+1)回 六本木 Linux カーネル読書会
+=======================================
+今回はexecveの中を流れを追ってみる。
+
+Systemtap
+---------
+- `@mmitou <http://twitter.com/mmitou>`_ さんがexecve観察用の `Systemtapスクリプト <https://gist.github.com/3433352>`_ を書いてきてくれた
+- 「SystemTap」とは簡単なスクリプトを書くことで、稼働中のLinuxカーネルに対して実行情報を取得するためのツール。
+
+  - 実行結果: `こちら <https://gist.github.com/3435656>`_
+
+  - 実行方法は `こちら <https://gist.github.com/3507901>`_
+
+- Macの時はDTraceを使うと良い。Windowsはしらん。
+
+execveの流れ
+------------
+- **do_execve(linux-3.4.4/fs/exec.c:1584)**
+
+  - **do_execve_common(/linux-3.4.4/fs/exec.c:1457)**
+
+    - unshare_files(linux-3.4.4/kernel/fork.c:1829)
+
+    - prepare_bprm_creds(linux-3.4.4/fs/exec.c:1188)
+
+      - prepare_exec_creds(linux-3.4.4/kernel/cred.c:332)
+
+        - prepare_creds(linux-3.4.4/kernel/cred.c:285)
+
+    - open_exec(linux-3.4.4/fs/exec.c:765)
+
+    - **search_binary_handler(linux-3.4.4/fs/exec.c:1369)**
+
+      - **load_elf_binary(linux-3.4.4/fs/binfmt_elf.c:556)**
+
+        - start_thread(linux-3.4.4/arch/x86/kernel/process_32.c:192)
+
+do_execve
+---------
+- システムコールからハンドリングした先として呼ばれる関数
+
+- 中はdo_execve_commonを呼んでるだけ
+
+do_execve_common(linux-3.4.4/fs/exec.c:1475)
+--------------------------------------------
+- プロセス実行の一連の処理を行なう関数
+
+- linux_binprmはユーザー空間にある引数をカーネル側で保持・加工する為に使う構造体
+
+linux_binprm(linux-3.4.4/include/linux/binfmts.h:28)
+- `linux_binprm/linux2.6 <http://hira-consulting.com/wiki/index.php?linux_binprm%2Flinux2.6>`_
+
+- `linuxの話 (ELF ローダ) <http://dev.ariel-networks.com/Members/ohyama/linux306e8a71-elf-30ed30fc/>`_
+
+unshare_files
+-------------
+- ファイルディスクリプタを管理している構造体を複製して、unshare(非共有状態)にする
+
+prepare_creds
+-------------
+- プログラムを実行する前のセキュリティチェック?
+
+  - linux-3.4.4/Documentation/security/credentials.txt
+
+open_exec
+---------
+- リーディング前はプロセスの実行をここでやっているのかと思っていたが、ただファイルを開いてるだけだった
+
+search_binary_handler
+---------------------
+- 実行バイナリをロードするためのハンドラを探しだしそれを実行する関数
+
+- linux_binfmtはbinaryloadやcoredumpのハンドラの情報を持った構造体。
+
+  - linux-3.4.4/include/linux/binfmts.h:86
+
+  - 実行バイナリフォーマット(ELF等)毎にlinux_binfmtのインスタンスが定義される
+
+    - 例えばELFの場合は linux-3.4.4/fs/binfmt_elf.c:69
+
+- linux_binfmtを取得できたら、その後list_for_each_entry内でハンドラを取得してfn変数に代入。
+
+  - (linux-3.4.4/fs/exec.c:1400)で実行バイナリをロードをしている
+
+start_thread
+------------
+- コンテキストスイッチをした時にどこから始まるかという情報を持たせている関数
+
+  - 呼び出し引数
+
+    - struct pt_regs * regs: レジスタの情報
+
+    - unsigned long pc: エントリポイントのアドレス
+
+    - unsigned long sp: ランダマイズされたスタックポインタのアドレス
+
+その他
+------
+- `togetter <http://togetter.com/li/361350>`_
+
+- 次回はプロセスのライフルサイクルの最後exit。担当は `@r_takaishi <http://twitter.com/r_takaishi>`_
 
    01
    02
+   03
    files