歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux高端內存管理之臨時內核映射

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

日期:2017/2/28 15:57:29   编辑: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