Linux_进程地址空间

我们用c语言写的程序,经过编译后形成可执行程序存放在硬盘。当运行该程序时,操作系统将该程序加载到内存中,创建进程控制块,变为进程,然后开始执行该程序。大家是否想过,操作系统是如何加载的呢;我们在程序中使用的地址,是否是内存地址呢;当程序所占空间大于内存时,又该如何,比如游戏100G,内存只有16G;这一切的答案都在进程地址空间中,下面我拿c/c++的程序地址空间来举例。

一.为什么要有程序地址空间呢?

如果没有进程地址空间,程序直接载入内存,这样就无法保证进程独立性。因为c语言的野指针问题,当内存暴露于程序当中,这样程序员就可以用指针随意访问内存,这样造成的危害是巨大的。故此,产生了进程地址空间。此时,程序看到的空间不是内存,使用的地址也不是内存地址,而是虚拟地址。于是,也就不存在访问其他进程的情况,保证了进程间独立性。

二.什么是进程地址空间?

2.1 进程地址空间概念

进程地址空间,即虚拟地址空间。一个进程运行时,它所认为自己管理的空间就是虚拟地址空间,一个进程地址空间的大小取决于计算机系统架构,比如32位机,进程地址空间为4GB。

2.2 c/c++进程地址空间的区域划分
2.3 进程地址空间的管理

在Linux中,需要对每个进程的进程地址空间进行管理,怎么管理?先描述再组织。进程地址空间本质Linux内核中的一个数据结构struct mm_struct{},对于每一个进程,都有自己的mm_struct,且其大小都一样,32位下都是4GB,4GB是进程可管理空间的大小。Linux中进程控制块task_struct中有一个成员指针,指向自己的进程地址空间。

cpp 复制代码
//内核中大致是这样描述进程地址空间的
struct mm_struct()
{
    long code_start;
    long code_end;
    long brk_start;
    long brk_end;
    long init_start;
    long init_end;
    //.....
}
1.4 虚拟地址到物理地址

我们的程序在编译时,编译器就按照程序地址空间的方式对程序进行划分,为代码和数据分配好了空间,这种文件的格式就是ELF格式。在程序中的每一条指令都有自己的地址,这个地址就是虚拟地址,在Linux中可以使用objdump -S file 进行反汇编查看。

当操作系统加载程序时,要为每一个程序创建task_struct,mm_struct ,页表...,而页表可以实现从虚拟地址转换为物理地址。每一个进程的入口地址(虚拟地址)是规定的,cpu通过入口地址经过页表转换为访问物理地址,同时读取物理地址空间的内容,即第一条指令。下面的页表只是一种简化情况,真实页表还有许多字段,比如权限位等等。

三.进程地址空间的作用

  1. 防止一个进程内部的指针随意访问,保护物理内存和其他进程。

如果没有虚拟地址空间,那么我们每个进程都是直接访问物理内存的,如果一个进程中出现了错误,导致访问了别的进程中的数据,这样就无法保证进程之间的独立性

  1. 将进程管理和内存管理进行解耦合

使程序员只需要关心自己程序而不用关心内存方面,可以大大增加开发的效率。因为程序员看到的是虚拟地址,而不是内存地址。

  1. 不用将一个大型程序一次载入内存,只要载入用到的部分即可

100G游戏,可能只会用到一部分功能,而其他功能的代码和数据不用载入内存,可以更好的利用内存。

  1. malloc相关

malloc之后,操作系统并不会立即分配空间,因为操作系统追求高效,当你使用该块空间的时候,继而为你开辟空间,怎么实现这样机制呢?使用的是缺页中断,即:将页表中只分配虚拟内存,等程序用该块空间的时候,分配物理内存,并且填充页表,建立完整映射关系。而这种方式得益于虚拟地址空间。

相关推荐
TG_yunshuguoji1 小时前
启动模板创建AWS EC2 Auto Scaling指南
服务器·云计算·aws
小糖学代码1 小时前
Linux:11.线程概念与控制
linux·服务器·c语言·开发语言·c++
YouEmbedded4 小时前
解码Linux文件IO目录检索与文件属性
linux·文件属性·文件io·目录检索
王道长服务器 | 亚马逊云5 小时前
AWS CloudWatch:服务器的“眼睛”,实时监控一切动向
服务器·数据库·aws
大聪明-PLUS8 小时前
关于新的 Linux 内核接口 gpio uapi 的说明
linux·嵌入式·arm·smarc
玉树临风江流儿8 小时前
Linux驱动开发总结速记
linux·运维·驱动开发
cccyi78 小时前
Linux 进程信号机制详解
linux·signal·volatile
七宝大爷8 小时前
GPU服务器深度解析:H100/H200的“机头”与“模组”架构详解
运维·服务器·架构·h100·h200
gd63213749 小时前
银河麒麟 aarch64 linux 里面的 qt 怎么安装kit
linux·服务器·qt
A-花开堪折9 小时前
Qemu 嵌入式Linux驱动开发
linux·运维·驱动开发