用户态和内核态的划分之前我们讲了用户态虚拟空间里面有几类数据,例如代码、全局变量、堆、栈、内存映射区等。第一种情况是函数的调用,涉及函数栈的改变,主要是改变栈顶指针。用户态虚拟空间分析完毕,接下来我们分析内核态虚拟空间。内核态的虚拟空间和某一个进程没有关系,所有进程通过系统调用进入到内核之后,看到的虚拟地址空间都是一样的。已经被用户态进程占用去了,你作为内核不能使用。
用户态和内核态的划分之前我们讲了用户态虚拟空间里面有几类数据,例如代码、全局变量、堆、栈、内存映射区等。第一种情况是函数的调用,涉及函数栈的改变,主要是改变栈顶指针。用户态虚拟空间分析完毕,接下来我们分析内核态虚拟空间。内核态的虚拟空间和某一个进程没有关系,所有进程通过系统调用进入到内核之后,看到的虚拟地址空间都是一样的。已经被用户态进程占用去了,你作为内核不能使用。
验证进程地址空间的基本排布理解进程地址空间进程地址空间是在进程和物理内存之间的一个软件层,它通过mm_struct这样的结构体来模拟,让操作系统给进程画大饼,每一个进程可以根据地址空间来划分自己的代码。C,操作系统就会给每一个进程画一张大饼,叫做当前进程的虚拟地址空间,其中会通过指针将进程和虚拟地址空间关联起来。
内存管理机制,下面深入学习物理内存管理和虚拟内存分配。看到这里你可能会想,有了伙伴系统这下总可以管理好物理内存了吧?别再说你不懂Linux内存管理了,10张图给你安排的明明白白!Linux内存管理是一个非常复杂的系统,本文所述只是冰山一角,从宏观角度给你展现内存管理的全貌,但一般来说,这些知识在你和面试官聊天的时候还是够用的,当然也希望大家能够通过读书了解更深层次的原理。
虚拟内存不仅仅使机器上的内存变多,内存管理子系统还提供以下功能:虚拟内存可以比系统中同样,硬件的虚拟内存机制允许内存区虚拟内存抽象模型x支持虚拟内存所使用的方法之前,考察一下抽象模型会有所帮助。在虚拟内存系统中以上所有的地址都是虚拟地址而不是物理地址。这些页表将每个进程的虚拟页映射到内存中的物理页。通过用这种方式映射虚拟地址和物理地址,虚拟内存能够以任何次序被映射到系统物理
下面来了解下Linux内存管理机制:要深入了解Linux内存运行机制,需要知道下面提到的几个方面:Linux进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存,Linux内核根据”最近最经常使用“算法,仅仅将一些不经常使用的页面文件交换到虚拟内存,有时我们会看到这么一个现象:Linux物理内存还有很多,但是交换空间也使用了很多。
Linux它是一款开源的内核系统。在Linux内核里,不区分进程与线程。因为这个结构包含了进程的内存信息。由于Linux内核默认开启MMU机制,所以只能以页为单位计算物理内存地址。其他方法可自行参考Linux内核源码/fs/proc/task_mmu.这个接口没什么技术含量,都是照抄Linux内核源码的代码,fsproctask_mmu.
Linux系统提供了复杂的存储管理系统,使得进程所能访问的内存达到4GB。在Linux系统中,进程的4GB内存空间被分为两个部分——用户空间与内核空间。用户进程只有通过系统调用(代表用户进程在内核态执行)等方式才可以访问到内核空间。Pro及以后的CPU允许内存最大可配置到64GB,它们具备36位物理地址空间寻址能力。
用于用户空间申请内存。在物理内存映射区之后,就是vmalloc区域。函数是带参数调用kmalloc函数,添加的参数是或了标志位__GFP_ZERO,vmalloc用于申请较大的内存空间,虚拟内存是连续。4、kmalloc、get_free_page和vmalloc的区别:我们用下面的程序来演示kmalloc、get_free_page和vmalloc的区别:malloc分配的是用户的内存。