龙芯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