龙芯软件开发(8)--理解龙芯2E寄存器和内存布局
2006-12-25 13:48
435 查看
对于软件开发人员来说,一个CPU最重要的部分就是寄存器、内存布局和指令。龙芯2E逻辑上是有32个定点通用寄存器(其中0号固定为0),32个浮点寄存器,一个hi,一个lo,以及若干cp0控制寄存器,两个cp1控制寄存器。物理上是64个定点,64个浮点,和若干控制寄存器。龙芯2E具有下面的逻辑寄存器:
l 32个通用的64位寄存器
l 1个PC寄存器
l 2个保存乘除操作结果寄存器
l 32个浮点64位寄存器
l 32个CP0控制寄存器
l 2个cp1控制寄存器
一、32个通用的64位寄存器
这32个通用寄存器,可以用作任何使用。但实际上由于编译器已经约定特定的使用,所以还是要服从特定的约定,这样可以减少麻烦,减少开发出错机会。特定使用如下:
l $0 zero 值总是为0,可能主要用途是清空内存地址空间,以及做一些与或非的操作,访问速度快。
l $1 $AT是为编译器保留的寄存器
l $2..$3 V0..V1保存函数返回值用
l $4..$11 A0..A7函数调用时传递参数,可以传递8个整型参数
l $12..$15 T0..T3 临时寄存器,用于保存临时变量的值,也是用的最多的寄存器
l $16..$23 S0-S7 他们的值在过程调用的时候保持不变,可以用于传递参数或者返回值
l $24..$25 T8..T9 临时寄存器,用于保存临时变量的值,也是用的最多的寄存器
l $26..$27 K0..K1 保留给操作系统内核使用
l $28 GP 保存全局指针
l $29 SP 保存堆栈指针
l $30 FP或S8 保存帧指针,也可以和S0..S7一样使用
l $31 RA 保存返回地址
二、专用寄存器
HI和LO主要返回乘除结果,PC是指令计数器。
三、内存布局
在32位下,程序地址空间划分为4个大区域。每个区域有一个传统的名字。对于在这
些区域的地址,各自有不同的属性:
kuseg: 0x000 0000 - 0x7FFF FFFF (低端2G):这些地址是用户态可用的地址。在
有MMU的机器里,这些地址将一概被MMU作转换。除非MMU的设置被建立好,这2G地址是不可用的。对于没有MMU的机器,存取这2G地址的后依具体机器相关。你的CPU具体厂商提供的手册将会告诉你关于这方面的信息。如果想要你的代码在有或没有MMU的MIPS处理器之间有兼容性,尽量避免这块区域的存取。
kseg0: 0x8000 0000 - 0x9FFF FFFF(512M): 这些地址映射到物理地址简单的通过
把最高位清零,然后把它们映射到物理地址低段512M(0x0000 0000 - 0x1FFF FFFF)。因为这种映射是很简单的,通常称之为“非转换的“地址区域。几乎全部的对这段地址的存取都会通过快速缓存(cache)。因此在cache设置好之前,不能随便使用这段地址。通常一个没有MMU的系统会使用这段地址作为其绝大多数程序和数据的存放位置。对于有MMU的系统,操作系统核心会存放在这个区域。
kseg1: 0xA000 0000 - 0xBFFF FFFF(512M): 这些地址通过把最高3位清零的方法来映射到相应的物理地址上,与kseg0映射的物理地址一样。但kseg1是非cache存取的。 kseg1是唯一的在系统重启时能正常工作的地址空间。这也是为什么重新启动时的入口向量是0xBFC0 0000。这个向量相应的物理地址是0x1FC0 0000。将使用这段地址空间去存取你的初始化ROM。大多数人在这段空间使用I/O寄存器。
kseg2: 0xC000 0000 - 0xFFFF FFFF (1G): 这段地址空间只能在核心态下使用并且要经过MMU的转换。在MMU设置好之前,不能存取这段区域。除非你在写一个真正的操作系统,一般来说你不需要使用这段地址空间。
l 32个通用的64位寄存器
l 1个PC寄存器
l 2个保存乘除操作结果寄存器
l 32个浮点64位寄存器
l 32个CP0控制寄存器
l 2个cp1控制寄存器
一、32个通用的64位寄存器
这32个通用寄存器,可以用作任何使用。但实际上由于编译器已经约定特定的使用,所以还是要服从特定的约定,这样可以减少麻烦,减少开发出错机会。特定使用如下:
l $0 zero 值总是为0,可能主要用途是清空内存地址空间,以及做一些与或非的操作,访问速度快。
l $1 $AT是为编译器保留的寄存器
l $2..$3 V0..V1保存函数返回值用
l $4..$11 A0..A7函数调用时传递参数,可以传递8个整型参数
l $12..$15 T0..T3 临时寄存器,用于保存临时变量的值,也是用的最多的寄存器
l $16..$23 S0-S7 他们的值在过程调用的时候保持不变,可以用于传递参数或者返回值
l $24..$25 T8..T9 临时寄存器,用于保存临时变量的值,也是用的最多的寄存器
l $26..$27 K0..K1 保留给操作系统内核使用
l $28 GP 保存全局指针
l $29 SP 保存堆栈指针
l $30 FP或S8 保存帧指针,也可以和S0..S7一样使用
l $31 RA 保存返回地址
二、专用寄存器
HI和LO主要返回乘除结果,PC是指令计数器。
三、内存布局
在32位下,程序地址空间划分为4个大区域。每个区域有一个传统的名字。对于在这
些区域的地址,各自有不同的属性:
kuseg: 0x000 0000 - 0x7FFF FFFF (低端2G):这些地址是用户态可用的地址。在
有MMU的机器里,这些地址将一概被MMU作转换。除非MMU的设置被建立好,这2G地址是不可用的。对于没有MMU的机器,存取这2G地址的后依具体机器相关。你的CPU具体厂商提供的手册将会告诉你关于这方面的信息。如果想要你的代码在有或没有MMU的MIPS处理器之间有兼容性,尽量避免这块区域的存取。
kseg0: 0x8000 0000 - 0x9FFF FFFF(512M): 这些地址映射到物理地址简单的通过
把最高位清零,然后把它们映射到物理地址低段512M(0x0000 0000 - 0x1FFF FFFF)。因为这种映射是很简单的,通常称之为“非转换的“地址区域。几乎全部的对这段地址的存取都会通过快速缓存(cache)。因此在cache设置好之前,不能随便使用这段地址。通常一个没有MMU的系统会使用这段地址作为其绝大多数程序和数据的存放位置。对于有MMU的系统,操作系统核心会存放在这个区域。
kseg1: 0xA000 0000 - 0xBFFF FFFF(512M): 这些地址通过把最高3位清零的方法来映射到相应的物理地址上,与kseg0映射的物理地址一样。但kseg1是非cache存取的。 kseg1是唯一的在系统重启时能正常工作的地址空间。这也是为什么重新启动时的入口向量是0xBFC0 0000。这个向量相应的物理地址是0x1FC0 0000。将使用这段地址空间去存取你的初始化ROM。大多数人在这段空间使用I/O寄存器。
kseg2: 0xC000 0000 - 0xFFFF FFFF (1G): 这段地址空间只能在核心态下使用并且要经过MMU的转换。在MMU设置好之前,不能存取这段区域。除非你在写一个真正的操作系统,一般来说你不需要使用这段地址空间。
相关文章推荐
- 龙芯软件开发(8)--理解龙芯2E寄存器和内存布局
- 龙芯软件开发(8)--理解龙芯2E寄存器和内存布局
- 龙芯软件开发(9)--理解龙芯2E几个汇编问题
- 龙芯软件开发(9)--理解龙芯2E几个汇编问题
- 龙芯软件开发(9)--理解龙芯2E几个汇编问题
- 谈谈我对软件开发 可行性分析 等9个流程的理解[上]
- 【Android 开发】深入理解内存缓存类LruCache:源码分析
- 龙芯软件开发(6)--CPU龙芯2E
- 龙芯软件开发(12)--龙芯2E摸索前行
- 龙芯软件开发(13)--配置南桥进入调试新天地
- 龙芯软件开发(15)-- 搬家前的准备
- 龙芯软件开发(19)-- C函数入口
- 你对软件开发中迭代的含义的理解
- 龙芯软件开发(24)-- PCI设备初始化2
- Valgrind ---内存调试,内存泄漏检测以及性能分析的软件开发工具
- 龙芯软件开发(26)-- PCI设备初始化4
- atitit.软件开发GUI 布局管理优缺点总结java swing wpf web html c++ qt php asp.net winform
- 深入理解C程序内存布局
- 一位从事10年开发软件工程师对职业的理解
- 深入理解C程序内存布局