4 Virtual memory map with 4 level page tables:
5
6 0000000000000000 - 00007fffffffffff (=47 bits) user space, different per mm
7 hole caused by [48:63] sign extension
8 ffff800000000000 - ffff80ffffffffff (=40 bits) guard hole
9 ffff880000000000 - ffffc7ffffffffff (=64 TB) direct mapping of all phys. memory
10 ffffc80000000000 - ffffc8ffffffffff (=40 bits) hole
11 ffffc90000000000 - ffffe8ffffffffff (=45 bits) vmalloc/ioremap space
12 ffffe90000000000 - ffffe9ffffffffff (=40 bits) hole
13 ffffea0000000000 - ffffeaffffffffff (=40 bits) virtual memory map (1TB)
14 ... unused hole ...
15 ffffffff80000000 - ffffffffa0000000 (=512 MB) kernel text mapping, from phys 0
16 ffffffffa0000000 - fffffffffff00000 (=1536 MB) module mapping space
|
In X86_64 architecture, Linux kernel translates virtual address to physical address by __pa(x), physical address to virtual address by __va(x).
Implementation of __pa(x): [phyaddr.c]
#define __pa(x) __phys_addr((unsigned long)(x))
unsigned long __phys_addr(unsigned long x)
{
if (x >= __START_KERNEL_map) {
x -= __START_KERNEL_map;
VIRTUAL_BUG_ON(x >= KERNEL_IMAGE_SIZE);
x += phys_base;
} else {
VIRTUAL_BUG_ON(x < PAGE_OFFSET);
x -= PAGE_OFFSET;
VIRTUAL_BUG_ON(!phys_addr_valid(x));
}
return x;
}
EXPORT_SYMBOL(__phys_addr);
|
Implementation of __va(x):
#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))
|
阅读(1076) | 评论(1) | 转发(0) |