十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

进程地址空间详解

进程地址空间详解 1.什么是进程地址空间我们之前已经学过进程的相关知识我们发现子进程和父进程虽然对于同一个变量可以做不同操作但是更重要的是我们发现他们的地址竟然都是一样的这跟我们之前所学的物理地址的概念是相悖的所以我们可以确定的是这个地址一定不是物理地址这种地址我们叫做虚拟地址/线性地址2.如何理解进程虚拟空间地址本质上是操作系统给进程画的一张大饼让每个进程都认为自己独占物理地址空间的全部大小进程的虚拟空间图但其实我们的进程虚拟空间地址就是内核数据结构对象类似于PCB我们叫做struct_mm_struct;进程虚拟地址空间本质上是一套逻辑上连续的地址编号虚拟地址Linux 内核里每个进程有一个 mm_struct它就是描述虚拟地址空间的结构体 里面存着一堆指针 / 范围mm_struct内核用来记录虚拟空间信息的管理结构体 不是虚拟地址空间本身3.如何理解进程虚拟空间地址的划分而进程虚拟空间的划分是在struct_mm_struct 内部维护很多的start,end的指针变量4.如何理解地址空间上的地址空间大小有4GB的空间大小为什么可以看下图4.1虚拟空间、进程、内存、页表的关系寄存器是 CPU内部高速存储单元虚拟地址空间是 OS 给进程的一套逻辑地址编号。二者不是包含关系是配合工作CPU 用寄存器保存虚拟地址交给 MMU 做地址翻译。关于为什么子进程和父进程虽然对于同一个变量可以做不同操作但我们发现他们的地址竟然都是一样的这个问题在父进程fork之后创建子进程子进程会拷贝父进程的tack_struct(PCB)创建一份新的虚拟空间这是操作系统为了骗进程而做的操作让每个进程都觉得自己拥有全部的虚拟空间4GB大小但其实具体分配多少是由操作系统决定的拷贝一下父进程的页表申请一块内存但是拷贝的时候有些数据是会修改的比如时间片等在我们不对父子进程一样的数据做修改时他们的数据是共享的一旦我们子进程或者父进程对这个数据做了修改操作系统就会立马对子进程或者父进程的页表上的映射的物理地址做修改虚拟地址不变这样拿同一个变量(变量本质就是虚拟地址)去通过页表找它存放在物理地址上的值时父子进程返回的值就会不相同这也就是为什么父子进程相互独立因为进程内核数据结构代码和数据内核数据结构PCB虚拟地址空间页表物理地址父子进程都有一份自己独属的而数据和代码也是4.2 页表中的标记位① rwx表示进程是否有对应权限也就是说操作系统会对你映射条目的权限进行检查② isexist你所指向的这段空间是否在物理空间当中这个其实是因为如果直接将很大的代码加载到物理内存中但是物理内存就呢么大很占空间因此将进程占有很大内存的代码先放置在磁盘中当上层通过页表映射需要访问具体的数据时isexist位的标记位为0时就让在磁盘上放置的数据交换到我们的内存中用来支持程序的分批加载也就是我们之前说的挂起等待的原理这也就是为什么我们的很大的APP(进程)可以跑的核心——分批加载所以为什么代码区域是只读的这其实是因为这段区域被设置为了只读的这也是为什么这个我们不能修改常量区呢为什么可以编过这是因为这个问题是操作系统只有在运行时才能发现的问题所以我们需要加入关键字const让编译器和操作系统的耦合度降低4.3再谈struct_mm_struct所有的结构体都需要初始化呢我们struct_mm_struct是如何初始化的呢可执行程序在编译的时候会记录我们的代码有多大这样我们的struct_mm_struct的初始化的时候也就知道了代码和数据有多大了其实也就是在编译的时候也会给我们的操作系统传一些值总结就是代码区未初始化数据区的属性磁盘在加载的时候可以从可执行程序的属性中来读取而堆区、栈区、命令行参数、环境变量在我们程序编译的时候这些数据就已经不存在了在加载进程的时候操作系统动态创建的堆区申请的空间本质是申请物理内存吗其实只是操作系统把堆区的虚拟地址空间进行划分也就是end就行当你需要使用的时候才会给你物理空间4.4 虚拟地址空间页表①最大的作用其实是保护内存② 将进程管理和内存管理解耦合了③让进程以统一的视角看待物理内存也就是说代码和数据可以放置在内存的任何位置这样就可以让数据无序变有序因为有虚拟地址映射④值得注意的是每个进程都有一个对应的虚拟地址空间进程在虚拟地址空间才在进程没有了也就没有虚拟地址空间了他们是强绑定的所以OS管理好了进程PCB就相当于管理好了虚拟空间地址因为在PCB中有虚拟空间的地址⑤所以全局变量不是在程序运行的时候一直可以使用的而是在进程运行时一直可以使用的4.5什么叫做野指针因为野指针是只有虚拟空间地址没有对应的物理地址或者指向了别人的物理地址物理地址我们是看不到的我们看到的是虚拟地址
返回列表