Skip to content

Instantly share code, notes, and snippets.

@kiris
Created July 13, 2012 07:07
Show Gist options
  • Save kiris/3103290 to your computer and use it in GitHub Desktop.
Save kiris/3103290 to your computer and use it in GitHub Desktop.
syscall勉強会 #1のまとめ
* syscall勉強会 #1
- 告知: http://connpass.com/event/700/
- この勉強会の趣旨: Linuxシステムコールを通して、カーネルの仕組みを勉強する
- システムコール == カーネルのAPI。プログラマにとって馴染みやすそう。
- 本日のお題「getpid」
- プロセスIDを取得するシステムコール
- スライド: http://shomah4a.net/slides/linuxsyscall/01/
- サンプルコード: http://shomah4a.net/slides/linuxsyscall/01/_downloads/sample.c
- 実際にサンプルコードを動かしてみる
- プロセス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
- プロセスの情報を表わす構造体
- current変数は現在のプロセスの情報を保持している
- ref http://www.coins.tsukuba.ac.jp/~yas/coins/os2-2010/2010-12-14/
- task_structのpidが今回目的のプロセスID
- 「もっとABIとかsystem callの深い所に潜ってみようぜ!」
- ABI = Application Binary Interface
- アプリケーションとOSの間の低レベルのインタフェース
- ref http://ja.wikipedia.org/wiki/Application_Binary_Interface
- arch/x86/kernel/entry_32.S
- 「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を実行している
- ref http://stackoverflow.com/questions/2535989/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
- glibc-2.16/sysdeps/unix/sysv/linux/i386/sysdep.h
- INTERNAL_SYSCALL
- syscall割り込みを実際に発生させている所
-
- 三種類のシステム命令
- int 80
- 昔からあった命令。メモリにアクセスするのでオーバーヘッドが高い
- sysenter
- pen2以降で追加した命令。レジスタだけで完結するので速い
- syscall
- AMDがK6で導入した命令(らしい)
- 今後の話
- プロセス,スケジュール,ネットワーク,メモリ
- プロセス、スケジューリング回りをベースに本を呼んでいくのはどう?
- minixを見るのとかはどう?
- プロのためのLinuxシステム10年効く技術
-
参考リンク
Calling Convention についての stackoverflow
http://stackoverflow.com/questions/2535989/what-are-the-calling-conventions-for-unix-linux-system-calls-on-x86-64
int 2E/sysenter/syscall考察
http://www.marbacka.net/asm64/arkiv/int2e_sysenter_syscall.html
Introduction to UNIX assembly programming
http://asm.sourceforge.net/intro/hello.html
2012/06/08 第17回 IT基礎技術勉強会 メモ
http://kozos.jp/group/017/memo_euc.txt
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment