虚拟地址空间
参考:
https://sylvanassun.github.io/2017/10/29/2017-10-29-virtual_memory/
地址空间:非负整数地址的有序集合,如
{0,1,2,...}{0,1,2,...}
线性地址空间:如果地址空间中的整数是连续的,则称为线性地址空间
虚拟地址空间:在一个带虚拟内存的系统中,如果CPU用n位2进制数表示虚拟地址,则该连续的虚拟地址形成的范围
(0,1,..2^n-1)(0,1,..2n?1)称为“虚拟地址空间”
{0,1,2,...,2^n-1}{0,1,2,...,2n?1}
例如linux系统中用32位来表示虚拟地址,则虚拟地址空间为
{0,1,2,...,2^{32}-1}{0,1,2,...,232?1},大小为4GB.
虚拟内存:一种对物理内存的抽象概念,可以理解为一个连续的字节组成的数组,每个字节都用一个虚拟地址表示,一个系统所有的虚拟地址组成了虚拟地址空间。
虚拟内存为每个进程提供了一个一致的、私有的地址空间,它让每个进程产生了一种自己在独享主存的错觉(每个进程拥有一片连续完整的内存空间)
物理地址空间:真实物理内存单元的地址,是硬件电路通过地址总线去寻址的空间,物理上是高低电位,对应0/1表示。
------------------------------------------------------参考《深入理解计算机系统》
Linux整体架构图
linux内核控制并且管理硬件资源,包括进程的调度和管理、内存管理、文件系统管理、设备驱动管理、网络管理等等。并且提供应用程序统一的系统调用接口
Linux虚拟内存
Linux中每个进程都有自己独立的4G虚拟内存空间,各个进程的内存空间具有类似的结构。这4GB的虚拟地址空间划分成两个部分:内核空间和用户空间
Linux中每个用户进程都有自身的虚拟地址范围(用户空间),从0到TASK_SIZE。用户空间之上的区域(从TASK_SIZE到
2^{32}232)保留给内核专用(内核空间),用户进程不能访问。TASK_SIZE是一个特定于计算机体系结构的常数,把地址空间按给定比例划分为两部分。linux的用户空间为3GB(用户进程自己使用),内核空间为1GB(被所有进程共享)
一个新进程建立的时候,内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体,task_struct中有一个struct mm_struct指针,mm_struct结构体抽象了进程自己的虚拟地址空间。
参考:https://www.cnblogs.com/Rofael/archive/2013/04/13/3019153.html</