aaa1982 发表于 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的体系结构介绍。

感谢

ffxz 发表于 2010-11-20 17:11:52

MIPS的做法有当时它自己的考虑,一个是容易统一各类厂商芯片的内存地址空间,另外一个,kseg1的存在可以为一些不必要cache的应用提供了便利。

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

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

aaa1982 发表于 2010-11-20 17:42:12

感谢回复:

接着问一下?

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

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

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

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

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

能这么理解么?

ffxz 发表于 2010-11-20 18:17:52

kseg0与kseg1完全重合,并且这两个都是映射的,完全是软件上的概念,与硬件无关。

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

aaa1982 发表于 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

aaa1982 发表于 2010-11-21 10:04:12

顶一下,期待高手的回答

smartkids77 发表于 2010-11-21 10:10:38

建议lz 看下See.MIPS.Run ,里面对ksg有详细的解释
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_599412CXRGGT.JPG
(原文件名:zz.JPG)

bluelucky 发表于 2010-11-21 10:59:15

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

aaa1982 发表于 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。

aaa1982 发表于 2010-11-22 22:35:20

顶一下
页: [1]
查看完整版本: 请教关于“在体系结构里面定义内存区域”的理解