在学习计算机组成原理的时候,我们对虚拟地址空间有了初步理解,了解了页表是怎么进行虚拟空间地址与物理地址之间的映射。我们怎么通过虚拟地址去找物理地址。而在计算机操作系统中,我们又知道了虚拟空间地址是操作系统虚拟出的一片空间地址,操作系统是根据硬盘中的数据地址到虚拟空间中的数据地址进行虚拟的空间地址。也就是说,操作系统是可以根据虚拟地址去找到硬盘中对应的地址存储的数据的。那么一个放在硬盘的程序到底是怎么在CPU上面运行的呢?我相信很多同学都有这个疑问,那么今天我就拿我最爱玩的NBA2K26来给大家详细解释一下。

我的电脑是天选5,16G的内存,而2K足足120G的容量。我是不可能把整个游戏都放在内存上去运行的,我的120G的游戏本体完全的存储在SSD(固态硬盘)上面。但是CPU只能直接读写主存,无法直接读取SSD,那么我们是怎么打开游戏,在游戏里展示华丽的过人,强硬的爆扣的呢?

当我们在Steam上面点击开始游戏时,OS(操作系统)会开辟一块完整的独立的虚拟地址空间,接着,游戏的代码段,数据段,贴图资源区会映射到这片虚拟地址空间的对应虚拟地址区间,注意,虚拟地址空间是不存数据的,它就只是一个对应关系。OS为这个新的进程创建该进程专属的独立页表,此时绝大多数虚拟页面并没有完整的页表项,也就是没有绑定物理内存。

进入游戏,MP出现在球馆中。这时CPU执行代码,访问一块虚拟地址。CPU将该虚拟地址送到MMU,MMU拆分虚拟地址:分出虚页号+业内地址。然后根据当前进程的CR3寄存器找到游戏进程的页表,根据虚页号找到页表项,发现是有效位为0,此时缺页中断发生。CPU此时会进入内核态,交给操作系统去处理中断。

这时OS会根据虚拟地址找到其对应的硬盘位置,向硬盘发起I/O请求,把硬盘的这一页数据存储到内存中的空闲页框中,然后更新页表,把该物理内存的物理页号写到对应的页表项中。中断处理结束,CPU继续执行刚才那条指令。而后,如若CPU需要再次访问这个虚拟地址,就可以直接去页表找到其对应的物理地址,就可以从主存中读取数据了。

那么当我们持续进行游戏时,我们的16G内存会被各种贴图数据,各种程序占满。此时,主存中已经没有了空闲的物理页框,那么当我们需要加载新的地图时,CPU去访问虚拟地址查页表发生缺页中断,然后操作系统会用LRU算法,把最长时间没有被调用的物理页框给置换出来,这些就是计算机组成原理里面的内容了。

OK,这就是这片文章的内容了,希望对大家理解存储系统有一定帮助,如果反响还不错,我将在下一篇讲解进程是怎么被创建的。

 

 

 

 

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐