Oasis's Cloud

一个人的首要责任,就是要有雄心。雄心是一种高尚的激情,它可以采取多种合理的形式。
—— 《一个数学家的辩白》

程序是怎么跑起来的

程序加载与内存节约

作者:oasis


程序如何运行

程序文件存储在硬盘中;执行时先进入内存,CPU 从内存中读取指令和数据来完成取指、译码、执行。

资料:ELF 手册页

如何将程序从磁盘加载进内存

对于 C 程序,编译后可得到一个 .out 文件,该文件在 Linux 中是按照 ELF 规范生成的。

程序加载器会读取 ELF 标准的文件,解析 Program Headers,操作系统为该程序分配虚拟地址空间。

分配虚拟地址空间,不代表程序被完整地加载进内存。当第一次访问某页时,如果该页不在物理内存中,CPU 会触发缺页异常,内核进行处理:检测访问合法性、从磁盘读取或复用缓存等,更新页表,并重新执行指令。

(这里需要看 x86 的实现)

节约内存的方式

通过 DLL 文件共享函数,程序运行时动态链接该文件,多个程序可以同时共用一个 DLL 文件,从而只开辟一块内存空间,节约内存用量。

通过 stdcall 将清理栈的工作交给被调用方,从而减少调用方编译后产生的重复清理指令。