仕事の5週目の「Linuxカーネルの原理と分析」
先週の質問の要約:
- 仮想マシンファイルは、アセンブリファイルcにコンパイルされるときに<stdio.h>を含める追加することを忘れ
- gdbが未熟な組立工程を追跡します
。学習コンテンツの二週間:
1.教科書学習
1.1ユーザーモード、カーネルモードと割り込み
- カーネルモード:実行は、特権命令を含むCPUに対応するカーネル・モードは、すべての命令を実行することができる場合、特権命令、任意の物理アドレスへのアクセスを実行することができるハイレベルコードです。
- ユーザーモード:実行がローレベルで、コードは、特定の範囲の許容レベル内でアクティブとすることができます。日常動作では、モードが直接使用するためのインタフェースをユーザーに提供するために、システムコールライブラリ関数呼び出しライブラリ関数パッケージシステムを介して実行されます。
- 4つのレベル0,1,2,3のインテルのx86 CPUの実行は、Linuxは一つだけ0と3の二つのレベルの使用、それぞれ、カーネルモードとユーザモードを表します。ユーザーモードとカーネルモードは有意差法はCSである:EIP点範囲、カーネルモードCS:EIP値は、すべてのアドレス空間にアクセスすることができ、すなわち任意です。前記ユーザモードの部分のみがメモリアドレス(0x00000000-0xbbbbbbbf)のみカーネルモードで0xc0000000アクセス上のアドレスにアクセスすることができます。
- 割り込みハンドリングシステムは、特殊な割り込みを呼び出して、ユーザーモードからカーネルモードに入るための主な方法です。EIP値だけでなく、カーネルモード:モードをカーネルにユーザーモードは、スタックはユーザーモードアドレス、ステータス・ワード、その後、CSを含み、ユーザスタック上の状態を保存し、割り込み/ int命令レジスタコンテキストから切り替えられた場合スタックアドレスは、ステータスワードカーネルモードは、ハンドラのエントリを中断します。まず最初に、割り込みのシーンを保存することで発生する、一連のレジスタを保存する値;割り込みハンドラの終了前の最後のものは、サイトを復元することで、レジスタに格納されたデータを回復する、割り込みルーチンを抜けます。
1.2システムコール
- システムの意義コール:基盤となるハードウェアのプログラミングアウトから解放されたユーザーは、大幅にシステムのセキュリティを向上させる、ユーザーは、移動性プログラムを実施しています。
- ライブラリ関数のシステムコールはリーダー、APIだけで定義された機能を提供するために使用するAPI(アプリケーション・プログラミング・インタフェース)オペレーティングシステムです。システムコールは、ソフト割り込み要求を割り込み、INT命令の実行が割り込み要求をトリガするカーネルによって発行されます。通常のカプセル化システムコールを使用して定義されたいくつかの内部APIのlibcライブラリ関数、その主な目的は、プログラマがコードを記述することができます配信システムは、パラメータを渡すためのアセンブリ命令とレジスタは、トリガ・システムを呼び出す必要はありません呼び出すことです。通常、各システムコールルーチンに対応するパッケージ、システムライブラリは、ルーチンは、最終的なパッケージシステムを使用するライブラリ関数のプログラマに呼び出すようにこれらのパッケージは、プログラマにAPIコールを定義し使用呼び出します。
- 以下に示すように、ユーザモードは、ユーザモードを示す、カーネルモードは、カーネルモードを表します。XYZ()は、API関数であるシステムコールをカプセル化し、対応するAPIシステムコールは、int型の内部、割り込みサービスルーチンのエントリーを対応するベクトル0X80を中断し、対応するSYSTEM_CALLカーネルコードの開始点を、$は0x80を中断トリガされていますそこsys_xyz()システムコールハンドラ、sys_xyzを実行する(後)ここでは最も一般的なスケジューリングのタイミングポイントをスケジューリングするプロセスがあり、ret_from_sys_callます。スケジューリングプロセスが発生しない場合、それは、ユーザモードを実行し、実行IRETに戻ります。3層システムコール機構)(XYZありSYSTEM_CALLとsys_xyz()。
- ユーザ・モード・プロセスは、システムコールを呼び出したときに、CPUの切り替えは、モードカーネルとカーネル関数の実行を開始します。Linuxのプログラミングでは、ベクトル128体の異常を生成することで、インテルのPentium IIは、(高速システムコール)SYSENTER命令を導入し、2.6は、このアセンブリ命令、システムコールを実行するためのint $ 0x80での実装によってサポートされています。システムコールに加えて、システムコールはまた、パラメータを渡す必要があるかもしれません。カーネルは、多くの異なるシステムコール、EAXレジスタを使用して、システムコール番号を呼ばれるパラメータを渡す必要があり、必要なシステムコールを、指定しなければならないプロセスを実装します。含むデータ構造の機能へのユーザモードプロセスのアドレス空間、あるいはユーザ・モード・アドレス・ポインタ変数アドレスの実際の値:システムコールはまた、入力および出力パラメータを必要とします。SYSTEM_CALL各システムは、少なくとも一つの呼び出しパラメータ、EAXによって送信される、すなわち、システムコール番号を有し、すべてのLinuxシステムコールのエントリポイントです。実行はEAXレジスタに$ 0x80をを取った前に、アプリケーションは(すなわち_NR_fork)2である、値が設定されているフォーク()ルーチンのカプセル化を呼び出します。このレジスタは、ライブラリルーチンのパッケージをlibcに設定され、ユーザーは一般的にsys_callを入力した後、EAXの値は、直ちにカーネルスタックに押し込まれ、システムコール番号を気にしません。1)各パラメータの長さは、レジスタの長さを超えることができない、すなわち、32 2)システムコール番号(EAX)のうち、パラメータの数は6(EBX、ECX、EDX、超えることができない:転送パラメータは、次の制限を有するレジスタESI 6オーバー、EDI、EBP)3)どのように行うには?半年以上、メモリの一部へのポインタとして一つのレジスタを置きます。
2.実験ラボ棟
2.1 APIライブラリ関数とCコード組み込みアセンブリコードは、同一のシステムコールをトリガ
トリガーするために使用されるAPIライブラリ関数は、
プロセス識別子を取得するライブラリ関数GETPID()を呼び出し、以下:
以下の結果:
アセンブリコードに埋め込まれたCコードをトリガするために
、以下のように実行結果は次のとおり
2つの引数は名前の変更を呼び出すと2.2システム
まず、ファイルzxf.c作成
トリガーする組み込みアセンブリコードを
次のように実行結果は次のとおりです。
成功したと改名zxf.c zxf20199329.c
ライブラリ関数APIをトリガするために
、次のように実行結果は次のとおりです。
成功しzxf.cに戻すzxf20199329.c
III。まとめと難しいです
- システムの重要性は、ユーザ・モード・プロセスおよびハードウェア・デバイスのためのインターフェースのセットを提供するオペレーティングシステムと対話するために呼び出します。
- 唯一のシステムコールに対応することができるAPIはまた、内部システムコールの複数であってもよいし、システムコールはまた、API呼び出しの複数であってもよいです。
- システムコールの3層機構)(XYZあり、SYSTEM_CALL、sys_xyz()。
- 各システムの番号を区別するために、カーネルを呼び出すことにより、すなわち、システムコール、API関数XYZ()システムコールカーネル関数sys_xyzは()アップリンク。
- 配信のためのEAXシステムコール番号。
- パラメータが通過するときに順次EBX、ECX、EDX、ESI、EDI、EBPに割り当てられます。6以上のパラメータは、メモリとレジスタへのポインタを置くと、その複数のパラメータがメモリを通過することができます。
- 別のAPIを使用したアプリケーションのシステムコール(API)およびシステムの知識は、関数定義を呼び出します。システムコールは、ソフト割り込み要求を通じてカーネルに発行されます。
QUSTION:
- 限りスタック空間に内蔵された文字列(というよりもヒープ領域)、システムコールによってコンパイルすると、正しく出力することはできません。
IV。来週プログラム
- 完了時に[]放課後練習帳
- 学習前に[]アセンブラと逆アセンブラレビュー
2019年10月20日