搜索
bottom↓
回复: 9

请教关于“在体系结构里面定义内存区域”的理解

[复制链接]

出0入0汤圆

发表于 2010-11-20 12:17:16 | 显示全部楼层 |阅读模式
请教1个关于理解性的问题:

在cortex-m3 的结构里面有关于memory map的章节 定义了flash、sram、 peripheral IO 等等区域的影设内存范围。根据我的理解,主要目的是可以便于不同厂家的芯片代码包括makefile文件能最大限度的兼容。

但是最近开始学习mips,他从体系结构上面定义了memory map 包括 kseg kseg0 kseg1 kseg2 。

定义了不同区域的缓存 mmu 等相关属性。这些地址都是“虚拟地址”,体系结构还定义了固定的虚拟地址到实际物理地址的转换规则。

比如:kseg0(把最高位清零)和kseg1(把最高3位清零)映射的物理地址一样,都是(0x0000 0000 - 0x1FFF FFFF)。


我想问以下问题:

1)这样的定义方法原因是为什么?出于什么目的的考虑会把内存影射划分为kseg kseg0 kseg1 kseg2 并定义不同的访问属性。

2)到哪里可以找到关于mips的类似arm architecture reference的体系结构介绍。

感谢

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-11-20 17:11:52 | 显示全部楼层
MIPS的做法有当时它自己的考虑,一个是容易统一各类厂商芯片的内存地址空间,另外一个,kseg1的存在可以为一些不必要cache的应用提供了便利。

但是缺点也同样非常明显,内存空间划分成这样,相当于变相减小了芯片支持的最大内存空间。

ARM的做法则是,基本上把内存空间的划分推给了各个厂商,所以内存地址空间就五花八门了

出0入0汤圆

 楼主| 发表于 2010-11-20 17:42:12 | 显示全部楼层
感谢回复:

接着问一下?

kseg0:非映射、缓存
kseg1:非影射、非缓存

这样映射到同样的物理地址没问题么?

是不是在设计的时候只能人为的分开

比如kseg 0 接到 sdram 占用低256M的物理空间

kseg1 接到flash占用256M到256+128M的物理地址空间?

能这么理解么?

出0入0汤圆

发表于 2010-11-20 18:17:52 | 显示全部楼层
kseg0与kseg1完全重合,并且这两个都是映射的,完全是软件上的概念,与硬件无关。

kseg0,kseg1在芯片上电时即可使用,MIPS芯片也号称是必须经过地址映射的。你对MIPS感兴趣,可以搜索下网上RT-Thread MIPS移植相关的文章。

出0入0汤圆

 楼主| 发表于 2010-11-20 22:13:10 | 显示全部楼层
ffxz你好:

拜读了一篇您关于介绍mips+rt-thread的文章。不好意思还是要请教一个基础问题。

mips说所有的地址都要经过地址映射。

1)程序里面无论是代码段、数据段、堆栈空间,都一定是依据0-4G这个虚拟地址空间的对么?代码段、数据段、堆栈空间具体locate到哪个kseg段是在链接的时候由链接命令的参数决定的对么?

2)那么mips在从虚拟地址取值或者取数据的时候怎么才能和具体的物理存储器空间内的代码或者数据对应上呢?

3)定义了kseg0 是cached,当你在link的时候把一些代码段和数据段放到了kseg0对应的虚拟地址空间内。在mips实际运行的时候读取该空间内的代码或者数据的时候可以使用缓存到底是由什么决定的?d-cache i-cache是mips框架里面必须要求存在的么? 是不是可以这么理解,在mips取指过程中,当发现地址空间处于kseg0时,就会缓存相关代码,反之则不会。对于数据也一样,发现在kseg0的地址空间内,就会把它缓存,反之则不会。这么理解对不对?

有没有没有缓存的mips,如果是没有缓存,当把数据或者代码放到了kseg0,访问会出现什么问题?




问题都比较基础,确实感到比较迷惑,感谢解答,谢谢

aaa1982

出0入0汤圆

 楼主| 发表于 2010-11-21 10:04:12 | 显示全部楼层
顶一下,期待高手的回答

出0入0汤圆

发表于 2010-11-21 10:10:38 | 显示全部楼层
建议lz 看下See.MIPS.Run ,里面对ksg有详细的解释

(原文件名:zz.JPG)

出0入0汤圆

发表于 2010-11-21 10:59:15 | 显示全部楼层
我不懂mips架构,但看了上面几位大大的讨论后,也冒昧地姑妄猜测一下。我觉得应该是kuseg, kseg0, 以及kseg2都是给需要MMU的操作系统使用的,kuseg对应用户空间, kseg0用于装入OS的代码和数据,kseg2给需要特权的进程使用。
kseg1绕过了缓存,适合于必须严格按顺序存取的区域,比如外设的内存映射寄存器空间,而且它且仅有它用于支持没有MMU的芯片。

出0入0汤圆

 楼主| 发表于 2010-11-21 11:23:32 | 显示全部楼层
感谢各位的指教

see mips run 中英文的都看过了。其实现在的问题不是不知道kseg 怎么用,而是想了解机制性的东西是怎么实现的,比如这几个问题希望谁能帮我指点一下:

1)定义了kseg0 是cached,当你在link的时候把一些代码段和数据段放到了kseg0对应的虚拟地址空间内。在mips实际运行的时候读取该空间内的代码或者数据的时候可以使用缓存到底是由什么决定的?
2)d-cache i-cache是mips框架里面必须要求存在的么? 是不是可以这么理解,在mips取指过程中,当发现地址空间处于kseg0时,就会缓存相关代码,反之则不会。对于数据也一样,发现在kseg0的地址空间内,就会把它缓存,反之则不会。这么理解对不对?
3)有没有没有缓存的mips,如果是没有缓存,当把数据或者代码放到了kseg0,访问会出现什么问题?


前两个问题基本想明白了,说一下我的想法

1)程序里面无论是代码段、数据段、堆栈空间,都一定是依据0-4G这个虚拟地址空间的对么?代码段、数据段、堆栈空间具体locate到哪个kseg段是在链接的时候由链接命令的参数决定的对么?  
答案应该是肯定的

2)那么mips在从虚拟地址取值或者取数据的时候怎么才能和具体的物理存储器空间内的代码或者数据对应上呢?
每个具体的cpu都会有具体的内存影射的连线方式(参考datasheet)。比如把flash怎么连接就会映射到物理地址的那个范围,把sdram怎么连接就会映射到哪个物理范围等等。当然之一般都是硬件工程师做的,比如说通过具体mips手册的datasheet 把flash或者rom映射到物理地址(1fc00000)来对应kseg1的bfc00000。

出0入0汤圆

 楼主| 发表于 2010-11-22 22:35:20 | 显示全部楼层
顶一下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-27 14:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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