Chinaunix
标题:
内核空间和用户空间的虚地址映射到物理地址
[打印本页]
作者:
shihyu
时间:
2015-07-30 01:23
标题:
内核空间和用户空间的虚地址映射到物理地址
本帖最后由 shihyu 于 2015-07-30 01:24 编辑
下面是书中所说
对 于 内 核 空 间 而 言 , 给 定 一 个 虚 地 址 x , 其 物 理 地 址 为 “ x - PAGE_OFFSET”,给定一个物理地址x,其虚地址为“x+ PAGE_OFFSET”
可是有些书又提到 , 页表有分内核空间和用户空间的页表 , 这样内核空间映射到物理内存是透过页表机制? 还是 虚 地 址 x - PAGE_OFFSET 即是物理地址?
Linux 内核空间和用户空间映射到物理内存是透过硬件MMU 会转换的嘛? MMU 硬件实现分页机制?
如果是用MMU 那内核代码中最后是在哪些将虚地址传给MMU 做转换成物理地址?
作者:
nswcfd
时间:
2015-07-30 10:50
好眼熟的问题。
其实这些说法并不矛盾。
对于特定的CPU,比如x86,保护模式下是不能绕过MMU的,这是硬件限制(其它架构CPU另说)。
内核地址也不例外。
只是它的映射关系是可以【固定、可计算、可预期的】——不像用户态的地址,不经过内核查一次页表,没办法知道main导致加载到那个物理地址。
这个固定映射关系的好处,给定虚拟地址,可以不经过页表,就能【计算出】物理地址。
注意是计算出,真正访问的时候还是要经过MMU/页表。
什么时候需要计算出物理地址呢?
比如网卡驱动做DMA,分配一段内核空间(kmalloc返回虚拟地址vp),这个地址要提交给硬件(写某个控制寄存器),
但是硬件只知道物理地址,需要把vp转换为物理地址(减少PAGE_OFFSET),再写到寄存器里。
如果不是直接映射,那好吧,就得把vp分成10-12-12几段(假设32位3级页表),
从cr3开始,一级一级的查下去,才能知道vp对应的物理内存。
作者:
shihyu
时间:
2015-07-30 20:38
想知道内核代码中最后是在哪些将虚地址传给MMU 做转换成物理地址?
作者:
夕阳下的孤影
时间:
2015-07-30 23:08
对于内核空间的低端地址来说,虚拟地址与物理地址是PAGE_OFFSET的关系。
地址转换是MMU负责完成,另外TLB会缓存一部分虚拟地址与物理地址的映射关系,用来加速地址转换。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2