第IV章、 "Paodingjieniu Linuxカーネル解析"
システムコール(上)3層のメカニズム
ユーザモード、カーネルモードと割り込み
システムは、オペレーティング・システム・ロケーション・ダイアグラムの呼び出し:
Intelx86 CPU4は、異なるレベル、すなわち、0,1,2,3、より少ない数の、より高い特権を行います。LinuxのCaozuojitongは、カーネルモードとユーザモードに対応し、ここで2つだけの特権レベル0と3を使用しました。
値のEIPは、任意のアドレスであってもよく、32ビットx86マシン、カーネルモードでの処理4GBのアドレス空間が存在する:カーネルモードは、CSの場合EIP点範囲:ユーザモードとカーネルモードのための非常に重要な識別方法は、CSでありますこの4GBのアドレス空間をアクセスすることができ、ユーザモードあなただけ0x00000000-0xbfffffffアドレス空間にアクセスすることができます。
このシステムはまた、メインモードカーネルモードを入力するようにユーザモードから中断するコール、割り込みハンドラです。
システムコールの概要
システムの重要性は、ユーザ・モード・プロセスおよびハードウェア・デバイスのためのインターフェースのセットを提供するオペレーティングシステムと対話するために呼び出します。システムコールは、以下の機能と特徴を持っている:
1。で、基盤となるハードウェアプログラミングからユーザーを解放し
、セキュリティが大幅システムの改善2.
3.ポータビリティがプログラムすることができます
実験棟実験4
1. APIライブラリ関数を使用すると、システムコールをトリガー
C言語のソースコード:
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main(void)
{
int u_id;
u_id=getpid();
printf("u_id=%u\n",u_id);
return 0;
}
結果:
システムコールを開始2.Cコード組み込みアセンブリコード
次のようにソースコードは次のとおりです。
#include<stdio.h>
#include<unistd.h>
int main(void)
{
int u_id;
asm volatile(
"movl $0x14,%%eax\n\t" /* 将系统调用号赋给eax寄存器 */
"int $0x80\n\t" /* 执行系统调用 */
"movl %%eax, %0\n\t" /* 将系统调用执行后的返回值赋给变量 */
:"=m" (u_id)
);
printf("u_id=%u\n",u_id);
return 0;
}
結果:
これは不十分な場合には、批判を喜ばと感謝される、Linuxの学習コンテンツの私の5週目です。
上記