快速业务通道

Linux高端内存

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-15
地址空间...)

  VM_MAP -- 仅申请线性区,物理内存另外申请,是VM_ALLOC的简化版

  VM_IOREMAP -- 仅申请线性区,物理内存另外申请(这里的物理内存一般都是高端内存,大于896M的内存)

  2. 永久内核映射

  2.1 永久内存映射允许建立长期映射.使用主内核页表中swapper_pg_dir的一个专门页表.

  pkmap_page_table: 专门的页表.页表表项数由LAST_PKMAP(512或1024)产生.

  page_address_htable: 存放地址的

  pkmap_count: 包含LAST_PKMAP个计数器的数组.

  PKMAP_BASE: 页表线性地址从PKMAP_BASE开始.

  2.2 如果LAST_PKMAP个项都用完,则把当前进程置为 TASK_UNINTERRUPTIBLE,并调用schedule()

  3. 临时内存映射

  3.1 可以用在中断处理函数和可延迟函数的内部,从不阻塞.临时内存映射是固定内存映射的一部分,一个地址固定给一个内核成分使用.

  3.2 每个CPU都有自己的一个13个窗口(一个线性地址及页表项)的集合.

  enum km_type {

  KM_BOUNCE_READ,

  KM_SKB_SUNRPC_DATA,

  KM_SKB_DATA_SOFTIRQ,

  KM_USER0,

  KM_USER1,

  KM_BIO_SRC_IRQ,

  KM_BIO_DST_IRQ,

  KM_PTE0,

  KM_PTE1,

  KM_IRQ0,

  KM_IRQ1,

  KM_SOFTIRQ0,

  KM_SOFTIRQ1,

  KM_TYPE_NR

  };

  所有固定映射的固定线性地址

  enum fixed_addresses {

  FIX_HOLE,

  FIX_VSYSCALL,

  ....

  #ifdef CONFIG_HIGHMEM

  FIX_KMAP_BEGIN, /* reserved pte''s for temporary kernel mappings */

  FIX_KMAP_END = FIX_KMAP_BEGIN (KM_TYPE_NR*NR_CPUS)-1,

  #endif

  .......

  __end_of_permanent_fixed_addresses,

  /* temporary boot-time mappings, used before ioremap() is functional */

  #define NR_FIX_BTMAPS 16

  FIX_BTMAP_END = __end_of_permanent_fixed_addresses,

  FIX_BTMAP_BEGIN = FIX_BTMAP_END NR_FIX_BTMAPS - 1,

  FIX_WP_TEST,

  __end_of_fixed_addresses

  };

  3.3 注意 fixed_addresses 的地址从上至下是倒着的,FIX_HOLE的地址等于 0xfffff000,是一个洞

  #define __fix_to_virt(x) (FIXADDR_TOP - ((x) << PAGE_SHIFT))

  #define __FIXADDR_TOP 0xfffff000

  -------------------------

  VMALLOC_RESERVE和896M

  LINUX 内核虚拟地址空间到物理地址空间一般是固定连续影射的.

  假定机器内存为512M,

  从 3G开始,到3G 512M 为连续固定影射区.zone_dma, zone_normal为这个区域的.固定影射的VADDR可以直接使用(get a free page, then use pfn_to_virt()等宏定义转换得到vaddr)或用kmalloc等分配. 这样的vaddr的物理页是连续的.得到的地址也一定在固定影射区域内.

  如果内存紧张,连续区域无法满足,调用vmalloc分配是的,它可以将物理不连续的空间组合后分配,更能满足分配要求.vmalloc可以映射高端页框,也可以映射底端页框.vmalloc的作用只是为了提供逻辑上连续的地址...

  但 vmalloc分配的vaddr一定不能与固定影射区域的vaddr重合.vaddr到物理页的影射同时只能唯一.vmalloc得到的 vaddr要在3G 512m 以上才可以.也就是从VMALLOC_START开始分配. VMALLOC_START比连续固定影射区大最大vaddr地址还多8-16M(2*VMALLOC_OFFSET)--有个鬼公式在

  #define VMALLOC_OFFSET 8*1024

  #define VMALLOC_START (high_memory - 2*VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)

  high_memory 就是固定影射区域最高处.

  空开8-16M做什么? 为了捕获越界的mm_fault.

  同样,vmalloc每次

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号