《信息安全系统设计基础》 第十一周学习总结
20145224 《信息安全系统设计基础》第十一周学习总结
教材学习内容总结
•从给处理器加电开始,直到断点为止,程序计数器假设一个值的序列a0,a1,……,an-1 ,每个ak是某个相应的指令Ik的地址,每次从ak到ak+1的过渡称为控制转移,这样的控制转移序列叫做处理器的控制流
•异常控制流ECF:现代系统通过使控制流发生突变来对这些情况作出反应
异常
•异常是异常控制流的一种形式,它一部分是由硬件实现的,一部分是有操作系统实现的
•异常就是控制流中的突变,用来响应处理器状态中的某些变化
•状态变化成为事件
•当处理器监测到有时间发生时,通过一张叫做异常表的跳转表,进行一个间接过程调用,到一个专门设计用来处理这类事件的操作系统子程序
•当异常处理程序完成处理后,根据引起异常的事件的类型,会发生以下三种情况的一种:
①处理程序将控制返回给当前指令Icurr,即当事件发生时正在执行的指令
②处理程序将控制返回给Inext,即如果没有发生异常将会执行的下一条指令
③处理程序终止被中断的程序
•系统中可能的每种类型的异常都分配了一个唯一的非负整数的异常号
•异常号是到异常表中的索引,异常表的起始地址放在一个叫做异常表基址寄存器的特殊CPU寄存器里
•异常的分类:中断、陷阱、故障和终止
进程
•异常是允许操作系统提供进程的概念所需要的基本构造块
•进程的经典定义就是一个执行中的程序的实例
•进程提供给应用程序的关键抽象:
一个独立的逻辑控制流,独占地使用处理器
一个私有的地址空间,独占地使用存储器系统
•唯一的对应于包含在程序的可执行目标文件中的指令,或者是包含在运行时动态链接到程序的共享对象中的指令。这个PC值的序列叫做逻辑控制流,简称逻辑流
•并发流:一个逻辑流的执行在时间上与另一个流重叠
多个流并发地执行的一般现象成为并发
一个进程和其他进程轮流运行的概念称为多任务
一个进程执行它的控制流的一部分的每一时间段称为时间片,多任务也叫时间分片
•并行流:如果两个流并发的运行在不同的处理器核或者计算机上
•当设置了位模式,进程就运行在内核模式中
•没有设置位模式时,进程就运行在用户模式中
•上下文就是内核重新启动一个被抢占的进程所需的状态
•调度:内核可以决定抢占当前进程,并重新开始一个先前被抢占的进程
•上下文切换机制:
①保存当前进程的上下文
②恢复某个先前被抢占的进程被保存的上下文
③将控制传递给这个新恢复的进程
进程控制
•每个进程都有一个唯一的正数的进程ID
•进程总处于三种状态
①运行:进程要么在CPU上执行,要么在等待被执行且最终会被内核调度
②停止:程序的执行被挂起,,且不会被调度
③终止:进程用永远停止了。终止原因:1)收到一个信号,默认行为是终止进程;2)从主进程返回3)调用exit函数
•fork函数调用一次,返回两次
•当一个进程由于某种原因终止时,进程被保持在一种已终止的状态中,直到它被父进程回收
•一个终止了但还未被回收的进程称为僵死进程
•一个进程可以通过调用waitpid函数来等待它的子进程终止或者停止
•错误条件
①如果调用进程没有子进程,那么waitpid返回-1,并且设置errno为ECHILD
②如果waitpid函数被一个信号中断,那么返回-1,并设置errno为EINTR
•sleep函数:将进程挂起一段指定的时间
•pause函数:让调用函数休眠,直到该进程收到一个信号
•execve函数:在当前进程的上下文中加载并运行一个新程序,且调用一次从不返回
•getenv函数:在环境数组中搜素字符串“name =VALUE”,如果找到了,就返回一个指向value的指针,否则它就返回NULL
信号
•一个信号就是一条小消息,它通知进程系统中发生了一个某种类型的事件
•发送信号的两个不同步骤:
发送信号:内核通过更新目的进程上下文中的某个状态,发送一个信号给目的进程
发送信号的两个原因:
1)内核监测到一个系统事件,比如被零除错误或者子进程终止
2)一个进程调用了kill函数,显式地要求内核发送一个信号给目的进程。一个进程可以发送信号给它自己
接收信号:信号处理程序捕获信号的基本思想
•一个只发出而没有被接收的信号叫待处理信号
•每个进程都只属于一个进程组,进程组是由一个正整数进程组ID来标识的
•一个子进程和它的父进程同属于一个进程组
•进程通过调用kill函数发送信号给其他的进程
•当内核从一个异常处理程序返回,准备将控制传递该进程p时,它会检查进程p的未被阻塞的待处理信号的集合
•信号处理问题
①待处理信号被阻塞
②待处理信号不会排队等待
③系统调用可以被中断
非本地跳转
•非本地跳转不需要经过正常的调——返回序列
•非本地跳转是通过setjmp和longjmp函数来提供的
• setjmp函数只被调用一次,但返回多次
•longjmp函数被调用一次,但从不返回
教材学习中的问题和解决过程
教材中介绍了教材中错误处理包装函数定义在一个叫做csapp.c
的文件中,他们的原型定义在一个叫做csapp.h
的头文件中,所以要想正确编译课本代码应使用gcc include/csapp.c include/csapp.h src/week11/fork.c -o bin/fork
,但是会产生以下错误提示:
应该是系统没有找到函数中包含的相应函数,于是我将对应的函数都注释了再编译的时候就可以了。
本周代码托管链接
https://git.oschina.net/Kevin_s/Linux_C.git
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目 标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 18/38 | |
第三周 | 500/1000 | 3/7 | 22/60 | |
第四周 | 300/1300 | 2/9 | 30/90 |