导航网站php,下载手机版app,招聘模板制作app,wordpress头部加导航目录
进程地址空间#xff0c;页表#xff0c;物理内存
什么叫作地址空间#xff1f;
如何理解地址空间的区域划分#xff1f;
地址空间结构体
为什么要有地址空间#xff1f;
页表
cr3寄存器
权限标记位
位置标记位
其他 每个存储单元是一个字节#xff0c;一…目录
进程地址空间页表物理内存
什么叫作地址空间
如何理解地址空间的区域划分
地址空间结构体
为什么要有地址空间
页表
cr3寄存器
权限标记位
位置标记位
其他 每个存储单元是一个字节一共有2^32个字节大概有4G。 栈往下走堆往上走。 static修饰的局部变量编译的时候会被编译到全局数据区。 如下图父子进程访问同一个变量子进程修改了一下变量如何做到同一个地址却读到了不同的内容 答因为这个地址不是物理地址这个地址是虚拟地址或线性地址平时语言用的地址都是虚拟地址。 进程地址空间页表物理内存
创建父进程时系统会创建对应的PCB进程对应的代码和数据会加载到内存同时PCB还能找到代码和数据。 创建父进程
实际上并没有这么简单创建父进程后有了PCB后系统还要为该进程创建进程地址空间页表。
进程用的地址是进程地址空间里面的虚拟地址。
页表存放的是虚拟地址和物理地址的映射。
假设定义一个变量那么系统要在物理内存中为这个变量开辟一个空间这个变量有一个物理地址和一个虚拟地址进程通过页表将虚拟地址转成物理地址实现访问。 创建子进程
如果这个父进程创建了一个子进程为了体现进程独立性子进程会拷贝父进程的PCB进程地址空间页表。
子进程的PCB大部分值和父进程一样少部分需要自己修改。
进程地址空间和父进程一样所以虚拟地址也一样。
页表和父进程一样所以能实现数据共享代码共享因为虚拟地址物理地址和父进程都一样。
字进程修改数据
当子进程要修改数据时如果系统发现这个位置的数据是和父进程共享的那么此时系统会自动进行写时拷贝也就是在物理内存上另开辟一个新的空间然后当前值拷贝过去然后修改页表对应的物理地址此时再允许你写入这个过程不会影响虚拟地址。 什么叫作地址空间
地址总线排列组合形成的范围就是地址空间在32位计算机中地址总线有32位从全0到全1有2的32次方种组合每一种组合可以标识一个字节所以这个空间大约有4G。 如何理解地址空间的区域划分
假设小胖和小花是同桌中间有一条38线划分了他们的区域只需记录这块区域的起始位置和结束位置就可以划分这段区域。 划分区域的变大变小只需要调整起始位置或结束位置的数值即可。 小胖的空间范围是1到50他可以访问范围内的所有数据。在地址空间范围内每一个最小单位都有自己的地址都可以被小胖直接使用。
所以进程地址空间本质是描述该进程可使用的范围空间大小地址空间存在各种区域划分划分方法是记录该区域的起始和结束位置。
地址空间结构体
地址空间本质是系统的一个结构体对象类似PCB地址空间结构体存放的是区域的起始结束位置。 进程创建时系统会创建PCB也会创建一个虚拟地址空间对象PCB有个指针可以找到这个对象。 为什么要有地址空间
物理地址空间只有一个虚拟地址空间每个进程都有一个进程申请空间系统就给每个进程都以为自己拥有全部的地址空间。 第一个原因虚拟地址空间可以让进程以统一的视角看待内存。 第二个原因虚拟地址空间可以让进程访问内存时有一个虚拟地址转化物理地址的过程在这个过程可以对寻址请求进行审查异常访问直接拦截从而保护了物理内存。 第三个原因地址空间和页表将进程管理模块和内存管理模块解耦。 页表
cr3寄存器
CPU有个cr3寄存器里面保存着页表的起始地址。进程切换时会把这个地址带走所以不用担心找不到自己的页表。 权限标记位
页表还有第三个位置是标记位代表访问区域的读写权限如果你向一个只读区域进行写操作就会被拦截。
所以说为什么代码段字符常量区是只读的难道第一次写入不是写入吗 因为写入物理内存时没有读写要求而当你用虚拟地址访问时页表有标志位判断该位置的读写权限。 位置标记位
页表还有一个标志位表示对应的代码和数据在磁盘还是在内存。当我们读取虚拟地址时先看标志位如果在内存就直接访问物理地址如果在磁盘就会触发缺页中断系统会把对应的数据加载到内存里并建立虚拟地址和物理地址的映射然后重新访问。
惰性加载方式虚拟地址先填上物理地址不填需要时再填上。
所以创建进程时系统先给你创建PCB虚拟地址空间页表但是对应的代码和数据不给你加载到内存等你要访问时再进行缺页中断惰性加载从而实现边使用边加载。 其他
命令行参数的空间在栈的上面。 父子进程虚拟地址一样物理地址不同修改数据只会改变页表右侧的地址。