文章目录
- 硬件支持系统 系统管理硬件
- 异步行为
- 中断的分类
- 同步行为
- 虚拟地址空间
- shell
- 系统调用与软中断
- 区分系统调用
- trace 命令
硬件支持系统 系统管理硬件
计算机硬件由三样东西组成:CPU、内存、I/O设备。为了更有效地管理这些硬件资源,系统设计者引入了抽象的概念,其中最为核心的三大抽象便是进程、虚拟内存与文件。
- 将磁盘和I/O设备抽象成文件,统一由对应文件来访问对应设备。
- 将内存与文件统一规划为虚拟地址空间来屏蔽了下层细节。
- 最后将CPU资源与虚拟地址封装给进程,为进程服务。
异步行为
异步分为两种:软件异步和硬件异步。他们的流程都是一样的。
当程序正在执行时,发生了一个错误导致未能正常运行,这个就叫中断。
- a.1:中断来临时,第一件事就是保护现场。主要是三样东西:
- PC指针:必须由硬件(CPU)来做,因为如果用软件做的话,PC值已经跳转到软件的地址,而非中断地址。
- PSW寄存器:由于在跳转时PSW数据不会改变,所以由OS来做。
- 基础寄存器:同样由OS做。
- 现在的CPU也将PSW和基础寄存器的保护一并做了。
- a.2:中断向量表
- 根据不同的中断信息,查表找到对应的中断处理函数的入口。
- 这个表由OS来制定,不同的系统有不同的表。
- 现在的部分CPU也可以提供这个表。
- a.3:中断处理函数
- 由OS准备。
- a.4:中断返回
- 区别于普通函数的返回(例如C的return),这个返回需要我们将数据重新写回寄存器,还原现场,显然普通返回做不到,所以就有了特定的汇编语言写的返回。
- 这个返回由OS来写。
- 现在的部分CPU也能做。
中断的分类
中断分两类:
- 程序主动发出的中断:异常处理
- 由程序写死的,固定发生的情况。
- 例如:
int a = 10 / 0;
- 系统调用,访问内存缺页的情况。
- 硬件被动发生的中断:外部中断
- 由外部设备或系统硬件主动向CPU发出的中断信号,无法预测什么时候发生的事件。
同步行为
同步就是程序的顺序执行过程。
- func1()开始执行:
- 栈中记录下a, b的数据。
- 保护数据(PC、PSW、普通寄存器)
- 跳转到a1():
- 记录x1, x2数据。
- 执行完毕。
- 函数返回:
- 普通函数数据保护(共两样):
- PC值:
- 之前压栈保存,现在将无关数据弹栈,直到发现指令地址,将其赋给PC。
- 同样,因为PC值会变,所以由硬件来进行保护。
- 基础寄存器:
- 因为是应用程序,所以由 编译器 进行保护。
PSW:- 用不到之前的状态,不需要保护。
- PC值:
- 普通函数数据保护(共两样):
虚拟地址空间
从操作系统层级上看,虚拟地址空间主要分为两个部分内核区和用户区。
- 内核区:
- 常驻内存,是操作系统的一部分。
- 用户区(内存四区):
- 代码区(.text):通常用于存放程序的执行代码(即CPU执行的机器指令),代码段一般情况下是只读的,这是对执行代码的一种保护机制。
- 数据区(.data):存放程序中已初始化且初值不为0的全局变量和静态变量。数据段属于静态内存分配(静态存储区),可读可写。
- 堆区(.heap):存放运行时动态申请的内存,由程序员管控。
- 堆中内容是匿名的,不能按名字直接访问,只能通过指针间接访问。
- 堆向高地址扩展(即“向上生长”),是不连续的内存区域。这是由于系统用链表来存储空闲内存地址,自然不连续,而链表从低地址向高地址遍历。
- 栈区(.stack):存放局部变量,由编译器管控。
- 跟堆区相反,内存向下生长,内存连续。
更多详细内容:文件描述符 - 1.2 分区
shell
shell是封装在OS之上的一种软件,提供了一系列指令给操作者来对OS进行操作。
系统调用与软中断
程序在执行时,会有对硬件进行操作的需求,但是程序在用户空间执行,不能直接对内核区的硬件进行操作,所以就需要系统调用帮忙。
- 系统调用是用汇编语言写的指令,封装成接口供程序使用。
- 调用系统调用时,进行了模式的切换:
- 主动放弃用户模式,转而进入内核模式执行某些特权操作。
- 软中断:
- 软中断是由用户程序主动触发的,与硬件中断不同。
- 在调用系统调用时,程序通常会触发一个软中断(如使用INT指令),这会中断当前的程序执行,将控制权转移到操作系统的内核。
区分系统调用
那么多系统调用,如何分辨要执行哪一个呢?
- 在软中断信号中,含有号码,这个号码CPU不进行解析,CPU只读取到这是软中断,然后交由OS解析,OS根据号码执行对应的系统调用。
trace 命令
trace ./a,out
追踪执行程序时使用的系统调用。