Linuxシステム呼び出し

1773 ワード

詳細
 
1.説明
システムコール(System Call)は、オペレーティングシステムがユーザ状態で動作するプロセスと、CPU、ディスク、プリンタなどのハードウェアデバイスとを対話させるために提供するインタフェースのセットである.ユーザプロセスがシステム呼び出しを発生させる必要がある場合、CPUはソフト割り込みによってカーネルに陥り割り込み処理関数を実行する.
 
2.インラインアセンブリ
次に,システムの現在時間の取得を例に,システム呼び出し方式を検討する.
 
1.glibc呼び出し
int tt = time(NULL);

 
2.syscall呼び出し
linux-2.6.32/arch/x86/kernel/syscall_table_32.S              v2.6.32システム呼び出し表
linux-3.18.6/arch/x86/kernel/syscall_table_32.S              v3.18.6システム呼び出しテーブル
linux-3.5/arch/x86/syscalls/syscall_32.tbl                         v3.5システム呼び出しテーブル
 
syscallを表示するにはtable_32.S割込み呼び出しテーブルファイル取得sys_time割込み呼び出し番号13.
int tt = syscall(13);

 
3.インラインアセンブリ
int tt = 0;
asm("mov $0,%%ebx
\t" "mov $13,%%eax
\t" "int $0x80
\t" "mov %%eax,%0
\t" :"=m"(tt) ); printf( "time:%d
", tt );

 
eax=13着信システム呼び出し番号
ebx=0は、time(NULL)に相当するシステム関数に入力されます.複数の入力パラメータがある場合はebxを使用します.
ecx,edx,esi,edi,ebpレジスタ
eax受信関数は値を返し、ttに出力する
int$0 x 80割り込み、windowsでは0 x 2 Eをシステム呼び出しエントリとして採用
 
3.拡張システム呼び出し
glibcにおけるtime()呼び出しプロセス:ユーザ状態呼び出しtime()、中断カーネル状態に陥り、カーネル関数sys_を呼び出すtime(). 
 
カスタムシステム呼び出しは、次の4つのステップで実行できます.
linux-2.6.32/kernel/sys.c                    
sys_xxx()は、システム呼び出しを実現する
linux-2.6.32/arch/x86/include/asm/unistd.h    
_NR_xxx、割り込み番号マクロ定義の追加
linux-2.6.32/arch/x86/kernel/syscall_table_32.S     
.long sys_xx、割り込みアセンブリ定義の追加
linux-2.6.32/include/linux/syscalls.h         
asmlinkage、この関数をエクスポート
 
参考資料:
『プログラマーの自己修養』