linux系统为什么给内核分配1G不是500M?为什么不是2:2分配?

今天遇到一个面试题,面试官问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。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-03-19
一般装linux必须要的分区为根分区和swap分区,其他分区看根据自己需要可以自行添加(如/home,/oracle,/opt等等)linux内核组成部分分为三个部分,例如linux2.6.3其中2是主要版本,6是修订版本,3是不稳定版本,如果3是偶数的话,说明该系统为稳定版本。本回答被网友采纳
第2个回答  2019-03-19
这个是面试官特定需求下的设置
平时设置没有这种需求,想怎么分就怎么分
第3个回答  2019-03-20
你说的是32bit 下Linux虚拟内存的分配吧,默认的编译选项是前面3G给用户空间,后面1G给内核空间。这个是可以改的配置文件的,改成内核给用户空间都是2G.
第4个回答  2019-03-20

32bit Linux kernel virtual memory layout

现在64bit都出来好久了, 128bit也逐渐应用,还问32bit的事情,真好玩。

相似回答