所有进程共享同一物理内存,每个进程只把自己目前需要的虚拟内存空间映射并存储到物理内存上。
在每个进程创建加载时,内核只是为进程“创建”了虚拟内存的布局,具体就是初始化进程控制表中内存相关的链表,实际上并不立即就把虚拟内存对应位置的程序数据和代码拷贝到物理内存中,只是建立好虚拟内存和磁盘文件之间的映射(叫做存储器映射),等到运行到对应的程序时,才会通过缺页异常,来拷贝数据。还有进程运行过程中,要动态分配内存,比如malloc时,也只是分配了虚拟内存,即为这块虚拟内存对应的页表项做相应设置,当进程真正访问到此数据时,才引发缺页异常。
在内核态申请内存比在用户态申请内存要更为直接,它没有采用用户态延迟分配内存技术。内核认为一旦有内核函数申请内存,那么就必须立刻满足该申请内存的请求,并且这个请求一定是正确合理的。相反,对于用户态申请内存的请求,内核总是尽量延后分配物理内存,用户进程总是先获得一个虚拟内存区的使用权,最终通过缺页异常获得一块真正的物理内存。vmalloc()的内存分配原理与用户态的内存分配相似,都是通过连续的虚拟内存来访问离散的物理内存,vmalloc()申请物理内存时是立即分配的,因为内核认为这种内存分配请求是正当而且紧急的。
————————————————
版权声明:本文为CSDN博主「Linux内核站」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/youzhangjing_/article/details/124410703
为了能够让1G的内核线性地址空间能够管理4GB大小的物理内存,内核将 1GB 线性地址空间分为了 3 部分:物理页面映射区域(896MB),对物理内存的ZONE_DMA、ZONE_NORMAL 进行连续直接映射;安全保护区域(8MB);内核地址空间(120MB),目的是临时(用完即释放)映射物理内存的ZONE_HIGHMEM(896MB~4GB)。
- 复制链接
- 举报