关于内核空间地址映射问题
2014-07-31 19:19
239 查看
在前面系列中讲过,内核空间对所有的进程都是共享的,其中存放的是内核的代码和数据。
也说过,内核空间占据了每个虚拟内存空间的最高1GB字节,那么它是怎样映射到物理地址中的呢?
掌握到了用户空间的地址是用分页机制来映射的,那么内核空间呢?
内核空间的1GB空间有着独特的方法,它映射到物理内存总是从最低地址0x000000000开始的。之所以这么规定,是为了在内核空间和物理内存之间建立简单的线性映射关系。那么3GB=(0xc0000000)可想就是内核虚拟地址和物理地址之间的偏移量,(举个例子:如果某个虚拟地址为0xc0001000,那么它所映射的物理地址是多少呢?就是
0xC0001000-3GB(0xC0000000)=0x00001000(物理地址)。
在linux中,这个偏移3GB叫做PAGE_OFFSET
#define _PAGE_OFFSET 0xc000000
#define PAGE_OFFSET ((unsigned long)_PAGE_OFFSET)
#define __pa(x) ((unsigned long )(x-PAGE_OFFSET)) 虚转物
#define __va(x) ((unsigned long ) (x+PAGE_OFFSET)) (这里的x为物理地址) 物转虚
这个线性关系只是适合在内核空间的虚拟地址(0xC0000000-0xFFFFFFFF)!!
也说过,内核空间占据了每个虚拟内存空间的最高1GB字节,那么它是怎样映射到物理地址中的呢?
掌握到了用户空间的地址是用分页机制来映射的,那么内核空间呢?
内核空间的1GB空间有着独特的方法,它映射到物理内存总是从最低地址0x000000000开始的。之所以这么规定,是为了在内核空间和物理内存之间建立简单的线性映射关系。那么3GB=(0xc0000000)可想就是内核虚拟地址和物理地址之间的偏移量,(举个例子:如果某个虚拟地址为0xc0001000,那么它所映射的物理地址是多少呢?就是
0xC0001000-3GB(0xC0000000)=0x00001000(物理地址)。
在linux中,这个偏移3GB叫做PAGE_OFFSET
#define _PAGE_OFFSET 0xc000000
#define PAGE_OFFSET ((unsigned long)_PAGE_OFFSET)
#define __pa(x) ((unsigned long )(x-PAGE_OFFSET)) 虚转物
#define __va(x) ((unsigned long ) (x+PAGE_OFFSET)) (这里的x为物理地址) 物转虚
这个线性关系只是适合在内核空间的虚拟地址(0xC0000000-0xFFFFFFFF)!!
相关文章推荐
- 关于外部设备存储空间的地址映射--摘自情景分析
- 从MDL(把应用层的地址空间映射到系统内核空间)得到系统虚拟空间地址
- 内核态空间地址直接映射到用户态空间访问
- 关于Windows编程中进程虚拟地址空间/虚拟内存及内存映射方面的资料
- 函数 ioremap 物理地址到内核映射空间的映射函数
- 【解答】关于内核中没开MMU之前的虚拟地址物理地址转换问题
- 内核态空间地址直接映射到用户态空间访问
- Linux 内核空间地址映射 高端内存 总结
- 【解答】关于内核中没开MMU之前的虚拟地址物理地址转换问题
- 关于JOS 未对所有内存分页映射之前 物理地址映射问题的思考
- cpu为什么使用虚拟地址到物理地址的空间映射,解决了什么样的问题?
- 【解答】关于内核中没开MMU之前的虚拟地址物理地址转换问题
- 为何要把物理内存地址映射到内核空间?
- 关于JOS 未对全部内存分页映射之前 物理地址映射问题的思考
- Unix v6中对虚拟地址映射到物理地址以及在内核态如何访问用户空间的u值
- 【解答】关于内核中没开MMU之前的虚拟地址物理地址转换问题
- 关于Windows编程中进程虚拟地址空间/虚拟内存及内存映射方面的资料
- 函数 ioremap 物理地址到内核映射空间的映射函数
- linux 内存映射 remap_pfn_range操作(内核地址映射到用户空间)
- 内核态与用户态空间地址参数传递问题