Linux システムコール読書会 第一回 プロセス管理編1 〜 getpid 〜¶
申し込みは connpass から。
スライドは こちら
togetter は こちら
内容まとめ¶
- この勉強会の趣旨: Linuxシステムコールを通して、カーネルの仕組みを勉強する
- システムコール == カーネルのAPI。プログラマにとって馴染みやすそう
- 本日のお題「getpid」
- 実際にサンプルコードを動かしてみる
- プロセスIDが表示される。そりゃそうだ。
- 実際にソースコードを追ってみる
- syscallの定義
- include/linux/unistd.h => include/asm/unistd.h
- __SYSCALL - arch/c6x/kernel/sys_c6x.c:51
- キーがsyscall numberで値がsyscallを呼び出す関数のテーブルを作ってる
- kernel/timer.cに定義されているらしいので飛んでみる
- SYSCALL_DEFINE0(getpid) - kernel/timer.c:1405
- SYSCALL_DEFINED0はシステムコールを定義するマクロ(引数0)
- currentの型はtask_struct構造体 - include/linux/sched.h:1264
- #define current get_current() - include/asm/current.h:17
- asm-generic は architecture specific ではない時の実装
- プロセスの情報を表わす構造体
- current変数は現在のプロセスの情報を保持している
- 参考: プロセスとtask_struct構造体
- task_struct の pid が今回目的のプロセス ID
「もっとABIとかsystem callの深い所に潜ってみようぜ!」
- ABI = Application Binary Interface
- アプリケーションとOSの間の低レベルのインタフェース
- 参考 Application Binary Interface
- ABI = Application Binary Interface
-
- 「entry.S contains the system-call and fault low-level handling routines.」
- sysenter_do_call - arch/x86/kernel/entry_32.S:427
- syenterに対する割り込みハンドラ(sysenterが呼び出されるとここが実行される)
- call *sys_call_table(,%eax,4) - arch/x86/kernel/entry_32.S:430
- %eaxにはシステムコール番号がつまれているので、それに対応するsys_call_tableを実行している
- 参考: What are the calling conventions for UNIX & Linux system calls on x86-64
sys_call_tableはどこに定義されているの? - const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] - arch/x86/kernel/syscall_32.c:18
- [0 ... __NR_syscall_max] = &sys_ni_syscall, #include <asm/syscalls_32.h>
- [N ... N’] は C99で追加された文法らしい
- 0から__NR_syscall_maxのシステム例外を返すsys_ni_syscallで初期化
- その後 asm/syscalls_32.h で後から上書き
- asm/syscall_32.hはコンパイル時にarch/x86/syscall/syscalltbl.shを使って生成
- 元データ: syscall_32.tbl
- asm/syscall_32.hはコンパイル時にarch/x86/syscall/syscalltbl.shを使って生成
- [0 ... __NR_syscall_max] = &sys_ni_syscall, #include <asm/syscalls_32.h>
glibc-2.16/sysdeps/unix/sysv/linux/i386/sysdep.h
- INTERNAL_SYSCALL
- kernel への割り込みを実際に発生させている所
- INTERNAL_SYSCALL
三種類のシステム命令
- int 80
- 昔からあった命令。メモリにアクセスするのでオーバーヘッドが高い
- sysenter
- pen2 以降で追加した命令。レジスタだけで完結するので速い
- syscall
- AMDがK6で導入した命令(らしい)
- int 80
今後の話
- プロセス,スケジュール,ネットワーク,メモリ
- プロセス、スケジューリング回りをベースに本を呼んでいくのはどう?
- minixを見るのとかはどう?
- プロのためのLinuxシステム10年効く技術
- プロセス,スケジュール,ネットワーク,メモリ
参考リンク