Chinaunix

标题: 内存管理-高端内存和低端内存 [打印本页]

作者: xingdajing    时间: 2013-12-25 18:01
标题: 内存管理-高端内存和低端内存
   高端内存是指物理地址大于 896M 的内存。
   加入当前内存就是512M的内存,那么本系统还存在高端内存吗?还是说系统会根据实际的内存大小,改变高端内存的阀值?

   如果没有高端内存,是否整个体系中,就不存在永久内存映射?
作者: tempname2    时间: 2013-12-25 20:09
内核想用一段虚拟地址空间把所有的物理内存线性cover。当物理内存大于内核能用的虚拟地址空间时,多出那部份cover不了的物理内存就是高端内存了。896M是说,内核最多只能用这么大的虚拟地址空间用来线性映射物理内存。

所以高端内存产生的原因是,kernel_linear_virtual_space < physical_memory。64位时kernel_linear_virtual_space大到可以盖住所有物理内存,高端内存就不存在了。32位时,如果物理内存小到可以缩进kernel_linear_virtual_space里,高端内存也不存在。


作者: jasonsungblog    时间: 2013-12-26 09:56
关于高端内存的映射不是很懂?什么是这些永久映射?
作者: embeddedlwp    时间: 2013-12-26 09:59
哪里看到高端内存是896MB的? 那书都快10年了。
作者: kiongf    时间: 2013-12-29 21:39
回复 1# xingdajing

   高低端内存划分过程:
    1)内核将根据bios的信息中得到的物理RAM的大小。 x86, max_pfn = e820_end_of_ram_pfn();
    2)取决于机器是32位还是64位:
      ·  32位机器将会执行find_low_pfn_range()
         将会判断物理内存是否小于预定义的MAXMEM值(MAXMEM_PFN=VMALLOC_END-PAGE_OFFSET-__VMALLOC_RESERVE).
         a)当小于该值时,所有实际物理内存都用做低端内存。但还判断用户是否需要设置高端内存来划分用户需要的内存做高端内存。
         arch/x86/mm/init_32.c lowmem_pfn_init()
         #ifdef CONFIG_HIGHMEM
           if(highmem_pages >= max_pfn)
                       max_low_pfn -=  highmem_pages;  //最终确认的低端内存值.
         
        b) 当大于MAXMEM_PFN值时, 部分内存溢出预定义的最大低端内存.
                      arch/x86/mm/init_32.c highmem_pfn_init()
           如果用户没有要求高端内存的大小,则溢出部分做高端内存.
                     if(highmem_pages == -1)
                              highmem_pages = max_pfn - MAXMEM_PFN;

           整个调用链 : setup_arch()--->  find_low_pfn_range()---> low_mem_init()/high_mem_init();
作者: xingdajing    时间: 2013-12-30 10:48
    不管高端内存如何映射,内核空间的虚拟地址就是3G~4G,所以是否可以认定内核可使用的内存就是最大1G。
作者: xingdajing    时间: 2013-12-30 10:52
   malloc在分配内存是首选就是高端内存,在高端内存不足时才会从低端内存中获取。
   高端内存主要是为了让进程空间较大内存而设计的,而非针对内核空间,可以这样理解吗。
作者: humjb_1983    时间: 2013-12-30 11:07
xingdajing 发表于 2013-12-30 10:48
不管高端内存如何映射,内核空间的虚拟地址就是3G~4G,所以是否可以认定内核可使用的内存就是最大1G。

1、内核虚拟地址空间是可配置的,不一定就只有1G
2、即使只有1G的虚拟机地址空间,内核中也可以通过Vmalloc区映射高端内存。
3、高端内存仅适用于32位系统,64位就没有这些烦恼了。
作者: njuzhyf    时间: 2013-12-30 11:08
NO。。。。

回复 7# xingdajing


   
作者: xingdajing    时间: 2013-12-30 14:34
   我的理解是内核地址空间的虚拟地址是0XC000 0000 ~ 0XFFFF FFFF,无论是直接映射还是通过页表映射,内核空间要使用某一物理内存,都需要通过虚拟地址,虚拟地址在内核空间只有1G的寻址范围。那么内核就无法使用超出1G的物理内存,在物理内存上不一定都是1G范围内的物理内存。
作者: gacad    时间: 2014-01-05 11:24
内存整理分为低页地址段和高位地址段
低位内存管理系统内核,
高位内存管理分页机制,
实际的内存大小
16位地址内存大小1000KB=1MB
32位地址内存大小4000MB=4GB
64位地址内存大小16000GB=16TB
128位地址内存大小256000GB=256TB




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2