虚拟内存
参考资料:《操作系统:原理与实现》 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
,属于用户态可访问缓存区域。