位置:持久映射区在内核地址空间中,夹在vmalloc区和固定映射区之间,(PKMAP_BASE至FIXMAP_START)。
功能:将高端内存长期映射到内核地址空间中,通过kmap函数实现,kmap函数传入page*。
步骤:通过kmap将传入的page*映射到虚拟内存时分以下几步:1.在内核地址空间(持久映射区)分配一个页;2.建立传入的物理内存页和虚拟地址之间的映射;3.统计内核地址空间中哪些页被引用。
kmap函数实现:
void *kmap(struct page *page)
{
might_sleep();
if (!PageHighMem(page))
return page_address(page);
return kmap_high(page);
}
如果传入的物理内存页帧不是高端内存,直接调用page_address(page);计算虚拟地址;通过page在mem_map中的位置计算是第几个物理页,在根据低端内存域与内核空间前896M的直接映射关系可得出虚拟地址。
如果传入的物理内存页帧是高端内存,则调用kmap_high(page);函数处理。
void *kmap_high(struct page *page)
{
unsigned long vaddr;
/*
* For highmem pages, we can't trust "virtual" until
* after we have the lock.
*/
lock_kmap();
vaddr = (unsigned long)page_address(page);
if (!vaddr)
vad