ビデオ学習
まず、ユーザーモード、カーネルモードと割り込み
カーネル・モード:カーネルモードはCPUに対応するとき、実行は特権命令を実行できるハイレベルコード、任意の物理アドレスへのアクセスであります
ユーザーモード:実行がローレベルで、コードは、特定の範囲の許容レベル内でアクティブとすることができます。日常動作では、モードが直接使用するためのインタフェースをユーザーに提供するために、システムコールライブラリ関数呼び出しライブラリ関数パッケージシステムを介して実行されます。
インテルのx86 CPUは、4つの異なる実行レベル0-3は、Linuxのみ0 3それぞれのカーネルモードとユーザーモードのいずれかを使用しています。最小2つのCSレジスタは、現在の特権レベル・コードすなわち、00または11を示しています。
カーネル・モードCS:EIP値が任意である、すなわち、すべてのアドレス空間にアクセスすることができます。前記ユーザモードの部分のみがカーネルモードでのみメモリアドレス(0x00000000-0xbbbbbbbf)、より0xc0000000アドレス(論理アドレスではなく物理アドレス)にアクセスにアクセスすることができます。
割り込みハンドリングシステムは、特殊な割り込みを呼び出して、ユーザーモードからカーネルモードに入るための主な方法です。EIP値だけでなく、カーネルモード:モードをカーネルにユーザーモードは、スタックはユーザーモードアドレス、ステータス・ワード、その後、CSを含み、ユーザスタック上の状態を保存し、割り込み/ int命令レジスタコンテキストから切り替えられた場合スタックアドレスは、ステータスワードカーネルモードは、ハンドラのエントリを中断します。まず最初に、割り込みのシーンを保存することで発生する、一連のレジスタを保存する値;割り込みハンドラの終了前の最後のものは、サイトを復元することで、レジスタに格納されたデータを回復する、割り込みルーチンを抜けます。特記事項:サイトを保護するためには:ルーチンが入るとレジスタを使用するために必要なデータを保存することで中断、復旧サイト:レジスタに格納されたデータを回復する、割り込みルーチンを抜けます。
第二に、APIライブラリ関数と同じアセンブリコードに埋め込まれたコードCを使用するシステムコールをトリガします
システムを使用して、このライブラリ関数呼び出しの時間を取得するために、現在のシステム時刻を学びます
示されるように、「= m」は内部メモリに書き込まれた変数val3はを表し、「C」は、接着ECX、「D」EDXを表します。以下の入力及び出力は番号1,2で表され、...、のような "ADDL%1、%% EAXする\ nの\ tは" 第2の出力に入力を示し、すなわち、 "C"(ECX)値2つのフロント%パーセント前のエスケープ文字がある理由をEAX、EAXに追加されました。
ウェブテスト
- Mkdir.cファイルは、コンパイルそれが0を返した場合、正常にコンパイルします。
#include <stdio.h>
int main()
{
int flag;
flag = mkdir("/home/shiyanlou/testdir");
if (flag == -1)
printf("mkdir failed!\n");
else
printf("make dirctory success!\n");
return 0;
}
- コンパイルにはgccを使用して、
gcc -o makedir mkdir.c
- その後、修正編集して、次のコードをコンパイルするアセンブリ言語ファイルに追加することmkdir.c
gcc -o makedir2 mkdir.c -m32
- だから我々は、正常にコンパイルすることができます!
問題が発生しました
唯一見つけるために、機能のナンバリングシステムを呼び出すの質問は、私はシステムコール番号の内部プログラムとして数48の前に、コールリストにそれらのシステムの実験棟を見て、そして常に間違っています、は、mkdir数は39である、ある、と後でよく見ます39、対応する16進は0x27。
学習教材
1.システムコールの機能
- ユーザーは、ハードウェアのプログラミングで基盤となるハードウェアから解放されました。オペレーティングシステムは、当社の管理ハードウェア、ユーザプロセスのためのハードウェアを直接処理しません。
- 大幅にシステムのセキュリティを向上させます。ユーザーモードプロセスは、ハードウェアデバイスと直接取引する場合は、セキュリティ上のリスクは、システムがクラッシュする可能性があります生成されます。
- これは、ユーザーが携帯性をプログラムすることができます。ユーザプログラムと集団ハードウェアインターフェイスは切り離さマージにより置換されており、異なるシステム間での移植のために密接な関係を持っていないであろう。
2.API関係とシステムコール
- ライブラリ関数のシステムコールはリーダー、APIだけで定義された機能を提供するために使用するAPI(アプリケーション・プログラミング・インタフェース)オペレーティングシステムです。システムコールは、ソフト割り込み要求を割り込み、INT命令の実行が割り込み要求をトリガするカーネルによって発行されます。通常のカプセル化システムコールを使用して定義されたいくつかの内部APIのlibcライブラリ関数、その主な目的は、プログラマがコードを記述することができます配信システムは、パラメータを渡すためのアセンブリ命令とレジスタは、トリガ・システムを呼び出す必要はありません呼び出すことです。通常、各システムコールルーチンに対応するパッケージ、システムライブラリは、ルーチンは、最終的なパッケージシステムを使用するライブラリ関数のプログラマに呼び出すようにこれらのパッケージは、プログラマにAPIコールを定義し使用呼び出します。