今天遇到一个面试题,面试官问linux系统为什么0-3G给用户,3-4G给内核?为什么不是2:2分配呢?为什么不给内核分配500M呢?
求高人解答啊。我觉得这就是当时编写内核时规定的吧,这个问题让人匪夷所思啊。
所有进程都必须占用一定数量的内存,这些内存用来存放从磁盘载入的程序代码,或存放来自用户输入的数据等。内存可以提前静态分配和统一回收,也可以按需动态分配和回收。
对于普通进程对应的内存空间包含5种不同的数据区:
代码段
数据段
BSS段
堆:动态分配的内存段,大小不固定,可动态扩张(malloc等函数分配内存),或动态缩减(free等函数释放);
栈:存放临时创建的局部变量;
Linux采用虚拟内存管理技术,网页链接 一起学习linux, 每个进程都有各自独立的进程地址空间(即4G的线性虚拟空间),无法直接访问物理内存。这样起到保护操作系统,并且让用户程序可使用比实际物理内存更大的地址空间。
4G进程地址空间被划分两部分,内核空间和用户空间。用户空间从0到3G,内核空间从3G到4G;
用户进程通常情况只能访问用户空间的虚拟地址,不能访问内核空间虚拟地址。只有用户进程进行系统调用(代表用户进程在内核态执行)等情况可访问到内核空间;
用户空间对应进程,所以当进程切换,用户空间也会跟着变化;
内核空间是由内核负责映射,不会跟着进程变化;内核空间地址有自己对应的页表,用户进程各自有不同额页表。
虚拟内存 转化为 真实物理内存:
虚拟进程空间:通过查询进程页表,获取实际物理内存地址;
虚拟内核空间:通过查询内核页表,获取实际物理内存地址;
物理内存映射区:物理内存映射区与实际物理去偏移量仅PAGE_OFFSET,通过通过virt_to_phys()转化;
虚拟内存与真实物理内存映射关系:
其中物理地址空间中除了896M(ZONE_DMA + ZONE_NORMAL)的区域是绝对的物理连续,其他内存都不是物理内存连续。在虚拟内核地址空间中的安全保护区域的指针都是非法的,用于保证指针非法越界类的操作,vm_struct是连续的虚拟内核空间,对应的物理页面可以不连续,地址范围(3G + 896M + 8M) ~ 4G;另外在虚拟用户空间中 vm_area_struct同样也是一块连续的虚拟进程空间,地址空间范围0~3G。