Chinaunix首页 | 论坛 | 博客
  • 博客访问: 439523
  • 博文数量: 123
  • 博客积分: 2686
  • 博客等级: 少校
  • 技术积分: 1349
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-23 22:11
文章分类
文章存档

2012年(3)

2011年(10)

2010年(100)

2009年(10)

我的朋友

分类: LINUX

2010-12-17 15:35:43

 

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))


阅读(1116) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-12-19 14:53:43

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com