歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux教程

Linux高端內存管理之臨時內核映射

臨時內核映射區屬於高端內存中的固定內核映射區中的一部分。當必須創建一個映射而當前的上下文又不能睡眠時,內核提供了臨時映射(也就是所謂的原子映射)。有一組保留的映射,他們可以存放新創建的臨時映射。內核可以原子地把高端內存中的一個頁映射到某個保留的映射中。因此,臨時映射可以用在不能睡眠的地方,比如中斷處理程序中,因為獲取映射時絕不會阻塞。

相關閱讀:http://www.linuxidc.com/Linux/2012-02/53457.htm

每個CPU都有他自己的窗口集合,他們用enum km_type數據結構表示。該數據結構中定義的每個符號,如KM_BOUNCE_READ、KM_USER0等標示了窗口的線性地址。

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

在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.    ……  
  3. FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */  
  4. FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,  
  5.    ……  
  6. }  
Copyright © Linux教程網 All Rights Reserved