扫描二维码 上传二维码
选择防红平台类型,避免链接被拦截
选择允许访问的平台类型

小程序链接生成器,快速获取小程序URL地址

启动一个程序时,你的电脑在背后其实做了大量工作。理解这些底层机制,能帮助我们更好地认识计算机系统是怎么运行的。



程序刚启动时,静静地躺在磁盘上,是个包含机器指令和数据的可执行文件。双击图标后,操作系统会把这个文件加载到内存中。但这里有个容易被忽略的细节:程序里使用的地址,和实际访问的内存地址,往往不是一回事。

源代码里写的那些地址,程序员称之为逻辑地址,或者虚拟地址。这是站在程序员的视角看到的内存位置。而计算机实际使用的物理内存,每个单元都有自己真实的地址编号。从逻辑地址变形成物理地址,这个过程叫地址重定位。

为什么要这么麻烦?原因很简单:内存空间是有限的,但同时运行好几个程序,谁也不能互相打扰。如果程序能直接访问物理地址,一个写错就可能把别人的数据给覆盖了,甚至可能搞崩整个系统。早期的计算机就是这样,程序之间经常抢地址,病毒也能随便乱逛,想想都危险。

为了解决这些问题,现代计算机在程序和物理内存之间加了层虚拟地址空间。



地址重定位有两种方式。静态重定位发生在程序运行之前——操作系统加载程序时,把所有地址都加上一个偏移量。这种方式简单,但缺点明显:程序必须占着一大块连续内存,加载后就动不了了。动态重定位则灵活得多,它在程序运行过程中实时转换地址,靠的是专门的硬件——重定位寄存器。每次访问内存时,硬件自动把逻辑地址和寄存器里的值相加,得到真正的物理地址。这样一来,程序在内存里可以随便挪动,多个程序还能共享同一份代码,内存利用率大大提高。现在的操作系统基本都用的这种方式。

虚拟内存更近一步,把程序的地址空间切成固定大小的页面,再映射到物理内存的帧上。程序运行时,不需要把所有页面都塞进内存。硬件会通过页表来维护虚拟页面和物理帧之间的对应关系。当程序访问某个虚拟地址时,硬件先看看这个页面在不在内存里——在的话就正常转换,不在的话就触发页面错误,操作系统去磁盘把缺失的页面调进来,然后重新执行刚才失败的指令。这种按需调页的机制,让程序能使用比实际物理内存大得多的空间。哪些页面在内存、哪些在磁盘,程序本身不用操心,操作系统会帮忙处理得妥妥的。

程序加载时,操作系统会读取可执行文件里的入口地址,把第一条指令的地址送到程序计数器里。CPU根据程序计数器的值去内存取指令,执行完一条后,程序计数器自动指向下一条。遇到跳转指令时,目标地址会被写进程序计数器,从而改变执行流程。



从加载到地址转换,再到指令的取指执行,整个过程一环扣一环,离不开硬件和操作系统的精密配合。正因为有这些底层机制的支持,上层应用才能稳定高效地运行,我们才能流畅地使用各种软件。