臨時內核映射區屬於高端內存中的固定內核映射區中的一部分。當必須創建一個映射而當前的上下文又不能睡眠時,內核提供了臨時映射(也就是所謂的原子映射)。有一組保留的映射,他們可以存放新創建的臨時映射。內核可以原子地把高端內存中的一個頁映射到某個保留的映射中。因此,臨時映射可以用在不能睡眠的地方,比如中斷處理程序中,因為獲取映射時絕不會阻塞。
相關閱讀:http://www.linuxidc.com/Linux/2012-02/53457.htm
每個CPU都有他自己的窗口集合,他們用enum km_type數據結構表示。該數據結構中定義的每個符號,如KM_BOUNCE_READ、KM_USER0等標示了窗口的線性地址。
[cpp]
- enum km_type {
- KMAP_D(0) KM_BOUNCE_READ,
- KMAP_D(1) KM_SKB_SUNRPC_DATA,
- KMAP_D(2) KM_SKB_DATA_SOFTIRQ,
- KMAP_D(3) KM_USER0,
- KMAP_D(4) KM_USER1,
- KMAP_D(5) KM_BIO_SRC_IRQ,
- KMAP_D(6) KM_BIO_DST_IRQ,
- KMAP_D(7) KM_PTE0,
- KMAP_D(8) KM_PTE1,
- KMAP_D(9) KM_IRQ0,
- KMAP_D(10) KM_IRQ1,
- KMAP_D(11) KM_SOFTIRQ0,
- KMAP_D(12) KM_SOFTIRQ1,
- KMAP_D(13) KM_SYNC_ICACHE,
- KMAP_D(14) KM_SYNC_DCACHE,
- /* UML specific, for copy_*_user - used in do_op_one_page */
- KMAP_D(15) KM_UML_USERCOPY,
- KMAP_D(16) KM_IRQ_PTE,
- KMAP_D(17) KM_NMI,
- KMAP_D(18) KM_NMI_PTE,
- KMAP_D(19) KM_TYPE_NR
- };
在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]
- enum fixed_addresses {
- ……
- FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */
- FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
- ……
- }