「Linuxカーネルの解析」
第三章のメカニズムのシステムコール(上)
4.1ユーザーモード、カーネルモードと割り込み
- システムを扱うコールは、ライブラリ関数を介して行われ
- ユーザーモードとカーネルモードの区別
- カーネル・モード:高レベルのコードを実行する特権命令を実行することができる、任意の物理メモリへのアクセス
- ユーザーモード:低レベルの命令
- また、システムコールが中断しました
- ユーザーモードからの割り込み処理は、カーネルモードのメインフォームを入力します
ユーザーモード、カーネルモード、ユーザ・モード・レジスタ・コンテキストに切り替えるとレジスタ状態の値が現在のCPUのコアに入れている間には、保存してください
システムコールの4.2の概要
- システムの意義コール:
間違ったシステムを作るために、ハードウェアデバイスは、インタフェースのセットを提供してユーザーモードプロセスが相互作用として - システムコールの機能と特徴:
- プログラムは、基盤となるハードウェアからユーザーを解放します
- 新システムは、大幅にセキュリティが向上します
これは、ユーザーが携帯性をプログラムすることができます
4.2.1 APIとシステムの間の関係は、オペレーティングシステムを呼び出し、
- API:アプリケーション・プログラミング・インターフェース
- ただ、関数定義
- ソフトウェア割り込みシステムによる割り込み要求は、カーネルに呼び出すと
- 包装システムコール、システムコールを発行する唯一の目的を使用して定義されたライブラリルーチンlibcのいくつかの内部API
- 各システムコールは、パッケージ化されたシステムコールルーチンに対応します
- ライブラリルーチンは、プログラマにAPIコールを定義し、これらのパッケージを使用します
- 必ずしもすべてのAPIは、特定のシステムコール(1への多くの一から一、多くの1つ、)に対応します
- 返却値
- ほとんどの通常のカプセル化システムコールは、その値が対応するシステムコールの意味に依存整数を返します
- -1の戻り値は、カーネルプロセスは、ほとんどの場合、要求を満たすことができませんを示しています
- 特定のエラーコードを含む更なる定義のerrno変数のlibc
4.2.2以降のシステムコールとパラメータの受け渡し
- ユーザ・モード・プロセスは、システムコールを呼び出したときに、CPUの切り替えは、モードカーネルとシステムコールカーネル関数とSYSTEM_CALLの実行を開始します
- パラメータの受け渡し
- カーネルは、多くの異なるシステムコールを実装します
- システムコール番号と呼ばれるパラメータを使用して、EAXレジスタ転送
4.3 APIライブラリ関数Cコードと同一のシステムコールトリガーに埋め込まれたアセンブリコードを使用して
4.3.1 APIライブラリ関数は、システムコールをトリガー
- コード
#include<stdio.h>
#include<sys/types.h>
int main(void)
{
int u_id;
printf("%u\n",u_id);
return 0;
}
- 実行ショット
システムコールに埋め込まれたコードを開始4.3.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" //将系统调用执行后的返回值赋给变量tt
:"=m"(u_id)
);
printf("%u\n",u_id);
return 0;
}
- 実行ショット