2019-2020-1 20175314「情報セキュリティシステム設計の基礎」第7週の学習の概要
コンテンツ概要を学びます
異常な
- 異常な部分は、いくつかの変更処理の状態に応じて、フロー制御に変異しているオペレーティングシステムの一部として実装され、ハードウェアによって実現します。アプリケーションレベルの例外注意と言語間の概念的な区別。
- プロセッサは、ステータスビットは異なる信号として符号化され、それが状態変化イベントと呼ばれ、そしてイベントは、必ずしも現在の命令の実行に関連しません。プロセッサは、イベントを検出すると、例外ハンドラと呼ばれるイベントを処理するために特別に設計されたオペレーティングシステムルーチンに例外テーブルによって、間接プロシージャ・コールを、発生します。
- 処理例外ハンドラが終了した後、例外イベントの種類に応じて実行されます:
①戻り、現在の命令(イベントが発生したときに実行される)を制御します。
②戻り、次の命令(例外実行されない)に制御します。
中断されたプログラムを終了する③。 - 例外テーブルは、ジャンプ・テーブル・エントリは、オペレーティングシステムと初期化を開始するときに、システムによって割り当てられたk個の例外ハンドラのアドレスkを、含んでいます。システムは、すべての可能な例外で異常のユニークな非負の整数の番号が割り当てられます。
- 異常な類似したプロシージャ・コールは、違いがある:
①プロシージャ・コールはスタックに戻りアドレスの前にジャンプしますが、例外のリターンアドレスは、現在の命令または次の命令することができます。
②いくつかの余分なプロセッサが中断されたプログラムがスタック上にプロセッサの状態を必要と再開します。
カーネルへのユーザプログラムから③制御、プロジェクトカーネルスタック圧力、スタックではなくユーザに。
④例外ハンドラは、(システムリソースへのフルアクセス権を持つ)、カーネルモードで実行されます。 - 異常は4つのカテゴリに分けることができます。
カテゴリ | 理由 | 非同期/同期 | 戻り挙動 |
---|---|---|---|
割り込み | I / Oデバイスからの信号 | 非同期な | 必ず次の命令に戻ります |
トラップ | 興味がある例外 | シンクロナス | 必ず次の命令に戻ります |
障害 | 潜在的な回復可能なエラーの数 | シンクロナス | あなたは現在の命令に戻してもよいです |
終了 | 回復不能エラー | シンクロナス | ないリターン |
- 例外は、異常な同期命令の場合に、外部の非同期プロセッサI / Oデバイスによって生成された製品を実行します。
- 割り込みは、非同期に発生することが非同期であるので、ハードウェア割り込み命令、あらゆる原因を助けません。例外ハンドラのハードウェア割り込みは、割り込みハンドラと呼ばれています。
- トラップ、障害、および終了が同時に発生し、命令が障害と呼ばれています。
- トラップは、主にユーザとカーネルとの間で使用される意図的な例外は、システムコールとして知られている同じインタフェース、等の方法を提供します。プロセッサが提供
syscall n
カーネルnにサービスを要求し、満たすユーザに命令をsyscall
命令が例外ハンドラへのトラップが発生し、ハンドラは適切なカーネルを呼び出します。ユーザーモード、カーネルモードで実行しているシステムコールでの正常な機能が実行されます。 - 失敗は、このようなページ例外の欠落などのエラーによって引き起こされます。障害が発生すると、プロセッサはフォルトハンドラに制御を移すだろう、エラーを補正することができるならば、制御は障害命令に返されるハンドラが再び実行され、そうでない場合、処理ルーチンは、カーネルに返され
abort
たルーチン、abort
アプリケーションが終了されます。 - 致命的なエラーの結果終了、主に一部のハードウェア・エラー。
プロセス
- プロセスは、プログラムの実行の一例です。システムは、各プログラムは、プロセスのコンテキストで実行されます。プログラムコードとデータメモリスタックに保存された、汎用レジスタの内容、プログラムカウンタ、環境変数、およびオープン・ファイル記述子を設定するなど、プログラムの実行正しくコンテキスト状態で。
- あなたはシェルでプログラムを実行すると、シェルは新しいプロセスを作成し、新しいプロセスのコンテキストでターゲットに実行可能ファイルを実行します。また、アプリケーションは、新しいプロセスを作成することができます。
- :アプリケーション・プロセスへの2つの主要な抽象化を提供
プログラム排他的プロセッサのような錯覚を与える、①独立した論理制御フロー。
独占プログラム・メモリ・システムの錯覚を提供する②プライベートアドレス空間、。
論理フロー制御
- プログラムのPCのシリーズ(プログラムカウンタ)の値が一意に実行時に動的にリンクされた命令を含む実行可能なオブジェクトプログラムファイルまたは共有ライブラリに含まれる命令に対応する実行し、PC値は、制御フローの論理的配列と呼ばれ。
- プロセッサを使用してプロセステイクターン、各プロセスは、その流れの一部として実行され、その後、開始他のプロセスによってプリエンプトします。プログラムはそれほど排他的にプロセッサを使用しているかのように、プロセスのコンテキストで実行されます。
- 論理の流れは、互いに独立してプロセス互いに独立しています。プロセス間の相互作用は、プロセス間通信(IPC)機構を介して達成することができます。
- 論理の流れは一時的にストリームや他のロジックプロセスと呼ばれる並行処理を重複、両方のプロセスが同時に実行するように呼びます。AとB、AとC、BとCが同時に実行されていないいます。
- 時間の部分の処理実行制御フローは、時間スライスとして知られているマルチタスクと呼ばれるタイムスライス回転処理と実行中の他のプロセスと呼ばれます。
プライベートアドレス空間
- プロセスは、各プログラムのプライベートアドレス空間を提供し、関連する他のプロセスのメモリバイトのアドレス空間を読み取ることができません。プライベートアドレス空間とメモリの内容は、一般的に異なると関連するが、同じ空間構成を有しています。以前のLinuxの実行時のメモリアドレス空間マップは、Linuxプロセスの構造を示しています。
ユーザーモードとカーネルモード
- 抽象プロセスを実装するためにアクセス可能なアドレス空間の命令を実行可能な範囲の適用を制限する必要性は、この機構は、特定のモード制御レジスタのビットによって提供されます。モードビットが設定されている場合、プロセスがカーネルモードで実行し、そしてプロセスは、任意のメモリ位置にアクセスするための任意の命令を実行することができます。モード・ビットが設定されていない場合、ユーザーモードでプロセスを実行すると、プロセスは、コードの実行を許可していないとデータは特権命令とカーネルアドレス空間領域にアクセス。ユーザーは、システムコールインタフェースを介して間接的にカーネルのコードとデータにアクセスする必要があります。
- ユーザプログラムの最初のプロセスがユーザーモードになっている、あなたはカーネルモードにシステムコールのような例外に、故障や落下を中断しなければなりません。
- Linuxがあり
/proc
読める形式にカーネルデータ構造、アクセスの実行ユーザーモードプロセスの内容が含まれているファイルシステムが。
コンテキスト切り替え
- カーネルは、各プロセスのコンテキストを維持し、カーネルは、プロセスが状態プリエンプトされる再起動することが必要です。汎用レジスタ、浮動小数点レジスタ、プログラムカウンタ、スタックのユーザ、ステータスレジスタ、カーネルスタックと各種カーネル・データ構造(ページ・テーブル、ファイルテーブルとプロセス・テーブル、等)の値を含みます。
- カーネルコンテキスト切り替えがマルチタスクにより達成される、低レベルの例外メカニズムに基づいて、高度な例外制御フローです。
- Coreは、カーネルスケジューラのコードで扱う新しいプロセスを、スケジュールと呼ばれる以前に先取りプロセスを再開し、現在のプロセスをつかむことにしました。新しいプロセスに制御を移すためにコンテキストスイッチを使用してください。現在のプロセスのコンテキストスイッチコンテキストは保存し、以前のプロセスのコンテキストをつかむために保存されたリストア、制御が回復の新しいプロセスに渡されます。
システムコール
- システムコールと割り込みは、コンテキストスイッチをトリガすることができます。
- Linuxが使用することができ
man syscalls
、すべてのシステムコールのリストを表示します。エラーが発生したシステムレベルの機能、通常は-1を返し、グローバル変数errno
。 strace
各システムのコマンドは、プログラムを印刷すると、その子プロセスが呼び出し軌道を呼び出します
プロセス制御
プロセスは3つの状態があり:
①ラン:CPU上で実行される、または実行されるのを待っているプロセスは、(スケジュールされてもよいです)。
②停止:プロセスが中断される(予定されていません)。受信SIGSTOP
、SIGTSTP
、SIDTTIN
、SIGTTOU
信号は、プロセスが停止し、SIGCONT信号を受信、プロセスが再び実行を開始します。
③終了:プロセスが停止したことがありません。その理由であってもよい:プロセスを終了するために、受信信号は、メインプログラムからのリターン、呼び出しexit
機能を。- 新しいプロセスを作成すると、使用できる
fork
機能を。新しく作成されたプロセスの子と親は、それが仮想アドレス空間と親ユーザレベルのファイル記述子のコピーを取得し、ほぼ同じである、主な違いは、彼らが別のPIDを持っているということです。fork関数は、一度呼び出さ二回返され、親と子が同時に実行され、その実行順序を仮定することはできません。両方のプロセスの同じ初期アドレス空間が、互いに独立しており、彼らはまた、共有ファイルを開きます。 - お電話の場合はので、同じコードで、その
fork
3回、8つのプロセスが存在します。 - ときにプロセスが終了、それはすぐにクリアしますが、親プロセスのリサイクルを待ち、ゾンビプロセスと呼ばれることはありません。子プロセスは親プロセスのリサイクルを終了するときに、カーネルがプロセスを放棄した後、子プロセスの親プロセスの終了ステータスを渡します。回復する前に、親プロセスが終了した場合は、initプロセスによって死者リサイクルのプロセス。
- 子プロセスの回復を使用することができ
wait
、およびwaitpid
その他の機能。 - カーネルは、現在のプロセスのコンテキストで新しいプログラムをロードして実行するためにはexecve関数を呼び出します。
execve
負荷はfilename
スタートアップコードを呼び出した後、スタックを開始する準備ができたコードは、制御は、新しいプログラムのmain関数に渡されますint main(int argc, char *argv[], char *envp[])
。 典型的なユーザ・スタック組織:
- パラメータおよび環境的配列の配列は、プログラムに渡されます。プレスC標準では、
main
この関数は2つのパラメータのみ、グローバル変数の使用して、一般的な環境配列があるenviron
送信を。 - アレイ動作環境ができ
getenv
、家族機能します。
#include <stdlib.h>
/** 在环境数组中搜索字符串"name=value"
* @return 返回指向value的指针,若无返回NULL */
char *getenv(const char *name);
/** 以"name=value"格式取字符串,添加到数组
* @return 返回0,出错返回-1 */
int putenv(char *string);
/** 若name不存在,将"name=value"添加到数组;如存在且overwrite非0,用value覆盖原值
* @return 返回0,出错返回-1 */
int setenv(const char *name, const char *value, int overwrite);
/** 删除环境变量name
* @return 返回0,出错返回-1 */
int unsetenv(const char *name);
name
環境変数名。- ターゲットモジュールがディスク上に存在する、又はセグメントは、アドレス空間内に存在するように、プログラムコードおよびデータの収集に使用することができるされています。プロセスは、プログラムの実装の一例です。プログラムは、常にプロセスのコンテキストで実行されます。
ps
現在のプロセスを表示するコマンド。top
コマンドは、現在のプロセスによって使用される情報資源を印刷します。
信号
- 信号は、割り込み他のプロセスへの処理を可能にする、より高いレベルのソフトウェア、の異常な形態です。すなわち、信号、イベントの特定のタイプは、システムで発生したメッセージの通知処理です。
Linuxシステムの信号:
- 各信号タイプは、システムイベントの種類に対応しています。基礎となるハードウェアの例外は、通常、ユーザプロセスには見えない、信号は、これらの異常の通知ユーザプロセスに発生するための機構を提供します。他の信号は、より高いレベルのソフトウェアの場合にカーネルまたは他のユーザプロセスに対応します。
- プロセス・コンテキスト・オブジェクトのカーネルの状態を更新することによって送信信号を指し、それは先のプロセスに信号を送ります。信号を送信するための理由がある:
①カーネルは、ゼロによる除算またはサブプロセスの終了などのシステム・イベントを検出します。
②プロセスが呼び出しkill
に必要なカーネルターゲット・プロセスに信号を送るを表示する機能。プロセスは自分自身にシグナルを送ることができます。 - 受信信号処理は、カーネルオブジェクトが送信された信号に応答するように何らかの方法で強制的に指します。プロセスは、信号を捕捉するための信号、終了、または実行シグナルハンドラを無視することができます。
処理すべき受信信号信号と呼ばれることなく出射されます。信号を処理する信号の一つのタイプの最大値は、重複は破棄されます。プロセスは、いくつかの信号をブロックすることができ、このときはまだ送信することができるが、受信されません。信号は最大で1回で受信され処理されます。
信号を送信します
- プロセスグループの概念に基づいてプロセスにシグナルを送信します。プロセスグループIDは、各プロセスは、唯一のプロセスグループに属し、正の整数を識別する。
shell
各ジョブグループのための別のプロセスを作成し、プロセスグループIDは、通常、親の仕事です。- 送信
SIGINT
する信号をshell
、shell
デフォルトのフォアグラウンドジョブが終了、フォアグラウンドプロセスグループの各プロセスのキャプチャに信号を送ります。^Z
送信SIGTSTP
する信号をshell
、shell
フォアグラウンドプロセスグループ、保留中のデフォルトのフォアグラウンドジョブ内の各プロセスのキャプチャに信号を送ります。 kill
他のプロセスコマンドに信号を送信し、指定されたPIDは、プロセスグループIDにすべてのプロセス信号はPIDの絶対値として送信されたことを示し、負です。- プロセスができる
kill
機能(自分を含む)を任意のプロセスにシグナルを送ります。
受信した信号
- 各プロセスは、プロセスの妨害に配信される信号の現在のセットを定義する単語を遮蔽信号を有します。各信号は、マスク・ワードを有していてもよい信号は電流が遮断されることを示している場合、対応するビットが設定されています。
sigprocmask
検出信号と現在の単語遮蔽機能を変更します。 - 例外ハンドラからカーネル戻り、プロセスPはブロックされていないチェックする前に処理される信号の組に制御を渡します。セットが空の場合、カーネルは、プロセスPの次の命令論理制御フローに制御を渡し、非空集合(通常最小のkを取っ)カーネル選択信号k、強制受信処理P kの集合です。プロセスが完了行動の制御は、pの流れを制御するために、次の命令のロジックに渡された後、信号は、行動のプロセスをトリガーします。
- 各信号は、デフォルトの動作があってもよい有する
signal
デフォルト行動修正及び(SIGKILL SIGSTOPと外側を除く)関連する信号機能:
#include <signal.h>
typedef void (*sighandler_t)(int);
/** 改变和信号signum关联的行为
* @return 返回前次处理程序的指针,出错返回SIG_ERR */
sighandler_t signal(int signum, sighandler_t handler);
パラメータの説明:
①signumシグナル番号。
②handler点のユーザ定義関数は、即ちポインタ信号処理プログラム。またはAS:
③SIG_IGN:無視signum
信号を。
④SIG_DFL:復元signum
信号のデフォルトの動作を。- シグナルハンドラが信号を取り込むと呼ばれているコール、シグナルハンドラは、信号処理と呼ばれています。
signal
関数は、あろうsignum
信号処理プログラムにパラメータを渡すhandler
ことがので、パラメータhandler
信号の異なるタイプを捕捉することができます。 signal
セマンティクスと実装依存、使用することが好ましいsigaction
代わり機能。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <signal.h>
#include <unistd.h>
void w_error(const char *msg)
{
fprintf(stderr, "%s: %s\n", msg, strerror(errno));
exit(0);
}
void handler(int sig)
{
printf("caught SIGINT\n");
/* exit(0); */
}
int main()
{
if (signal(SIGINT, handler) == SIG_ERR)
w_error("signal error");
pause();
printf("come back\n");
exit(0);
}
信号処理
- すでに指摘したように、信号待ちのない繰り返しはありません。信号処理は、以下の特性を有します。
- シグナルハンドラのブロッキングタイプは、処理すべき現在の信号を処理しています。
- 最大で処理する信号の同じタイプ。
- シグナルによって中断された潜在的に遅いシステムコールの処理をブロックした後、シグナルハンドラ復帰に続け、エラー状態、および返ししない
errno
セットEINTR
。 - Linuxシステムは、システムコールを再起動します、およびSolarisはしません。異なるシステム間で、セマンティクスを処理差信号があります。
- POSIX標準を定義
sigaction
POSIX互換システムでのセマンティクスを処理する信号を提供することができる機能を。
非ローカルジャンプ
- Cは、非ローカルジャンプと呼ばれるユーザーレベルの例外の制御フローを、提供します。それが実行されている他の機能への制御機能から直接転送されます。
#include <setjmp.h>
/** 在env缓冲区中保存当前栈的内容,供longjmp使用,返回0
* @return setjmp返回0,longjmp返回非0 */
int setjmp(jmp_buf env);
int sigsetjmp(sigjmp_buf env, int savesigs);
/** 从env缓冲区中恢复栈的内容,触发一个从最近一次初始化env的setjmp调用的返回,setjmp返回非0的给定val值 */
void longjmp(jmp_buf env, int val);
void siglongjmp(sigjmp_buf env, int val);
- 非局所的なジャンプは直ちに深くネストされた関数呼び出しから戻るために使用することができ、そのようなエラーが検出され、又は、むしろ位置信号割り込み命令に戻るより特殊コードの位置にプログラムの移動を処理する信号。
- また、信号処理プログラムで非ローカルジャンプのために使用すべきである
sigsetjmp
とsiglongjmp
。場合savesigs
非ゼロ、そしてプロセスに保存されている現在のシグナルマスク・ワードは、呼び出した時点から保存された単語をシールド回復信号。同時に、あなたが使用する必要があることを確認するために、変数の型を一切中断が設定されていません。sigsetjmp
env
siglongjmp
env
volatile sig_atomic_t
env
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <setjmp.h>
static sigjmp_buf buf;
static volatile sig_atomic_t canjmp;
void handler(int sig)
{
if (canjmp == 0)
return;
/* ... */
canjmp = 0;
siglongjmp(buf, 1);
}
int main()
{
signal(SIGINT, handler);
if (!sigsetjmp(buf, 1))
printf("starting\n");
else
printf("restarting\n");
canjmp = 1;
while (1) {
sleep(1);
printf("processing ...\n");
}
exit(0);
}
ホスティングコード
感情の経験
今週は、より多くのコンテンツ、コースの内容とオペレーティングシステムの交差を学習するだけでなく、新しいコンテンツを学び、実行するコンピュータプログラムは、より深い直感的に理解しています。
学習の進捗バー
コードの行の数(追加/累算) | ブログ量(追加/蓄積) | 学習時間(追加/蓄積) | 重要な成長 | |
---|---|---|---|---|
目標 | 5000行 | 30 | 400時間 | |
最初の週 | 200/200 | 1/1 | 20/20 | |
第二週 | 300/500 | 1/1 | 10月15日 | |
第3週 | 200/500 | 1/1 | 10月12日 | |
4週 | 500/500 | 1/1 | 12月12日 | |
5週目 | 200/500 | 1/1 | 8/12 | |
6週 | 300/500 | 1/1 | 12月12日 | |
7週 | 300/500 | 1/1 | 15/15 |
プランの学習時間:15時間
実際の学習時間:15時間