信息安全系统设计基础第十一周20135334赵阳林

第八章  异常控制流

  • 平滑:指在存储器中指令都是相邻的。
  • 突变:出现不相邻,通常由诸如跳转、调用、和返回等指令造成。

    异常是异常控制流的一种形式,由硬件操作系统实现。简单来说,就是控制流中的突变

  • 事件:即状态变化,与当前指令的执行可能直接相关,也可能没有关系。
  • 异常的处理方式:

8.1 异常处理

  • 异常号:系统为每种类型的异常分配的唯一的非负整数
  • 异常表:系统启动时操作系统就会初始化一张条转变,使得条目k包含异常k的处理程序的地址。

    异常号是到异常表中的索引,异常表的起始地址放在异常表基址寄存器。

异常的类别

  • 故障指令:执行当前指令导致异常
  • 中断处理程序:硬件中断的异常处理程序。

(1)中断

  • 异步发生
  • 来自处理器外部的I/O设备的信号的结果
  • 返回下一条指令

(2)陷阱

  • 陷阱是有意的异常
  • 是执行一条指令的结果
  • 最重要的用途——系统调用

(3)故障

  • 由错误状况引起,可能能够被故障处理程序修正
  • 结果要么重新执行指令(就是返回当前指令地址),要么终止
  • 典型示例:缺页异常

(4)终止

  • 是不可恢复的致命错误造成的结果
  • 通常是一些硬件错误

(1)Linux/IA32故障和终止

  • 除法错误/浮点异常 异常0 终止程序
  • 一般保护故障/段故障 异常13 终止程序
  • 缺页 异常14 返回当前地址
  • 机器检查 异常18 终止程序
(2)Linux/IA32系统调用

每一个系统调用都有一个唯一的整数号,对应于一个到内核中跳转表的偏移量。

8.2进程

系统中的每个程序都是运行在某个进程的上下文中的。

     上下文:由程序正确运行所需的状态组成的。

     进程提供给应用程序的关键抽象:

  • 一个独立的逻辑控制流:独占的使用处理器  一个私有的地址空间:独占的使用存储器系统

1.逻辑控制流

  • 一系列的程序计数器PC的值,分别唯一的对应于包含子啊程序的可执行目标文件中的指令,或者是包含在运行时动态链接到程序的共享对象中的指令,这个PC值的序列就叫做逻辑控制流
  • 进程是轮流使用处理器的。每个进程执行它的流的一部分,然后被抢占,然后轮到其他进程。但是进程可以向每个程序提供一种假象,好像它在独占的使用处理器。

2.并发流

  • 一个逻辑流的执行在时间上与另一个流重叠。【与是否在同一处理器无关】这两个流并发的运行
  • 并发:多个流并发的执行
  • 多任务:一个进程和其他进程轮流运行(也叫时间分片)
  • 时间片:一个进程执行它的控制流的一部分的每一时间段
  • 并行 两个流并发的运行不同的处理机核或者计算机上。 并行流并行的运行,并行的执行。

私有地址空间

用户模式和内核模式

进程从用户模式变为内核模式的唯一方法是通过异常——中断,故障,或者陷入系统调用。

上下文切换

  • 操作系统内核使用上下文切换这种较高层形式的异常控制流来实现多任务。上下文切换机制建立在较底层异常机制之上。

上下文切换机制

1.保存当前进程的上下文

2.恢复某个先前被抢占的进程被保存的上下文

3.将控制传递给这个新恢复的进程。

可能发生上下文切换的原因:

  • 内核代表用户执行系统调用时
  • 中断

进程控制

每个进程都有一个唯一的正数进程ID(PID)。

1.进程总是处于下面三种状态之一

  • 运行
  • 停止:被挂起且不会被调度
  • 终止:永远停止。原因:
    1.收到信号,默认行为为终止进程
    2.从主程序返回
    3.调用exit函数

2.创建进程

父进程通过调用fork函数来创建一个新的运行子进程。

 

fork函数只被调用一次,但是会返回两次:父进程返回子进程的PID,子进程返回0.如果失败返回-1.

调用fork函数n次,产生2的n次方个进程。

3.终止进程

exit函数以status退出状态来终止进程。

三、回收子进程

进程终止后还要被父进程回收,否则处于僵死状态。

如果父进程没有来得及回收,内核会安排init进程来回收他们。init进程的PID为1.

一个进程可以通过调用waitpid函数来等待它的子进程终止或停止。

成功返回子进程PID,如果WNOHANG,返回0,其他错误返回-1.

1.判断等待集合的成员——pid

  • pid>0:等待集合是一个单独子进程,进程ID等于pid
  • pid=-1:等待集合是由父进程所有的子进程组成
  • 其他。

2.修改默认行为——options

检查已回收子进程的退出状态——status

wait函数

成功返回子进程pid,出错返回-1

四、让进程休眠

sleep函数

sleep函数使一个进程挂起一段指定的时间。

返回值是剩下还要休眠的秒数,如果到了返回0.

pause函数

让调用函数休眠,直到该进程收到一个信号。

五、加载并运行程序——execve函数

#include <unistd.h>

int execve(const char *filename, const char *argv[], const char *envp[]);

成功不返回,失败返回-1.

execve函数调用一次,从不返回。

  • filename:可执行目标文件
  • argv:参数列表
  • envp:环境列表

getnev函数

在环境数组中搜寻字符串"name=value",如果找到了就返回一个指向value的指针,否则返回null。

setenv和unsetenv函数

如果环境数组包含"name=oldvalue"的字符串,unsetenv会删除它,setenv会用newvalue代替oldvalue,只有在overwrite非零时成立。

如果name不存在,setenv会将"name=newvalue"写进数组。

※fork函数和execve函数的区别

  • fork函数是创建新的子进程,是父进程的复制体,在新的子进程中运行相同的程序,父进程和子进程有相同的文件表,但是不同的PID
  • execve函数在当前进程的上下文中加载并运行一个新的程序,会覆盖当前进程的地址空间,但是没有创建一个新进程,有相同的PID,继承文件描述符。

信号

传递一个信号到目的进程的两个步骤:发送信号和接收信号。

发送信号原因:

1.内核检测到一个系统事件
2.一个进程调用了kill函数,显式的要求内核发送一个信号给目的进程。

接收信号: 1.忽略 2.终止 3.执行信号处理程序,捕获信号

发送信号——基于进程组

1.进程组

  • 每个进程都只属于一个进程组。
  • 进程组ID:正整数
  • 一个子进程和他的父进程属于同一进程组。
  • 查看进程组id:getpgrp
  • 修改进程组:setpgid

2.用/bin/kill程序发送信号

/bin/kill程序可以向另外的进程发送任意的信号,格式是:

/bin/kill -n m
n是信号,m是进程或进程组

当n>0时,发送信号n到进程m

当n<0时,使信号|n|发送到进程组m中的所有进程。

3.从键盘发送信号

4.用kill函数发送信号

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

5.用alarm函数发送信号

信号简介

信号是一种进程间通信的方法,应用于异步事件的处理,实质是软中断。

信号生命周期

信号产生、信号注册、信号注销、信号处理

(1)信号产生-四种类型
  • 用户产生-Ctrl+C。

stty-a,查看哪些按键可以产生信号

  • 硬件产生-除零错误
  • 进程产生-kill指令
  • 内核产生-闹钟超时
信号处理-三种方法
  • 执行默认操作
  • 忽略信号
  • 捕捉信号:执行信号处理函数,切换到用户态。

捕捉:signal函数

忽略信号:SIG_IGN

默认操作:SIG_DFL

非本地跳转

调用环境:程序计数器,栈指针,通用目的寄存器

longjmp函数从env缓冲区中恢复调用环境,然后触发一个从最近一次初始化env的setjmp调用的返回。然后setjmp返回,并带有非零的返回值retval。

setjmp函数只被调用一次,但返回多次;

longjmp函数被调用一次,但从不返回。

操作进程的工具

  • STRACE:打印一个正在运行的程序和他的子程序调用的每个系统调用的痕迹
  • PS:列出当前系统中的进程,包括僵死进程
  • TOP:打印出关于当前进程资源使用的信息
  • PMAP:显示进程的存储器映射

总结

用时:6小时

感想:学习的时候,先根据老师提供的重点学习,进程的切换等相关知识与操作系统的知识相关联,这方面比较易于接受,别的书上的知识点难以理解,看视频,视频太长,看得略浮躁。搁下一段时间再看,学得有点累。但是还是有收获的,学会能够知道数组指针、指针数组、函数指针、指针函数的区别了。

时间: 2024-10-15 08:51:04

信息安全系统设计基础第十一周20135334赵阳林的相关文章

信息安全系统设计基础第十一周学习总结——20135308

第八章 异常控制流 控制转移序列称为控制流. 从从一条指令到下一条指令称为转移控制. 异常控制流:现代操作系统通过使控制流发生突变来对系统状态做出反应,这些突变称为异常控制流. 异常控制流ECF:即这些突变. 1.ECF是操作系统用来实现I/O.进程和虚拟存器的基本机制 2.应用程序通过使用一个叫做陷阱或者系统调用的ECF形式,向操作系统请求服务 3.ECF是计算机系统中实现并发的基本机制 4.软件异常机制——C++和Java有try,catch,和throw,C中非本地跳转是setjmp和lo

信息安全系统设计基础第十一周 20135218 姬梦馨

第8章 异常控制流 控制流:控制转移序列. 控制转移:从一条指令到下一条指令.例:从k到k+1的过渡称为控制转移. 异常控制流:现代操作系统通过使控制流发生突变来对系统状态做出反应,这些突变称为异常控制流. 平滑:指在存储器中指令都是相邻的. 突变:出现不相邻,通常由诸如跳转.调用.和返回等指令造成. 8.1 异常 异常是ECF的一种,一部分由硬件实现,一部分由操作系统实现.就是位于硬件和操作系统之间的ECF. 硬件上,系统状态实际是处理器的状态,处理器的状态通常就是不同的位和信号(寄存器的位)

信息安全系统设计基础第十一周学习总结

第八章代码学习 exec1 #include<stdio.h> #include<unistd.h> int main() { char  *arglist[3]; arglist[0] = "ls"; arglist[1] = "-l"; arglist[2] = 0 ;//NULL printf("* * * About to exec ls -l\n"); execvp( "ls" , argli

20135210程涵——信息安全系统设计基础第十一周学习总结

第8章 异常控制流 8.1 异常 异常是ECF的一种,一部分由硬件实现,一部分由操作系统实现.就是位于硬件和操作系统之间的ECF. 异常可以分为四类:中断(interrupt),陷阱(trap),故障(fault),终止(abort). 中断——来自处理器外部的I/O设备的信号的结果. 中断处理程序——异步异常——由处理器外部I/O设备中的事件产生的.同步异常是执行一条指令的直接产物. 中断通过向处理器芯片上的一个引脚发信号(高低电平),并将异常号放在系统总线上,以触发中断,很清楚. 其中断处理

信息安全系统设计基础第十一周学习总结—20135227黄晓妍

第8章异常控制流 控制流:控制转移序列. 控制转移:从一条指令到下一条指令. 异常控制流:现代操作系统通过使控制流发生突变来对系统状态做出反应,这些突变称为异常控制流. 一.异常 1.异常的剖析,如下图所示: 异常:控制流中的突变,用来响应处理器状态的某些变化. Icurr:当前指令 事件:状态变化 2.异常处理 异常表:当处理器检测到有事件发生时,它会通过跳转表,进行一个间接过程调用(异常),到异常处理程序. 异常号:系统中可能的某种类型的异常都分配了一个唯一的非负整数的异常号.异常号是到异常

信息安全系统设计基础第十一周总结

第八章.异常控制流 控制转移: 控制流: 异常控制流(ECF): 异常控制流发生在计算机系统的各个层次. 理解ECF很重要. 一.异常 1.异常:是异常控制流的一种形式.一部分由硬件实现,一部分由操作系统实现. 2.异常处理 (1)异常表:当处理器检测到有事件发生时,它会通过跳转表,进行一个间接过程调用(异常),到异常处理程序. (2)异常号:系统中可能的某种类型的异常都分配了一个唯一的非负整数的异常号.异常号是到异常表中的索引. 3.异常的类别:中断.陷阱.故障和终止 a)中断处理:异步是指硬

信息安全系统设计基础第十一周

第八章  异常控制流 1.从给处理器加电开始,直到断电位置,程序计数器假设一个值的序列:a0,a1,...,an-1,其中,每个ak是某个相应地指令Ik的地址.每次从ak到ak+1的过渡称为控制转移.这样的控制转移序列叫做处理器的控制流.最简单的一种控制流是一个“平滑的”序列,其中每个Ik和Ik+1在存储器中都是相邻的. 2.系统通过使控制流发生突变来对系统状态的变化做出反应,这些突变称为异常控制流. 3.应用程序通过使用一个叫做陷阱或者系统调用的ECF形式,向操作系统请求服务. 4.操作系统为

20135213——信息安全系统设计基础第十一周学习总结

一.学习目标 掌握进程控制掌握信号处理的方法掌握管道和fifo进行进程间通信的方法 二.学习任务 编译.运行.阅读.理解process.tar.gz压缩包中的代码 三.参考资料及实验环境 参考资料:process.tar.gz压缩包中的代码. 课本<深入理解计算机系统>. 百度.20135202闫佳歆 环境:实验楼 四.学习过程 exec1 #include <stdio.h>#include <unistd.h> int main(){ char *arglist[3

20135205信息安全系统设计基础第十一周学习总结

第八章 异常控制流 异常及其种类 异常:就是控制流中的突变,用来响应处理器状态中的某些变化. 在处理器中,状态被编码为不同的位和信号.状态变化称为事件.事件可能和当前指令的执行没有关系. 在任何情况下,当处理器检测到有事件发生时,它就会通过一张叫做异常表的跳转表,进行一个间接调用异常,到一个专门设计用来处理这类事件的操作子程序(异常处理程序) 当异常处理程序完成处理后,根据引起异常的事件的类型,会发生以下三种情况中的一种: 1)处理程序将控制返回当前指令,即当事件发生时正在执行的指令. 2)处理