Chinaunix

标题: MIPS32 TLB的实现 [打印本页]

作者: jyhhappyjyh    时间: 2009-12-31 09:05
标题: MIPS32 TLB的实现
关于MIPS32有个问题想请教各位大侠,我用的DDR是32M的,flash是16M的,CPU是BCM5354:
  1. TLB在代码中具体是怎么实现的?我看到有的帖子上说TLB是在CPU里的,有的说是存在memory中的,到底哪对啊?糊涂了。。。
  2.如果要实现TLB的话,代码中具体该怎么做呢?
  期盼各位大侠的回复!
作者: readkernel    时间: 2009-12-31 10:51
TLB是CPU内部的,属于MMU部分。
用于虚拟地址到物理地址的转换。
如果CPU的MMU功能使能。CPU指令中给出的地址和取指令的地址都要经过TLB转换到物理地址。
如果这些地址在TLB中找不到对应的物理地址映射,就会产生TLB异常。
操作系统的TLB异常处理程序负责把这些地址对应的物理地址映射加载到TLB中(所谓的缺页异常)
这些地址映射关系在操作系统初始化或进程加载时都会在物理内存中建立好。

CPU访问虚拟内存流程:
CPU访问虚拟内存地址-->查找TLB-->没有映射-->产生TLB异常-->TLB异常处理程序流程-->继续执行异常处指令或取下一条指令

是否继续执行异常处指令取决于TLB异常处理程序执行的结果

TLB异常处理程序流程:
1.得到异常的地址-->在内存映射表找映射项-->如果找到则加载到TLB-->异常返回
2.得到异常的地址-->在内存映射表找映射项-->如果没找到就报错(一般是Segment fault)-->异常返回.

[ 本帖最后由 readkernel 于 2009-12-31 10:56 编辑 ]
作者: jyhhappyjyh    时间: 2009-12-31 11:19
标题: 回复 #2 readkernel 的帖子
MIPS中CPU是否使能MMU是由状态寄存器SR里的TS位决定的吧?而该位是一个只读位,系统reset时初值是“0”,只有当多个TLB出现match时才会置“1”。这就有疑问了,出现多个TLBmatch,怎么就disable MMU了呢?
作者: jyhhappyjyh    时间: 2009-12-31 12:09
标题: 回复 #2 readkernel 的帖子
现在我知道如何从一个虚地址VA到一个实地址,但是这还只是理论的东西,但毕竟这是我第一次写底层的代码,有些东西实现起来很是困难,迷雾重重。
具体的地址译码过程可以用下面一张图来说明:

           

“这些地址映射关系在操作系统初始化或进程加载时都会在物理内存中建立好”这个具体怎么实现呢?

[ 本帖最后由 jyhhappyjyh 于 2009-12-31 12:14 编辑 ]
作者: readkernel    时间: 2009-12-31 12:44
mips的MMU是没有Disabled,上电就一直开着..
作者: readkernel    时间: 2009-12-31 12:46
虚拟地址到物理地址的映射不止有TLB。

MIPS有几段虚拟地址空间就没有用TLB映射
看看kseg1。
作者: readkernel    时间: 2009-12-31 12:53
原帖由 jyhhappyjyh 于 2009-12-31 11:19 发表
MIPS中CPU是否使能MMU是由状态寄存器SR里的TS位决定的吧?而该位是一个只读位,系统reset时初值是“0”,只有当多个TLB出现match时才会置“1”。这就有疑问了,出现多个TLBmatch,怎么就disable MMU了呢?


...
这个位是表示相同的虚拟地址映射到了TLB中多个Entry。

status register[TS] bit
Indicates that the TLB has detected a match on multiple
entries. When such a detection occurs, the processor
initiates a machine check exception and sets this bit. It is
implementation dependent whether this condition can be
corrected by software. If the condition can be corrected,
this bit should be cleared by software before resuming
normal operation.
If this bit is not implemented, it must be ignored on write
and read as zero.
Software should not write a 1 to this bit when its value is
a 0, thereby causing a 0-to-1 transition. If such a transition
is caused by software, it is UNPREDICTABLE whether
hardware ignores the write, accepts the write with no side
effects, or accepts the write and initiates a machine check
exception.
作者: jyhhappyjyh    时间: 2009-12-31 13:23
标题: 回复 #6 readkernel 的帖子
对的,k0和k1段是不需要进行映射的,有点像是硬件来完成的,都是指向0x0000 0000 ~ 0x1FFF FFFF。
作者: jyhhappyjyh    时间: 2009-12-31 13:57
原帖由 readkernel 于 2009-12-31 12:46 发表
虚拟地址到物理地址的映射不止有TLB。

MIPS有几段虚拟地址空间就没有用TLB映射
看看kseg1。

readkernel,看来你是这方面的专家,可否传上一小段这方面的代码?或者加我QQ:330479369[qq]330479369[/qq](只做为自己学习提高!)不方便的话发我邮箱也可以:jyhhappyjyh@163.com
真心地感谢!现在被这个搞得快崩溃了~~:em12:

[ 本帖最后由 jyhhappyjyh 于 2009-12-31 14:02 编辑 ]
作者: readkernel    时间: 2009-12-31 14:16
QQ.. 多年没用了。
linux源码arch\mips\mm\下所有的文件都是这方面的代码。
呵呵,很细节的东西我也没仔细研究过。
正是“知其所以然,不知其然”
真正要用到的时候才会潜心去研究细节。

有问题这里说吧,论坛上还是有那么几个比较牛的。
作者: jyhhappyjyh    时间: 2009-12-31 16:21
标题: 回复 #10 readkernel 的帖子
好的,我再慢慢啃啃~
期待牛人指点,O(∩_∩)O~,可以少走弯路,快速上手!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2