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

三層のシステムコールのメカニズム

API:第一層がLIBCは、システムコールのint 0x80の割込みトリガを使用して、システムコールをカプセル化APIを定義手段と、もちろん、APIシステムコールの全ては、このような添加の完了および減算として、使用されていないAPIを数学システムコールを使用していない。複数のAPIシステムを使用することも可能であることを呼び出します。この層の存在が価値を提供することで、システムコールを呼び出すためのアプリケーションプログラマのためのAPIを使用して簡単に。

SYSTEM_CALL:私は、カーネルモードで実行します。SYSTEM_CALLすべてのシステムは、入ってくる割込みサービスルーチンに対応する中間システムコール番号に応じて、ユーザ・モード・コンテキストを復元するために、プログラムの実行の終了時に、ユーザモードコンテキストを保護するために、前記プログラムの実行の開始時に、カーネルのエントリポイントを呼び出します。

パッケージsys_xyzシステムコールルーチン:ユーザの要求を完了するために、特定の操作のシステムコール、システムコールを実行し、それぞれがパッケージ化され、システムコールルーチンに対応します。

ユーザモード、カーネルモードの割り込み処理、および

現代の一般的なCPUは、命令のいくつかの異なるレベルがあり、高レベルのコードを実行するカーネル・モードを実行するCPUのレベルに対応する特権命令、任意の物理アドレスへのアクセスを実行することができます。ダウンロードIntel x86 CPUは、4つの異なる実行レベル0-3は、Linuxはカーネルモード(0)とユーザモード(レベル3)を表すために、それぞれ、のみ0と3のいずれかを使用しています。
割り込み処理は、ユーザーモードからカーネルモードに入るための主な方法です。
システムコールは、中断のちょうど特別な種類です。

実験

CのCコードを使用して、あなたは、現在のプロセスIDを返すことができます

 #include <stdio.h>
     #include <unistd.h>
 int main(){
 pid_t pid;
 pid=getppid();
 printf("The process number is %d\n",pid);
return 0;
}

の結果として、アセンブリコードを切り替えます

#include<stdio.h>
#include<unistd.h>

int main(){
pid_t pid;
asm volatile(
"mov $0,%%ebx\n\t"
"mov $0x40,%%eax\n\t"
"int $0x80\n\t"
"mov %%eax,%0\n\t"
:"=m"(pid)
);

printf("the process number is %d\n",pid);
return 0;
}

次のように実行結果は以下のとおりです。

おすすめ

転載: www.cnblogs.com/besti-20199303/p/11708558.html