针对 MIPS 汇编MIPS 体系结构 的补充内容。

ABI

以下内容来自 MIPS Assembly Language Programmer’s Guide

对于 n64,部分整数寄存器的约定见下表:

寄存器名称助记符用途保存者
$0zero永远返回0
$1at汇编器保留调用者
$2-$3v0-v1函数返回值调用者
$4-$11a0-a7子程序参数调用者
$12-$15t4-t7临时寄存器调用者
$16-$23s0-s7保存寄存器被调用者
$24t8临时寄存器调用者
$25t9临时寄存器调用者
$26-$27k0-k1内核保留
$28gp全局指针被调用者
$29sp栈指针被调用者
$30s8帧指针被调用者
$31ra返回地址调用者

对于整数寄存器,o32 和 n64 的部分区别见下表:

属性o32n64
寄存器长度32 位64 位
当参数为结构体时,通过寄存器传递的大小32 位64 位
参数寄存器保存者调用者被调用者(只在需要时保存)
当返回值为结构体时,通过寄存器返回的大小不保存最多 128 位
当返回值为结构体时,第一个参数由 $2 返回
返回地址存放位置$31,支持 .mask 指令任意寄存器
全局指针保存者调用者保存被调用者保存

虚拟地址空间

以下内容来自 The MIPS64 and microMIPS64 Privileged Resource Architecture v6.03

虚拟地址空间如下图所示:

虚拟地址空间

特别地,对于 xkphys 空间,虚拟地址的格式如下:

<code>xkphys</code> 空间下虚拟地址的格式

针对 CCA 部分,具体描述如下:

<code>CCA</code> 的具体描述

根据上表描述的属性,xkphys 空间包括八个地址范围,每个地址范围提供了进入物理内存的 $2^{PABITS}$ 字节的窗口,因此不会使用TLB转换地址。

Linux/MIPS 的内存管理

  • 32 位的 Linux/MIPS 内核假定整个低内存可通过 kseg0 访问,这一空间但最多 512MB。通常会保留该地址空间的一部分供其他使用,因此把低端内存限制为256MB,超出此范围的内存通过高端内存来访问。
  • 64位的 Linux/MIPS 内核通过xkphys访问低端内存。由于 xkphys 的大小足够,整个物理内存是可以直接访问的,因此不需要高端内存。

参考文档

MIPS 体系结构的文档可在官网上找到: