Linux高端内存管理之临时内核映射

字体大小: 中小 标准 ->行高大小: 标准

临时内核映射区属于高端内存中的固定内核映射区中的一部分。当必须创建一个映射而当前的上下文又不能睡眠时,内核提供了临时映射(也就是所谓的原子映射)。有一组保留的映射,他们可以存放新创建的临时映射。内核可以原子地把高端内存中的一个页映射到某个保留的映射中。因此,临时映射可以用在不能睡眠的地方,比如中断处理程序中,因为获取映射时绝不会阻塞。

相关阅读:http://www.linuxidc.com/Linux/2012-02/53457.htm

每个CPU都有他自己的窗口集合,他们用enum km_type数据结构表示。该数据结构中定义的每个符号,如KM_BOUNCE_READ、KM_USER0等标示了窗口的线性地址。

[cpp]
  1. enum km_type {   KMAP_D(0)   KM_BOUNCE_READ,  
  2. KMAP_D(1)   KM_SKB_SUNRPC_DATA,   KMAP_D(2)   KM_SKB_DATA_SOFTIRQ,  
  3. KMAP_D(3)   KM_USER0,   KMAP_D(4)   KM_USER1,  
  4. KMAP_D(5)   KM_BIO_SRC_IRQ,   KMAP_D(6)   KM_BIO_DST_IRQ,  
  5. KMAP_D(7)   KM_PTE0,   KMAP_D(8)   KM_PTE1,  
  6. KMAP_D(9)   KM_IRQ0,   KMAP_D(10)  KM_IRQ1,  
  7. KMAP_D(11)  KM_SOFTIRQ0,   KMAP_D(12)  KM_SOFTIRQ1,  
  8. KMAP_D(13)  KM_SYNC_ICACHE,   KMAP_D(14)  KM_SYNC_DCACHE,  
  9. /* UML specific, for copy_*_user - used in do_op_one_page */   KMAP_D(15)  KM_UML_USERCOPY,  
  10. KMAP_D(16)  KM_IRQ_PTE,   KMAP_D(17)  KM_NMI,  
  11. KMAP_D(18)  KM_NMI_PTE,   KMAP_D(19)  KM_TYPE_NR  
  12. };  

在km_type中的每个符号(除了最后一个)都是固定映射的线性地址的一个下标。enum fixed_addressed数据结构包含符号FIX_KMAP_BEGIN和FIX_KMAP_END;把后者的值赋成下标FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1。在这种方式下,系统中的每个CPU都有KM_TYPE_NR个固定映射的线性地址。

[cpp]
  1. enum fixed_addresses {      ……  
  2. FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */   FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,  
  3.    ……   }  

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/57853.html