龙芯及其主板的地址空间

龙芯CPU的虚拟地址空间为:

0x0000 0000 ~ 0x7FFF FFFF 2G kuseg 32-bits user space
0x8000 0000 ~ 0x9FFF FFFF 512M kseg0 unmapped cached space
0xA000 0000 ~ 0xBFFF FFFF 512M kseg1 unmapped uncached space
0xC000 0000 ~ 0xFFFF FFFF 1G kseg2 mapped space

系统从以下地址开始执行:

Virtual Address == 0xBFC0 0000 Physical Address == 0x1FC0 0000

启动期间,硬件从ROM中读取指令(PMON是烧在ROM中的),使用寄存器交换数据,不使用cache和RAM交换数据;

PMON中的start.S中的一段代码把自己从ROM中拷贝到RAM,然后再跳转到0x8000 0000,即kseg0开始处执行,这里开始使用cache和RAM;
PMON代码中的 _start 符号是在编译时分配的,其值为 0x8010 0000(还是 0x8000 0000?待考察),

龙芯对RAM,ROM,IO寄存器及外部RAM进行统一编址,除了DDR内存外,其它的地址都是经过北桥连接并翻译的,具体情况如下:

龙芯2E 的物理地址空间分为两部分,一部分是DDR内存空间,地址为 0 ~ 0x0FFF FFFF(0~256M) 及 0x2000 0000 以上(512M~?)。另一部分为 0x1000 0000 ~ 0x1FFF FFFF(256M~512M),这部分地址为Bonito北桥所占用。即只要是CPU发出的寻址地址在这之间的,就会被Bonito北桥所吸收,并在北桥所管辖的范围内查找。北桥所管辖的这256M空间又细分为如下各部分:

Base Address and Scope Size Class Description
0x1000 0000 ~ 0x13FF FFFF 64M PCI_Lo0 PCI 0号存储区
0x1400 0000 ~ 0x17FF FFFF 64M PCI_Lo1 PCI 1号存储区
0x1800 0000 ~ 0x1BFF FFFF 64M PCI_Lo2 PCI 2号存储区
0x1C00 0000 ~ 0x1F7F FFFF 56M ROM 可用于保存一些永久性的信息
0x1F80 0000 ~ 0x1FBF FFFF 4M ROM 可用于保存一些永久性的启动相关的信息
0x1FC0 0000 ~ 0x1FCF FFFF 1M ROM 启动ROM,开机上电最先执行的代码就放在这
0x1FD0 0000 ~ 0x1FDF FFFF 1M PCI IO PCI IO 寄存器口的映射空间,大部分外部设备的接口都在这里
0x1FE0 0000 ~ 0x1FE0 0FF 256 Bytes Bonito Self Register Bonito 的PCI配置寄存器
0x1FE0 0100 ~ 0x1FE0 01FF 256 Bytes Bonito Self Register Bonito 自身的配置寄存器
0x1FE0 0200 ~ 0x1FE7 FFFF 63.5K Bonito Self Register 没有使用
0x1FE8 0000 ~ 0x1FEF FFFF 512K PCI Configure Address PCI 配置空间
blue|0x1F0 0000 ~ 0x1FFF FFFF 1M Local IO 本地 IO 设备空间

其中,标有颜色的部分是我们常常打交道的。现在我们的龙芯电脑上有256M的内存,因此0~256M这一块物理地址肯定有对应的实体,但是256M~512M这一块物理地址不一定有对应的实体,这一部分地址是被北桥所接收了,后面的部分由北桥进行处理,北桥会判断外部某些设备是没有接入,如果没接入,则它不会为那个设备分配IO寄存器及数据存储空间。


PCI自己内部也有一套地址空间(32位和64位都行),它和CPU的地址空间里面就存在某个映射关系。

当设备进行DMA时,还有一套将PCI地址转换成CPU地址的机制。这就要用于北桥中的Base Address Registers,北桥中一共有3个这样的寄存器,分别为 PCIBASE0, PCIBASE1, PCIBASE2。PCIBASE0, PCIBASE1 都可以映射多达 256M 的空间。具体映射的大小还取决于 PCIMEMBASECFG 的设置。PCIBASE2 用于映射 Bonito 的内部寄存器,映射区间为 64k 大小。

通常我们只使用了 PCIBASE0,代码中PCIMEMBASECFG的值使它可以映射256M的内存,它在代码中被赋值为 PCI_LOCAL_MEM_PCI_BASE(被定义为 0x8000 0000)。因此,当 PCI设备访问地址在 0x8000.0000~0x8FFF.FFFF 时这个地址会先减掉 0x8000 0000 变成要访问的内存地址 ,然后对内存进行操作(读或写)。此时,北桥充当了一个译码器的角色。


此块龙芯主板使用的显卡是 Radeon 7000,它在PCI扫描映射后的物理内存地址(即Framebuffer地址)是
0x1400 0000 ~ 0x15FF FFFF
共32M

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License