Linuxシステム呼び出し
詳細
1.説明
システムコール(System Call)は、オペレーティングシステムがユーザ状態で動作するプロセスと、CPU、ディスク、プリンタなどのハードウェアデバイスとを対話させるために提供するインタフェースのセットである.ユーザプロセスがシステム呼び出しを発生させる必要がある場合、CPUはソフト割り込みによってカーネルに陥り割り込み処理関数を実行する.
2.インラインアセンブリ
次に,システムの現在時間の取得を例に,システム呼び出し方式を検討する.
1.glibc呼び出し
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.
3.インラインアセンブリ
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、この関数をエクスポート
参考資料:
『プログラマーの自己修養』
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、この関数をエクスポート
参考資料:
『プログラマーの自己修養』