高端内存

本文详细解析了通过adb shell cat /proc/zoneinfo命令获取的内核内存管理信息,展示了不同内存区域的状态,包括空闲页面数、活跃匿名页面数等关键指标。

http://blog.chinaunix.net/uid-15007890-id-3415331.html


http://www.uml.org.cn/embeded/201208071.asp


adb shell cat /proc/zoneinfo |vim -


Node 0, zone   Normal
  pages free     9777
        min      873
        low      3349
        high     3567
        scanned  0
        spanned  221184
        present  190568
    nr_free_pages 9777
    nr_inactive_anon 1038
    nr_active_anon 93685
    nr_inactive_file 12906
    nr_active_file 12504
    nr_unevictable 0
    nr_mlock     0
    nr_anon_pages 92559
    nr_mapped    22046
    nr_file_pages 27581
    nr_dirty     0
    nr_writeback 0
    nr_slab_reclaimable 3053
    nr_slab_unreclaimable 7910
    nr_page_table_pages 3779
    nr_kernel_stack 1356
    nr_unstable  0
    nr_bounce    0
    nr_vmscan_write 2002
    nr_vmscan_immediate_reclaim 1910
    nr_writeback_temp 0
    nr_isolated_anon 0
    nr_isolated_file 0
    nr_shmem     2167
    nr_dirtied   584526
    nr_written   570943
    nr_anon_transparent_hugepages 0
    nr_free_cma  0
        protection: (0, 1164, 1164)
  pagesets
    cpu: 0
              count: 64
              high:  186
              batch: 31
  vm stats threshold: 8
  all_unreclaimable: 0
  start_pfn:         0
  inactive_ratio:    1
Node 0, zone  HighMem
  pages free     516
        min      36
        low      519
        high     562
        scanned  0
        spanned  40960
        present  37272
    nr_free_pages 516
    nr_inactive_anon 66
    nr_active_anon 33731
    nr_inactive_file 0
    nr_active_file 0
    nr_unevictable 1153
    nr_mlock     0
    nr_anon_pages 33438
    nr_mapped    321
    nr_file_pages 1512
    nr_dirty     0
    nr_writeback 0
    nr_slab_reclaimable 0
    nr_slab_unreclaimable 0
    nr_page_table_pages 0
    nr_kernel_stack 0
    nr_unstable  0
    nr_bounce    0
    nr_vmscan_write 14642
    nr_vmscan_immediate_reclaim 56180
    nr_writeback_temp 0
    nr_isolated_anon 0
    nr_isolated_file 0
    nr_shmem     359
    nr_dirtied   7380
    nr_written   7037
    nr_anon_transparent_hugepages 0
    nr_free_cma  218
        protection: (0, 0, 0)
  pagesets
    cpu: 0
              count: 1
              high:  42
              batch: 7
  vm stats threshold: 125
  all_unreclaimable: 1
  start_pfn:         221184
  inactive_ratio:    1


http://blog.youkuaiyun.com/w_s_xin/article/details/5050656


http://www.cnblogs.com/xkfz007/articles/2715192.html


<think>好的,我现在需要帮助用户理解高端内存映射的概念及其实现方式和原理。首先,我要回顾一下用户提供的引用资料,看看有哪些相关信息可以利用。 根据引用[1],高端内存被定义为不能通过直接偏移映射的虚拟地址空间,而低端内存可以通过直接映射。例如,在ARM架构中,永久映射可能在high_memory之下,但仍属于高端内存。这说明高端内存的界定更侧重于映射方式而非物理位置。 引用[4]提到Linux的直接映射区是线性空间从3G开始的896MB区域,而永久内核映射区用于访问高端内存。这帮助我理解不同内存区域的结构。此外,引用[3]中的系统调用如vmalloc()和kmap()可能涉及高端内存的管理,但需要进一步确认。 用户的问题集中在实现技术和原理上,所以我需要结合这些引用,整理出高端内存存在的背景、具体实现方式以及相关技术。可能需要解释为什么需要高端内存,比如32位系统的地址空间限制,导致无法直接映射所有物理内存,从而引入高端内存的概念。 然后,实现方式方面,引用[1]提到永久映射和动态映射,可能对应kmap和vmalloc等方法。同时,引用[4]中的永久内核映射区和动态内存映射区应详细说明,包括它们如何工作,比如页表动态管理、临时映射等。 还需要注意区分不同体系结构下的差异,如ARM和x86的可能不同处理,这能帮助用户理解为何高端内存的定义不单纯依赖物理位置。 最后,确保回答结构清晰,分点解释,并结合原理和实现技术。同时生成相关问题,比如应用场景、与低端内存的区别、32/64位系统的影响等,这些能帮助用户深入理解。</think>### 高端内存映射技术实现与原理 #### 1. **背景与定义** 高端内存(High Memory)主要用于解决 **32位系统虚拟地址空间不足** 的问题。在32位架构中,内核虚拟地址空间通常被划分为: - **低端内存(Low Memory)**:直接映射区(如Linux中3G~3G+896MB),通过固定偏移(如`PAGE_OFFSET`)实现物理地址到虚拟地址的线性映射,访问效率高[^4]。 - **高端内存(High Memory)**:无法通过直接偏移映射的物理内存,需动态管理虚拟地址与物理页的映射关系[^1]。 #### 2. **实现原理** 高端内存的核心是 **动态虚拟地址分配**,通过以下技术实现: - **页表动态管理**:内核维护临时映射(如`kmap()`),将高端内存页临时映射到内核虚拟地址空间的小块区域(如永久映射区或固定映射区)[^4]。 - **按需映射**:仅在需要时建立映射,使用后释放虚拟地址资源。例如,`vmalloc()`从动态内存映射区分配虚拟地址,支持非连续物理内存的访问[^4]。 - **体系结构适配**:ARM等架构可能通过永久映射区(位于低端内存之上)实现高端内存访问,打破“高端内存=高地址”的误解[^1]。 #### 3. **关键技术** - **永久映射(kmap)**:通过`kmap()`为高端内存页分配固定虚拟地址,需手动释放(`kunmap()`),适用于长期访问的场景。 - **临时映射(kmap_atomic)**:使用CPU的TLB快速建立短期映射,映射后需尽快释放,常用于中断上下文[^4]。 - **非连续内存分配(vmalloc)**:将离散的物理页映射到连续的虚拟地址空间,适合大块内存请求,但访问效率低于直接映射区[^3]。 #### 4. **典型应用场景** - **物理内存超过内核直接映射容量**:如32位系统物理内存超过896MB时,超出部分通过高端内存管理。 - **动态内核模块加载**:模块代码可能分配到高端内存区域。 - **用户空间与内核空间的数据交换**:如`get_user_pages()`将用户内存页映射到内核高端内存区域。 --- ### 示例:Linux内核中的高端内存映射 ```c // 使用kmap映射高端内存页 struct page *high_mem_page = alloc_pages(GFP_HIGHUSER, 0); // 分配高端内存页 void *vaddr = kmap(high_mem_page); // 建立虚拟地址映射 memcpy(vaddr, src_data, PAGE_SIZE); // 操作映射后的内存 kunmap(high_mem_page); // 释放映射 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值