2019-2020-1 20199301仕事の5週目の「Linuxカーネルの原理と分析」

3層のメカニズム章IV-システムコール(上)

この章では、システムコールをトリガーする方法をユーザプログラムに焦点を当てましたか?

まず、ユーザ、カーネル、割り込み

  • 実行の4つのレベルがありますIntelX86。カーネルモードとユーザモードに対応する2つの特権レベル0と3の一方のみを使用してLinuxオペレーティングシステム。

  • ユーザーモードとカーネルモードのための重要な識別方法がCSである:EIP点範囲、CS場合カーネル・モード:EIP値は、任意のアドレスであってもよいです。しかし、ユーザーモードでのみ〜0xbfffffff 0x00000000のアドレス空間にアクセスすることができます。つまりのみカーネルモードでアクセス可能0xc0000000アドレス空間上。

  • システムはまた、割り込みの呼び出し(割り込み処理は、ユーザーモードからカーネルモードへの主要な方法である)です。

  • 入力して、カーネルモードで割り込みをトリガされ、ハードウェア割り込みをすることができ、それは罠かもしれません。

  • int命令が割り込みメカニズムは、ユーザーモードスタックトップのアドレスを保存トリガ、その後、ステータスワード、その後、CS:EIPの値。

  • 中断が発生した後、最初のシーン保存開始直後SAVE_ALLは、治療終了される前に、最後に中断サイトを復元するために実行されますrestore_allIRETを

第二に、システムの概要を呼び出します

  • システムの重要性は、ユーザ・モード・プロセスおよびハードウェア・デバイスのためのインターフェースのセットを提供するオペレーティングシステムと対話するために呼び出します。

  • 唯一のシステムコールに対応することができる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

おすすめ

転載: www.cnblogs.com/lsqz/p/11667023.html