2018-2019-1 20165237 《信息安全系统设计基础》第七周学习总结
异常控制流
异常
- 异常是异常控制流的一种形式,它一部分是由硬件实现的,一部分是有操作系统实现的。
- 异常:控制流中的突变,用来响应处理器状态中的某些变化。
- 在处理器中,状态被编码为不同的位和信号。状态变化成为事件。
- 当异常处理程序完成处理后,根据引起异常的事件的类型,会发生以下三种情况的一种:
- 处理程序将控制返回给当前指令Icurr,即当事件发生时正在执行的指令。
- 处理程序将控制返回给Inext,即如果没有发生异常将会执行的下一条指令。
- 处理程序终止被中断的程序。
异常处理
- 系统中可能的类型的异常分配了一个唯一的非负整数的异常号。
- 处理器的设计者:被除零、缺页、存储器访问违例、断点以及算数溢出。
- 操作系统内核的设计者分配的:系统调用和来自意外不I/O设备的信号。
- 异常号:到异常表中的索引
- 异常表基址寄存器:异常表的起始地址存放的位置。
- 异常与过程调用的异同:
- 过程调用时,在跳转到处理器之前,处理器将返回地址压入栈中。然而,根据异常的类型,返回地址要么是当前指令,要么是下一条指令。
- 处理器把一些额外的处理器状态压入栈里,在处理程序返回时,重新开始被中断的程序会需要这些状态。
- 如果控制从一个用户程序转移到内核,那么所有这些项目都被压到内核栈中,而不是压到用户栈中。
- 异常处理程序运行在内核模式下,意味着它们对所有的系统资源都有完全的访问权限。
异常的类别
- 中断:异步发生,是来自处理器外部的I/O设备的信号的结果。
- 硬件异常中断处理程序通常称为中断处理程序。
- 异步异常是有处理器外部的I/O设备中的时间产生的,同步异常是执行一条指令的直接产物。
- 陷阱、故障、终止时同步发生的,是执行当前指令的结果,我们把这类指令叫做故障指令。
- 陷阱和系统调用:
- 陷阱最重要的用途是在用户程序和内核之间提供一个像过程一样的接口,叫做系统调用。
- 普通的函数运行在用户模式中,用户模式限制了函数可以执行的指令的类型,而且它们只能访问与调用函数相同的栈。系统调用运行在内核模式中,内核模式允许系统调用执行指令,并访问定义在内核中的栈。
- 陷阱是有意的异常,最重要的用途是在用户程序和内核之间提供一个向过程一样的接口,叫做系统调用。
- 为了允许内核服务的受控访问,使用“syscall n”指令,跳转到一个异常处理程序的陷阱,处理程序对参数解码并调用适当的内核程序。
- 故障:是由错误情况引起的。
- 例如:abort例程会终止引起故障的应用程序。 根据故障是否能够被修复,故障处理程序要么重新执行引起故障的指令,要么终止。例如:缺页故障。
- 终止:是不可恢复的致命错误造成的结果,通常是一些硬件错误。
- 终止处理程序从不将控制返回给应用程序。
- 终止处理程序将控制直接返回给abort例程,直接终止该应用程序。
进程
- 进程,就是一个执行中的程序的实例,系统中的每个程序都是定义在运行在某个进程的上下文中的。异常是允许操作系统提供进程的概念所需要的基的本构造块。
- 进程提供给应用程序的关键抽象:
- 一个独立的逻辑控制流,独占地使用处理器;
- 一个私有的地址空间,独占地使用存储器系统。
并发
- 并发流:一个逻辑流的执行在时间上与另一个流重叠。
- 并发:多个流并发地执行的一般现象。
- 多任务:一个进程和其他进程轮流运行的概念。
- 时间片:一个进程执行它的控制流的一部分的每一时间段。
- 多任务也叫时间分片。
- 并行流:如果两个流并发的运行在不同的处理器核或者计算机上
系统调用错误处理
- Unix系统级函数遇到错误时,会典型地返回-1,并设置全局变量errno来表示出错内容。
- 通过使用错误处理包装函数,可以进一步简化代码。
进程控制
获取进程ID
- 每个进程都有一个唯一的非零正数进程ID(PID)。
pid_t getpid(void); /*返回调用进程的PID*/
pid_t getppid(void); /*返回父进程的PID*/
创建和终止进程
- 进程总处于三种状态
- 运行:进程要么在CPU上执行,要么在等待被执行且最终会被内核调度。
- 停止:程序的执行被挂起,,且不会被调度。
- 终止:进程用永远停止了。终止原因:(1)收到一个信号,默认行为是终止进程;(2)从主进程返回(3)调用exit函数。
- 父进程通过调用fork函数创建一个新的运行的子进程。
- 子进程和父进程的异同:
- 异:有不同的PID
- 同:用户级虚拟地址空间,包括:文本、数据和bss段、堆以及用户栈。任何打开文件描述符,子进程可以读写父进程中打开的任何文件。
fork
函数: 因为父进程的PID总是非零的,返回值就提供一个明确的方法来分辨程序是在父进程还是在子进程中执行。 fork
函数的特点:
- 调用一次,返回两次
- 并发执行
- 相同的但是独立的地址空间
- 共享文件
利用fork和exec运行程序
- 外壳是一个交互型的应用级程序,它代表用户运行其他程序。
- 外壳执行一系统的读/求值步骤,然后终止。读步骤读取来自用户的一个命令行,求值步骤解释命令行,并代表用户运行程序。
学习进度条
|
代码行数(新增/累积) |
博客量(新增/累积) |
学习时间(新增/累积) |
重要成长 |
目标 |
5000行 |
20篇 |
200小时 |
|
第一周 |
61/61 |
1/1 |
10/10 |
了解vim,gcc,gdb基本操作 |
第二周 |
0/61 |
1/2 |
10/20 |
了解信息的表示和处理 |
第三周 |
21/81 |
1/3 |
10/30 |
更深层次了解信息处理 |
第四周 |
29/110 |
2/5 |
10/40 |
Y86处理器 |
第五周 |
39/149 |
1/6 |
14/54 |
理解了局部性原理 |
第六周 |
21/170 |
2/8 |
16/70 |
了解Linux是怎样操作文件 |
第七周 |
42/212 |
1/9 |
20/90 |
理解进程和并发,了解异常及其种类 |