20145234黄斐《信息安全系统设计基础》第十一周学习总结(2)

8.0综述

现代系统通过使控制流发生突变来对各种情况做出反应,我们将这些突变称为异常控制流(ECF)

理解ECF的重要性

帮助你理解重要的系统概念

理解应用程序是如何与操作系统交互的(通过“陷阱”或“系统调用”)

帮助你编写有趣的新应用程序

帮助你理解并发

帮助你理解软件异常如何工作

8.1 异常

“异常”即控制流中的突变,用来响应处理器状态中的某些变化

事件即“状态变化”

8.1.1 异常处理

在任何情况下,当处理器检测到有事件发生时,它就会通过一张叫做“异常表”的跳转表,进行一个间接过程调用,到一个专门设计用来处理这类事件的操作系统子程序

异常表的起始地址放在“异常表基址寄存器”

8.1.2 异常的控制

异常分为四类“中断”,“陷阱”,“故障”,“终止”

8.1.3 Linux/IA32系统中的异常

IA32系统异常示例

Linx见课本

 

8.2 进程

8.2.1 逻辑控制流

用调试器单步执行程序,其PC值的序列叫做逻辑序列流

8.2.2 并发流

一个逻辑流的执行在时间上与另一个流重叠,称为并发流,这两个流被称为“并发地运行”

8.2.3 私有地址空间

一个进程为每个程序提供它自己的私有地址空间

8.2.4 用户模式和内核模式

处理器通常是用某个控制寄存器中的一个模式位来提供这种功能的,该寄存器描述了进程当前享有的特权

8.2.5 上下文切换

内核为每个进程维持上下文,上下文即内核重新启动一个被强占的进程所需的状态

8.3 系统调用错误处理

通过使用错误处理包装函数,可以进一步简化代码

8.4 信号

8.4.1 获取进程ID

每个进程都有一个唯一的正数类型的进程ID

8.4.2 创建和终止进程

进程永远处在“运行”“停止”“终止”三个状态之一

8.4.3 回收子进程

当进程由于某种原因终止时,内核并不是立刻把它从系统中清除。相反,进程处于终止状态,直到被其父进程回收

8.4.4 让进程休眠

可用sleep函数将一个进程挂起一段指定的时间

8.4.5 加载并运行程序

execve函数在当前进程的上下文中加载并运行一个新程序

#include <unistd.h>

int execve(const char *filename, const char *argv[],

  const char *envp[]);

若成功,不返回;错误,返回-1

 

8.5 信号

Unix信号是一种更高层次的异常,它允许进程中断其他进程

一个信号就是一条小消息,它通知进程系统中产生了一个某种类型的时间

8.5.1 信号术语

发送信号:内核通过更新目的进程上下文中的某个状态,发送一个信号给目的进程

接收信号:当目的进程被内核强迫一某种方式对信号的发送做出反应时,目的进程就接收了信号。进程可以忽略这个信号,终止或者通过执行一个称为信号处理程序的用户层函数捕获这个信号。

8.5.2 发送信号

进程组:每个进程都属于一个进程组,它是由一个正整数进程组ID来标识的。getpgrp函数返回当前进程的进程组ID;setpgid函数用于改变自己或者其他进程的进程组

用/bin/kill 程序可以向另外的进程发送任意的信号

Unix外壳使“作业”这个抽象概念来表示为对一个命令行求值而创建的进程,在任何时刻,至多只有一个前台作业和0或多个后台作业

键盘上输入ctrl-c会导致一个SIGINT信号被发送到外壳。

进程通过kill函数发送信号给其他进程

8.5.3 接收信号

内核从一个异常处理的程序返回,准备将控制传递给p时,会检查p未被阻塞的待处理信号的集合,若集合为空,则转到p逻辑控制流中的下一条指令;若集合不为空,则内核选择集合中的某个信号k,并且强制p接受信号k,触发进程的某种行为,完成后转到p逻辑控制流中的下一条指令。

k的默认行为有:

进程终止。

进程终止并转储存储器。

进程停止直到被SIGCONT信号重启。

进程忽略该信号。

8.5.4 信号处理问题

待处理信号被阻塞:

待处理信号不会排队等待;

系统调用可以被中断:

像read、wait、accept这样的系统调用潜在地会阻塞进程一段较长的时间,称为慢速系统调用。

注意:不可以用信号来对其他进程中发生的事件计数。

8.5.5 可移植的信号处理

信号处理语义的差异,是UNIX信号处理的一个缺陷。,为了处理这个问题,Posix标准定义了sigaction函数,它允许与Posix兼容的系统上的用户,明确的指定它们想要的信号处理方式

8.5.6 显式地阻塞和取消阻塞信号

sigprocmask函数改变当前已阻塞信号的信号

int sigprocmask(int how,const sigset_t *set,sigset_t *oldset);

sigprocmask函数改变当前已阻塞信号的集合,具体行为依赖how的值:

SIG_BLOCK:添加set中的信号到blocked中。

SIG_UNBLOCK:从blocked中删除set中的信号。

SIG_SETMASK:blocked=set。

 

8.6 非本地跳转

C语言提供了一种用户级异常控制流形式,称为非本地跳转,他将控制直接从一个函数转移到了另一个当前正在执行的函数,而不需要经过正常的调用返回序列。

非本地跳转是通过setjmp和longjmp函数来提供的

8.7 操作进程的工具

STRACE:打印一个正在运行的程序和它的子进程调用的每个系统调用的轨迹。

PS:列出当前系统中的进程(包括僵死的进程)。

TOP:打印出关于当前进程资源使用的信息。

PMAP:显示进程的存储器映射。

/proc:一个虚拟文件系统,以ASCII格式输出大量内核数据结构内容。

学习进度条

 

posted @ 2016-11-27 21:43  20145234黄斐  阅读(114)  评论(1编辑  收藏  举报