龙芯开源社区

 找回密码
 注册新用户(newuser)
查看: 8609|回复: 33

[讨论3] MIPS地址空间映射

  [复制链接]
发表于 2010-10-19 12:45:55 | 显示全部楼层 |阅读模式
本帖最后由 opensrc 于 2010-10-22 00:21 编辑

如果能把2F的映射弄清楚了,估计2G和3A也没有问题。一些大方向的问题:

  • MIPS和x86地址空间映射的相同和不同,优劣比较
  • I/O controller内部映射的细节
  • DMA和地址映射如何联系上的
  • 地址映射和cache的关系
  • 等等。。。

还有我们先不涉及MMU这一块:问题已经很多了,可能地址映射和cache的关系我们都不可能讨论到。现在精力主要集中在XBAR的映射上。

大家有什么问题补充的,请添加。。。

参考文档:
 楼主| 发表于 2010-10-19 12:55:04 | 显示全部楼层
本帖最后由 opensrc 于 2010-10-21 00:38 编辑

我先来一个具体的问题。在32位MIPS下,kseg0 (范围为[0x80000_0000, 0xA000_0000))和kseg1 (范围为[0xA0000_0000, 0xC000_0000))都是unmapped,地址映射的时候简单将高3位去掉即可。映射后,kseg0和kseg1是重合的,都是([0x0000_0000,0x1000_0000))。所以,实际上,这一块区域被分成两部分,kseg0和kseg1各占一半。

我的问题:这样的话,有512M的虚拟空间被浪费掉了。我百思不得其解。那位解释一下,这样做到底有什么好处。谢谢了!
发表于 2010-10-20 09:55:21 | 显示全部楼层
不是吧,我记得一个是不通过tlb但通过cache,另一个是既不通过tlb也不通过cache。
 楼主| 发表于 2010-10-20 10:12:09 | 显示全部楼层
不是吧,我记得一个是不通过tlb但通过cache,另一个是既不通过tlb也不通过cache。
华中科大一学生 发表于 2010-10-20 09:55


那是两个段的不同性质。不过为什么他们转换后地址重合了呢?那才是我的问题。

我唯一的解释就是,这样容易实现。不过说实在,一个是去掉高三位,与之相对的是判断高两位。只是为了实现方便,看起来有些牵强。
发表于 2010-10-20 10:29:27 | 显示全部楼层
因为boot的那一刻tlb和cache都没有初始化,因此必须通过kseg1,然后呢,cache初始化以后就改用kseg0了,不然性能低的跟8086有的一拼。
 楼主| 发表于 2010-10-20 11:50:17 | 显示全部楼层
回复 5# 华中科大一学生

谢谢你的解答。

不过我的问题是:为什么kseg0和kseg1在映射后重合了?所以在实际应用中,虚拟地址段[0x9000_0000, 0xB000_0000)被浪费掉了。
发表于 2010-10-20 11:54:32 | 显示全部楼层
我估计是启动以后还有不通过cache的需求,比如DMA访问内存。
 楼主| 发表于 2010-10-20 12:30:07 | 显示全部楼层
我估计是启动以后还有不通过cache的需求,比如DMA访问内存。
华中科大一学生 发表于 2010-10-20 11:54


两个段,uncached和DMA的要求不成问题,而空间的浪费不能理解。你这个说法不能说服我。
发表于 2010-10-20 14:15:48 | 显示全部楼层
呵呵,我也是猜想,当然没有足够的证据说服你。
 楼主| 发表于 2010-10-21 07:30:54 | 显示全部楼层
呵呵,我也是猜想,当然没有足够的证据说服你。
华中科大一学生 发表于 2010-10-20 14:15


这个问题可以先搁置。反正事实就是这样,接受好了。

再来一个问题。在2F的I/O路由中,在kernel下, [256M, 320M)的物理地址被映射到了[0, 64M)的总线地址;[320M, 428M)被映射到了[320M, 428M) -- 就是没变。

问题:这个[0, 64M)和[320M, 428M)的总线地址对应着什么呢?总该有个物理含义在里面吧,否则,把这些区域暴露给OS有什么意义呢?

本版积分规则

小黑屋|手机版|Archiver|Lemote Inc.  

GMT+8, 2019-8-26 17:39 , Processed in 0.196698 second(s), 18 queries .

快速回复 返回顶部 返回列表