3層のメカニズム章IV-システムコール(上)
この章では、システムコールをトリガーする方法をユーザプログラムに焦点を当てましたか?
まず、ユーザ、カーネル、割り込み
実行の4つのレベルがありますIntelX86。カーネルモードとユーザモードに対応する2つの特権レベル0と3の一方のみを使用してLinuxオペレーティングシステム。
ユーザーモードとカーネルモードのための重要な識別方法がCSである:EIP点範囲、CS場合カーネル・モード:EIP値は、任意のアドレスであってもよいです。しかし、ユーザーモードでのみ〜0xbfffffff 0x00000000のアドレス空間にアクセスすることができます。つまりのみカーネルモードでアクセス可能0xc0000000アドレス空間上。
システムはまた、割り込みの呼び出し(割り込み処理は、ユーザーモードからカーネルモードへの主要な方法である)です。
入力して、カーネルモードで割り込みをトリガされ、ハードウェア割り込みをすることができ、それは罠かもしれません。
int命令が割り込みメカニズムは、ユーザーモードスタックトップのアドレスを保存トリガ、その後、ステータスワード、その後、CS:EIPの値。
中断が発生した後、最初のシーン保存開始直後SAVE_ALLは、治療終了される前に、最後に中断サイトを復元するために実行されますrestore_allとIRETを。
第二に、システムの概要を呼び出します
システムの重要性は、ユーザ・モード・プロセスおよびハードウェア・デバイスのためのインターフェースのセットを提供するオペレーティングシステムと対話するために呼び出します。
唯一のシステムコールに対応することができるAPIはまた、内部システムコールの複数であってもよいし、システムコールはまた、API呼び出しの複数であってもよいです。
システムコール3つのメカニズムがある(XYZ()、SYSTEM_CALL、sys_xyz )。
各システムの番号を区別するために、カーネルを呼び出すことにより、すなわち、システムコール、API関数XYZ()システムコールカーネル関数sys_xyzは()アップリンク。
配信のためのEAXシステムコール番号。
パラメータが通過するときに順次EBX、ECX、EDX、ESI、EDI、EBPに割り当てられます。6以上のパラメータは、メモリとレジスタへのポインタを置くと、その複数のパラメータがメモリを通過することができます。
別のAPIを使用したアプリケーションのシステムコール(API)およびシステムの知識は、関数定義を呼び出します。システムコールは、ソフト割り込み要求を通じてカーネルに発行されます。
第三に、実験
ライブラリ関数は、システムコールAPIの名前を変更するトリガー使用
- コードは以下の通りであります:
#include<stdio.h>
int main()
{
int ret;
char *oldname="hello.c";
char *newname="newhello.c";
ret = rename(oldname,newname);
if(ret == 0)
printf("Renamed successfully\n");
else
printf("Unable to rename the file\n");
return 0;
}
結果:
リネームシステムコールをトリガーする組み込みアセンブリコード
アセンブリ言語コード:
#include<stdio.h>
int main()
{
int ret;
char *oldname="hello.c";
char *newname="newhello.c";
asm volatile(
"movl %2,%%ecx\n\t"
"movl %1,%%ebx\n\t"
"movl $0x26,%%eax\n\t"
"int $0x86\n\t"
"movl %%eax,%0"
:"=m"(ret)
:"b"(oldname),"c"(newname)
);
if(ret == 0)
printf("Renamed successfully\n");
else
printf("Unable to rename the file\n");
return 0;
}
正常に変更newhello.c