2019-2020-1 20199302仕事の5週目の「Linuxカーネルの原理と分析」

まず、ユーザーモード、カーネルモードと割り込み

図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である、ことを発見
、修正後

おすすめ

転載: www.cnblogs.com/eosmomo/p/11690401.html