20165218 2018-2019-1 《信息安全系统》第八章学习总结
教材学习内容总结
异常
- 异常的四个类别:中断、陷阱(和系统调用)、故障、终止
- C程序用
syscall
函数可以直接调用任何系统调用
进程
- 异常是允许操作系统内核提供进程概念的基本构造快
- 系统中的每个程序都运行在某个进程的上下文中。上下文是由程序正确运行所需的状态组成。这个状态包括存放在内存中的程序的代码和数据,它的栈、通用目的寄存器的内容、程序计数器、环境变量以及打开文件描述符的集合。
- 并发和并行
每个私有地址空间都具有相同的通用结构,Linux进程的地址空间的组织结构
- 代码段 .text:这是CPU执行的机器指令部分。通常正文段是共享的,而且是只读的,以防止程序修改其自身的指令。总是从地址0x400000开始。
- 数据段 .data。数据段包含了程序中需要明确赋初值的变量。
- 非初始化数据段 bss。bss 起始于 IBM 704汇编语言中的 Block Storage Start 指令的首字母缩写,并且沿用至今。
- 运行在内核模式中的进程可以执行指令集中的任何指令,并且可以访问系统中的任何位置;用户模式中的进程不允许执行特权指令
graph LR
A[用户模式]-->|异常|B[内核模式]
进程控制
获取进程ID
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void); //返回进程的PID
pid_t getppid(void); //返回父进程PID
终止进程
- 进程总处于运行、停止(挂起)、终止三种状态之一。
#include <stdio.h>
void exit(int status);
//status=0 进程正常终止;status=1或-1,进程异常退出
fork()函数创建子进程
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
fork()函数调用一次,返回两次。在父进程中,fork返回子进程PID,在子进程中,fork返回0。若调用了n次fork,则返回2^n次。
回收子进程
#include <sys/types.h>
#include <wait.h>
pid_t waitpid(pid_t pid, int *statusp, int options);
进程休眠
#include <unistd.h>
unsigned int sleep(unsigned int secs);//secs为请求休眠的时间
如果请求的时间已经到了,返回0,否则返回剩下的秒数。
加载并运行程序
#include <unistd.h>
int execve(const char *filename, const char *argv[], const char *envp);
代码调试中的问题和解决过程
- 问题1:在编译含有头文件
#include <csapp.h>
的代码时,提示找不到头文件。 - 问题1解决方案:经查资料发现"csapp.h"和"csapp.c"是本书作者自己编写的,网上大部分资料下载都需要积分,最后在《深入理解计算机系统》中"csapp.h"无法识别问题中找到了源代码,下载后根据深入理解计算机中的 csapp,h和csapp.c的指导操作即可。编译时要在最后加上
-lpthread
.