Created
July 13, 2012 07:07
-
-
Save kiris/3103290 to your computer and use it in GitHub Desktop.
syscall勉強会 #1のまとめ
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
* 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