六本木 Linux カーネル読書会 0.1.0 documentation

第(1+1)回 六本木 Linux カーネル読書会 〜 プロセス管理 ロード第一章 〜

«  Linux システムコール読書会 第一回 プロセス管理編1 〜 getpid 〜   ::   Contents   ::   第(2+1)回 六本木 Linux カーネル読書会  »

第(1+1)回 六本木 Linux カーネル読書会 〜 プロセス管理 ロード第一章 〜

clone/fork とか読みます。

connpass

vfork の man

togetter

@draftcode 氏による まとめ

やったこと

ご挨拶

  • 開催目的 開催者が勉強するため
  • 参加者と主催者ではなくてみんなで読みましょう

前回のおさらい

前回はモヒモヒ システムコール読書会がとっかかりとして微妙だったので rename して再出発

概要

  • fork, vfork, clone で生成
  • execve で新しいプロセスとして実行
  • exit で終了

clone

  • do_fork が本体
  • 親の子プロセスとして生成

execve

  • 実行ファイルのバイナリをロードする
  • do_execve が本体

exit

  • exit/exit_group 実行を終了する

コードを読む

clone 関数

arch/ia64/kernel/entry.S

アセンブラの命令群

do_fork 関数

kernel/fork.c:1544

process.c から呼ばれているらしい

int __user *parent_tidptr, int __user *child_tidptr

thread_id へのポインタ

__user

include/linux/kernel.h メモリ空間に関するオプションらしい。

__kernel

Note

vfork, fork, clone の違いについて

  • clone と違い vfork では親のメモリをコピーしない
  • fork と違い vfork では親の実行をブロックする

http://surf.ml.seikei.ac.jp/~nakano/JMwww/html/LDP_man-pages/man2/vfork.2.html

歴史的な違い

do_fork を読む

kernel/fork.c:1560

権限チェックなど

clone_flags

include/linux/sched.h あたりに書いてある

CLONE_NEWUSER かつ CLONE_THREAD

copy_process

プロセスをコピーするところ

kernel/fork.c:1560

dup_task_struct

タスク情報をコピーするところ

kernel/fork.c:1560

プロセスのメモリ管理

メモリ領域の確保

  • alloc_task_struct_node
  • kmem_cache_alloc_node
    • mm/slab.c:3791 <http://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=blob;f=mm/slab.c;h=e901a36e2520c2b7aa5123ddcd0553415b764397;hb=ff74ae50f01ee67764564815c023c362c87ce18b#l3791>
    • mm/slob.c:609
    • mm/slub.c:2403
GFP_KERNEL って何よ?

メモリ確保時のオプション

gfp.h #define GFP_KERNEL (__GFP_WAIT | __GFP_IO | __GFP_FS) get_free_page

http://www.mech.tohoku-gakuin.ac.jp/rde/contents/linux/drivers/tips1.html

sched_fork

スケジューラに登録する

タスクの状態を TASK_RUNNING にしている

kernel/sched/core.c:1732

set_task_cpu

タスクを動かす CPU を決定

kernel/sched/core.c:1083

get_cpu

使う CPU を決定する

include/linux/smp.h:219

IA64 の場合は最終的に以下のような定義になっている。

arch/ia64/include/asm/smp.h:51

#define raw_smp_processor_id() (current_thread_info()->cpu)

今のプロセスと同じ CPU を使っている?

ftrace_graph_init_task

wake_up_task

run queue に登録するところ

kernel/sched/core.c:1813

ここでも set_task_cpu を読んでいる

タスクスケジューラに変更があったために色々と変わっているようだ

http://itpro.nikkeibp.co.jp/article/COLUMN/20080507/300814/

struct rq

CPU ごとに持つ runqueue の構造体

include/linux/sched.h:347

activate_task

run queue に登録するところ

kernel/sched/core.c:1813

do_execve

fs/exec.c

次回やること

次回 execve

担当は @mizon8

キーワード

  • fork/vfork/clone
  • struct task_struct
  • プロセスの名前空間
  • Process
  • DMA (Direct Memory Access)
  • CoW (Copy-on-Write)
  • RCU (Read-Copy-Update)
  • runqueue

«  Linux システムコール読書会 第一回 プロセス管理編1 〜 getpid 〜   ::   Contents   ::   第(2+1)回 六本木 Linux カーネル読書会  »