まず、ユーザーモード、カーネルモードと割り込み
図1は、一般的にいくつかの近代的なCPU使用されていない命令の実行レベルを有する
高レベルのコードの実装で実行してもよい、2 特権命令にアクセス任意の物理アドレスのカーネル・モードを実行するCPUのレベルに対応します。
図3は、対応する低レベル実行状態において、制御コードの範囲が限定されています。レベルのみ許可された活動の範囲に対応します。
例:それぞれインテルx86CPU四つの異なる実行レベル0-3、のみ0と3のLinuxでは、カーネルモードとユーザモードを表します。
4. なぜあなたは部門の許可レベルが必要なのでしょうか?
プログラマはコードがシステム全体のクラッシュやその他の問題を作り、堅牢性を欠いて書きます。したがって、より専門的なプログラム、コードシステム、そのロバスト性を確保するために、カーネルモード動作、すなわち使用を、実行APEによって書かれました。
5、ユーザーモードとカーネルモードでは明確に区別されているとCS EIP
最低CSレジスタを2つの現在の特権レベルのコードを示します。
各命令は、CPU CSによって読み出される。これら2つのレジスタEIP:
CSはEIPレジスタにオフセットされ、選択されたコードセグメント・レジスタです。
決意は、ハードウェアによって行われます。
一般的にLinuxでは、アドレス空間は重要なサインです:唯一のカーネルモードでアクセス0xc0000000より多くのアドレス空間、0x0000000-0xbffffffアドレス空間は、2つの状態にアクセスすることができます。
このアドレス空間である論理アドレス
6. 割り込み処理がユーザーモード、カーネルモードに入るための主な方法で、システムコールは、特殊な割り込みです。
:(1)コンテキストを登録
モードをカーネルにユーザモードから切り替えられる:①②コンテキストは、対応するレジスタにユーザモードカーネルモードの応答値に保存されなければならないレジスタ
などのスタックに保存されている割り込み/ INT命令数レジスタ値、 :ユーザーモードのスタックアドレス、ステータス・ワード、その後、CS:EIPの値。
中断後の最初のものは、オンサイトで保存されている保存場所がデータ・レジスタを使用する必要性を保存、割り込みルーチンを入力することで、最後のものは、割り込み後にサイトを復元することで退避したレジスタを復元し、割り込みルーチンを終了データ復旧サイト。
第二に、システムの概要を呼び出します
図1に示すように、操作ユーザ・モード・プロセスと対話するためのシステムおよびハードウェアは、システムコールインターフェースのセットを提供-------
アウトプログラミング基礎となるハードウェアからユーザを解放するために
大幅にシステムのセキュリティを改善することは
、ユーザプログラムの移植である
2、アプリケーション・プログラミング・インターフェース(API)とは異なるシステムコール
APIは、単に関数定義(システムコールが機能としてパッケージ化することができる)である
ソフト割り込みによってカーネルに明確な要求を送信するシステムコール
libcライブラリは(システムコールを発行する唯一の目的は、コードを書くためにアセンブリ命令プログラム猿を必要としない)APIアプリケーションパッケージ・ルーチンの一部を定義します
一般的に、各パッケージシステムコールルーチンに対応する、話す、ライブラリルーチンは、ユーザーのAPIを定義するためにこれらのパッケージを使用します
必ずしもすべてのAPIは、特定のシステムコールに対応しています。
APIは、ユーザーモードに直接サービスを提供することができます。単一システムコールAPIは、同じシステムを呼び出すことができますいくつかの異なるAPIコールを呼び出すことができます。
3、戻り値
ほとんどのパッケージ・ルーチンは、その意味は、それぞれのシステムコールに依存する整数値を返します。
-1カーネルプロセスが要求を満たすことができない表し、LIBCはerrnoを変数はほとんどの場合、特定のエラーコードを含む定義しました。
ユーザ・モード・プロセスがカーネルモードに切り替え、システムコールを呼び出して、CPUは、カーネル関数の実行を開始4、。
パラメータ渡し、カーネルは、さまざまなシステムコールを実装して、パラメータを渡す必要とする、必要なシステムコールを指定しなければならないプロセスが使用して、システムコール番号を呼ばれるEAXレジスタの転送を。
図5は、システムコールはまた、などの入力および出力パラメータ、必要とする
実際の値を。
可変アドレスユーザーモードプロセスのアドレス空間。
機能へのユーザ・モード・アドレス・ポインタを含む偶数データ構造。
パラメータ渡し制限を登録する:
(1)各パラメータの長さは、レジスタ、または32ビットの長さを超えることはできません。
(2)外部システムコール番号(EAX)、パラメータの数は(EBX、ECX、EDX、ESI 6を超えることができない EBP、SDI) 半年以上にアクセスすることができた後のレジスタの一つには、メモリを指しますすべてのメモリ。
第三に、現在の時間を取得するためにライブラリ関数のAPIを使用します
:この実験が行われた場合、我々は最初はそのエラーを示唆し、32ビットにコンパイルされ、多くの問題が発生した
マシンが仮想マシンのビット数が64ビットであるが、32ビットをコンパイルするために、このコマンドを使用する必要があるため、お問い合わせの際:
須藤はapt-getのインストールのlibc6-devの-I386
このコマンドが実行された場合でも、エラーが発生しますないソフトウェアのソースのリンク:
この時点では、DNSを設定しました
sudoのvimの/etc/resolv.confを
文書が読み:
次に、ネットワークサービスを再起動し、aptの更新します
須藤はapt-getを更新
その後、通常のインストール
須藤はapt-getのインストールのlibc6-devの-I386
問題をコンパイルした後:
Baiduの後、我々は日に構造のTmのメンバ変数がtm_mdayである、ことを発見
、修正後