Skip to content

虚拟内存

参考资料:《操作系统:原理与实现》 https://uofw.github.io/upspd/docs/hardware/PSPTEK.htm#memmap https://uofw.github.io/upspd/docs/hardware/psp_doc.pdf

本章讨论PSP的虚拟地址的使用情况以及同物理地址以及设备寄存器等的映射关系。

PSP物理内存到虚拟内存的映射方式为直接映射

其 CPU 中没有MMU,虚拟地址翻译不经过页表,而是使用MPU(Memory Protection Unit)进行较为简单的转换和权限控制。

物理地址空间

物理地址空间也并非连续,中间存在空隙……

物理内存

PSP 1000 的物理内存为 32MB. PSP 2000/3000 的物理内存为 64MB。

32MB 即 $2^{25}$ B,物理内存地址范围为 0x08000000~0x0A000000.

64MB范围为 0x08000000~0x0C000000

SC CPU Physical Memory
  00010000    Scratchpad (16KB)                                                                    
  04000000    VRAM (8MB)                                                                           
  08000000    Main RAM (32MB, 64MB)                                                                
  1C000000    I/O Ports                                                                            
  1FC00000    Shared RAM (2MB) [Contains exception vectors]                                        
  1FE00000    I/O Ports  

设备寄存器和内存映射 I/O

I/O设备的设计者和制造商约定俗成地将设备的外部接口设计为一组寄存器,称为设备寄存器,作为设备操作的统一编程接口。程序通过读写设备寄存器对设备进行配置和交互。

硬件设计者往往在物理地址空间上给 I/O 设备分配了一段专门的物理区域,用于映射设备寄存器

物理内存和设备寄存器占用不同的物理地址。

虚拟地址空间概览

虚拟内存按地址由低到高,布局如下。

虚拟地址 用途
0x00000000~0x40000000(2^30B=1024MB) 用户态可访问内存(缓存)
0x40000000~0x80000000 用户态可访问内存(未缓存)
0x80000000~0xA0000000(2^29B=512MB) 内核态可访问内存(缓存)
0xA0000000~0xC0000000 内核态可访问内存(未缓存)

虚拟地址到物理地址的映射

VM Start VM End Size Segement PM Start PM End
0x88000000 0x887fffff 8MB 内核态(缓存) 0x00000000 0x007fffff
0x08800000 0x09ffffff 24MB 用户态(缓存) 0x00800000 0x01ffffff
0x0a00000 0x0bffffff 32MB 用户态(缓存)(PSP2000/PSP3000) 0x02000000 0x04000000

虚拟内存到IO设备的映射

VM Start VM End Size Segement Description
0x00010000 0x00013fff 用户态(缓存) 操作按钮
0x04000000 0x041fffff 2MB 用户态(缓存) 显存/帧缓冲区

操作系统内核使用区域

CPU 的异常向量表基地址寄存器储存的地址 | VM Start | VM End | Size | Segement | Description | | ---------- | ---------- | ---- | ---------------- | ------------------------------------------ | | 0xbfc00000 | 0xbfcfffff | 1MB | 内核态(未缓存) | 异常向量表(Exception Vector Table) |

其实际物理地址应位于内核态可访问的 8MB 物理内存中。

游戏的默认加载地址

0x08804000,属于用户态可访问缓存区域。