linux程序启动过程
系统会创建一个执行该程序的进程,然后装载程序或程序片段等,然后开始顺序执行代码段。在这个过程中,操作系统总的来说做三件事情:
(1) 为进程创建一个独立的虚拟地址空间(范围)
例如在32位系统常规分页状态下,操作系统发现待执行程序的指令和数据总和为32KB,那么操作系统会为进程分配8个页的虚拟内存空间,并分配页目录和页表,把页目录装入CR3,把进程用到的页表加载到内存。但并不把指令和数据加载到内存。
(2) 读取程序可执行文件文件头,并且建立虚拟空间与可执行文件中的代码段、数据段的逻辑地址的映射关系
这一步将程序指令和数据映射到虚拟内存空间中。
(3) 将 CPU 的指令寄存器设置成可执行文件的入口地址,启动运行
执行程序过程时,如果当前指令或数据之在虚拟地址空间中,而实际上并不在物理内存中(前两步都没有将指令或数据加载到物理内存),将发生页错误,这 时操作系统再从物理内存分配一个空闲的物理页帧,并将虚拟地址页对应的数据从磁盘拷贝加载到物理页帧中,并建立页表项和页帧的映射关系。随着进程的执行, 页错误也会不断产生,操作系统也会响应每个页错误并为进程分配物理内存页帧。但物理内存是有限的,为一个进程可分配的物理内存也有限。全部可用物理内存都 分配给进程后,如果进程继续抛出页错误请求更多物理内存,这时候操作系统根据自身的页置换操作算法,在保证进程正常运行的前提下,将先前为进程分配的物理 内存页帧收回,重新分给该进程。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】博客园2025新款「AI繁忙」系列T恤上架,前往周边小店选购
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Hangfire Redis 实现秒级定时任务,使用 CQRS 实现动态执行代码
· Android编译时动态插入代码原理与实践
· 解锁.NET 9性能优化黑科技:从内存管理到Web性能的最全指南
· 通过一个DEMO理解MCP(模型上下文协议)的生命周期
· MySQL下200GB大表备份,利用传输表空间解决停服发版表备份问题
· .NET周刊【4月第1期 2025-04-06】
· 国产的 Java Solon v3.2.0 发布(央企信创的优选)
· 工良出品 | 长文讲解 MCP 和案例实战
· 多年后再做Web开发,AI帮大忙
· centos停服,迁移centos7.3系统到新搭建的openEuler
2015-09-10 poj_1182 并查集
2015-09-10 poj_1988 并查集
2015-09-10 poj_1161 并查集