赞
踩
注:本文使用的所有截图均来自于网易公开课课程
开机的时候,内存里的bios先进行外设的自检,然后从硬盘加载bootloader到内存,然后指令转到bootloader的地址,然后再把操作系统加载到内存里,然后指令转到操作系统的地址,由操作系统接管整个机器。
中断(interrupt):来源于外设,系统调用(system call)和异常(exception)来源于应用程序。处理时间:中断异步,异常同步,系统调用异步或同步,同步指你知道这里会发生,异步指你在等待,不知道这里会不会发生。响应:中断,持续,异常,杀死或重新执行,系统调用:等待和持续。
产生中断或者异常,由哪个位置服务呢?我们有个表,一侧称为key,是中断号或者异常号,给他编号可以区分不同的外设的中断,每个编号有个地址,收到中断,查中断表,直接转到地址去执行指令。程序的保存与恢复:中断后程序回到之前状态执行。
硬件:外设产生中断标记,cpu看到标记可以得出是哪号中断,可以得到一个具体的中断号,把中断号发给操作系统。
软件:保存被打断的现场+中断服务程序处理+清除中断标记+恢复之前保存的处理状态。
异常编号,保存现场,异常处理(杀死产生异常的程序或者重新执行异常指令),恢复现场后,重点是,这里可能会修复异常指令后重新执行指令
系统调用接口:操作系统给应用程序提供服务。
如:应用程序代码printf触发系统调用write,包括显示设备和显示内容,获取信息后就会去执行。
操作系统有各自的高级API,应用程序一般直接调用这些高级API,比如win32API用于windows,java API用于JAVA虚拟机(jvm),POSIX用于POSIX-based system(包括unix,linux,macosx),JVM是虚拟在windows和posix上的。
Interface(应用程序通过library库访问) –> 触发从用户态到内核态的转变(用户态:特权级低,不能访问特权指令和IO指令,内核态:特权级高,可以访问所有的指令,控制权从应用程序交到操作系统 -> 从系统调用ID号,等参数做标识,从而识别并完成对应服务。函数调用:一个堆栈内完成;系统调用,不同堆栈完成
CPU,内存,设备(I/O)
CPU访问的数据包括指令和数据,从CPU往外:寄存器,cache,主存(即物理内存),磁盘(虚拟内存)
1. 抽象:应用程序不用考虑底层的东西,只要考虑一个连续的逻辑地址空间即可
2. 保护:内存中可同时运行多个不同的应用程序,可能会需要访问想同的内存空间,可能会破坏,需要隔离。
3. 共享:很多应用程序要共享数据,进程之间要交互,使得进程之间能够安全可靠地传递数据
4. 虚拟化:当内存不够的时候,把最需要内存空间的数据放到内存里,暂时不需要访问的数据可以放到硬盘里,硬盘分配出一块虚拟空间。
CPU运行程序时,要把两个部分放到内存中:
(1) 程序本身 (2)程序要使用的数据
操作系统管理内存必须高度依赖硬件
主存和硬盘,和硬件直接对应,管理和控制由硬件完成。
一个运行的程序看到的内存空间(程序没有直接访问硬盘的权限,需要通过操作系统转化地址,并且方便应用程序自身的访问和控制)是一个简单的一维数据空间。两者形成映射。
对一个.c file从硬盘上创建编译汇编链接,再载入到内存中的全过程:(每个部分的逻辑地址都是只对它自己有意义)
1、一个c file,函数位置和变量名字就是它逻辑地址;
2、经过编译后得.s file,还是名字;
3、经过汇编,得到.o file,这时候,语句已经分布到一个它的一维的逻辑地址了,比如,jmp 75,指的是跳到逻辑地址为75的语句
4、再经过链接(多个文件),成为exe file,已经是可以执行但是目前还存放在硬盘里的程序,地址已经进行了全局的分布,不同的.o程序对应到了同一个一维逻辑地址的不同位置,从常规库开始分布,后面是各个文件语句的位置。
5、载入:放在硬盘中的exe文件,通过loader,loader也是一个应用程序,当程序被操作系统放到内存中去运行,loader在上面的逻辑地址加上一个偏移量,得到了内存中的逻辑地址。
1到5步,不需要操作系统参与,通过编译器,通过loader等,就可以完成,接下来,我们要把这个最终得到的内存中的逻辑地址转化成物理地址。
CPU有一个叫MMU,内存管理单元,里面有一块区域,表示了逻辑地址到物理地址的映射关系,也存在内存中的一个位置。我们查这个表,就能知道了。
流程:CPU执行一条指令,ALU部件需要发出请求这条指令的内容,参数就是逻辑地址,CPU就去查MMU中的映射表,如果有就找到了物理地址,如果没有就去内存的map中找,然后CPU的控制器给主存发出一个请求,需要这个物理地址的内容,主存通过总线把这个内容通过主线传到CPU,进行执行。操作系统完成的就是在这个流程之前,就建好逻辑地址到物理地址的映射关系。这个关系可以放在内存中,加快速度。
操作系统还要设置逻辑地址空间的基址和界限,以保证内存访问的正确性。超过界限,就抛出异常,按前述异常处理。
内存碎片:外碎片,程序分配的区域之间的碎片;内碎片:程序分配之内的碎片
操作系统把程序从硬盘加载到内存中去,需要分配一块空间,常用的分配策略:
首次适配first fit,最优适配best fit和最差适配worst fit
first fit:从零开始,找到的第一个能放得下的空间放它
best fit:最小的可以放得下的空间放它
worst fit:最大的可以放得下的空间放它
(一)压缩式碎片整理
重置程序以合并孔洞
要求所有程序是动态可重置的
(二)交换式碎片整理
运行程序需要更多的内存
抢占等待的程序&回收它们的内存
可以更好的利用碎片,需要从逻辑地址到物理地址的转换:软件方案带来开销太大,所以要和硬件进行结合。
主要方法:分段方法和分页方法。
如何寻址和怎么实现分段寻址机制?
和分段一样,也需要页号和页的偏移
把物理内存划分为固定大小的帧;把逻辑地址划分至相同大小的页
划分大小是2的幂,划分数量也是2的幂,这样就能把页号,帧号和页内偏移,帧内偏移都用二级制的位数来代替。
一个物理地址是二元组(f,o)f是帧号,共有2(f)个帧
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。