sEMU
载入中...
搜索中...
未找到
mem.hpp
浏览该文件的文档.
1#pragma once
2
3#include <vector>
4#include <cstdint>
5#include <cstddef>
6#include <memory>
7
8// ===================================
9// 设备地址映射 (MMIO Configuration)
10// ===================================
11constexpr size_t DEVICE_BASE = 0xa0000000;
12constexpr size_t MMIO_BASE = 0xa0000000;
13
14constexpr size_t SERIAL_PORT = DEVICE_BASE + 0x00003f8;
15constexpr size_t KBD_ADDR = DEVICE_BASE + 0x0000060;
16constexpr size_t RTC_ADDR = DEVICE_BASE + 0x0000048;
17constexpr size_t VGACTL_ADDR = DEVICE_BASE + 0x0000100;
18constexpr size_t AUDIO_ADDR = DEVICE_BASE + 0x0000200;
19constexpr size_t DISK_ADDR = DEVICE_BASE + 0x0000300;
20constexpr size_t FB_ADDR = MMIO_BASE + 0x1000000;
21constexpr size_t AUDIO_SBUF_ADDR = MMIO_BASE + 0x1200000;
22
29class guest_mem {
30private:
31 std::vector<uint8_t> mem;
32 size_t base_addr;
33 size_t size;
34 // 统一地址读写接口 (隔离层)
35 uint64_t paddr_read(size_t addr, int len);
36 void paddr_write(size_t addr, int len, uint64_t data);
37
38 // 内部 PMEM/MMIO 读写接口
39 uint64_t pmem_read(size_t addr, int len);
40 void pmem_write(size_t addr, int len, uint64_t data);
41 uint64_t mmio_read(size_t addr, int len);
42 void mmio_write(size_t addr, int len, uint64_t data);
43public:
49 guest_mem(size_t base = 0x80000000, size_t sz = 128 * 1024 * 1024);
50
51 // 析构函数
52 ~guest_mem() = default;
53
57 inline bool in_pmem(size_t addr) const {
58 return addr >= base_addr && addr < base_addr + size;
59 }
60
64 inline bool in_mmio(size_t addr) const {
65 return addr >= MMIO_BASE && addr < MMIO_BASE + 0x2000000;
66 }
67
71 inline bool in_bounds(size_t addr) const {
72 return in_pmem(addr) || in_mmio(addr);
73 }
74
80 uint8_t* get_host_ptr(size_t addr);
81
88 void load_binary(size_t load_addr, const void* ext_mem, size_t ext_size);
89
90 // ===================================
91 // 面向外部 (Core 等) 暴露的标准接口
92 // ===================================
93 // 面向外部 (Core 等) 暴露的标准接口读写函数
94 // 包含有符号和无符号的 Byte, Half-Word, Word 和 Double-Word 的加载和存储
95
96 int8_t lb(size_t addr);
97 uint8_t lbu(size_t addr);
98 int16_t lh(size_t addr);
99 uint16_t lhu(size_t addr);
100 int32_t lw(size_t addr);
101 uint32_t lwu(size_t addr);
102 int64_t ld(size_t addr);
103
104 void sb(size_t addr, uint8_t val);
105 void sh(size_t addr, uint16_t val);
106 void sw(size_t addr, uint32_t val);
107 void sd(size_t addr, uint64_t val);
108
112 uint8_t read_byte(size_t addr);
113
117 void write_byte(size_t addr, uint8_t val);
118
122 void mem_init();
123}; // 类定义结束
guest_mem(size_t base=0x80000000, size_t sz=128 *1024 *1024)
构造函数:初始化内存子系统
定义 mem.cpp:16
size_t base_addr
物理映射的架构起始地址
定义 mem.hpp:32
bool in_pmem(size_t addr) const
判断地址是否在架构物理内存 (PMEM) 范围内
定义 mem.hpp:57
bool in_mmio(size_t addr) const
判断地址是否在设备 MMIO 范围内
定义 mem.hpp:64
void pmem_write(size_t addr, int len, uint64_t data)
定义 mem.cpp:66
void mmio_write(size_t addr, int len, uint64_t data)
定义 mem.cpp:50
void sh(size_t addr, uint16_t val)
Store Half-Word
定义 mem.cpp:106
void sd(size_t addr, uint64_t val)
Store Double-Word
定义 mem.cpp:108
bool in_bounds(size_t addr) const
判断地址是否可合法访问
定义 mem.hpp:71
void mem_init()
使用硬编码测试序列初始化内存 (主要用于无参测试)
定义 mem.cpp:113
uint8_t read_byte(size_t addr)
读取单个字节的底层接口
定义 mem.cpp:110
uint16_t lhu(size_t addr)
Load Half-Word (Zero-extended)
定义 mem.cpp:100
std::vector< uint8_t > mem
底层扁平化存储空间
定义 mem.hpp:31
int64_t ld(size_t addr)
Load Double-Word
定义 mem.cpp:103
void write_byte(size_t addr, uint8_t val)
写入单个字节的底层接口
定义 mem.cpp:111
~guest_mem()=default
uint8_t * get_host_ptr(size_t addr)
获取指定架构地址映射的主机内存指针
定义 mem.cpp:23
int8_t lb(size_t addr)
Load Byte (Sign-extended)
定义 mem.cpp:97
void sb(size_t addr, uint8_t val)
Store Byte
定义 mem.cpp:105
void paddr_write(size_t addr, int len, uint64_t data)
定义 mem.cpp:89
int16_t lh(size_t addr)
Load Half-Word (Sign-extended)
定义 mem.cpp:99
uint64_t pmem_read(size_t addr, int len)
定义 mem.cpp:56
uint64_t mmio_read(size_t addr, int len)
定义 mem.cpp:34
void load_binary(size_t load_addr, const void *ext_mem, size_t ext_size)
加载二进制数据 (如 payload) 到指定的架构物理地址
定义 mem.cpp:28
int32_t lw(size_t addr)
Load Word (Sign-extended)
定义 mem.cpp:101
void sw(size_t addr, uint32_t val)
Store Word
定义 mem.cpp:107
size_t size
预设的内存容量上限
定义 mem.hpp:33
uint64_t paddr_read(size_t addr, int len)
定义 mem.cpp:80
uint32_t lwu(size_t addr)
Load Word (Zero-extended)
定义 mem.cpp:102
uint8_t lbu(size_t addr)
Load Byte (Zero-extended)
定义 mem.cpp:98
constexpr size_t SERIAL_PORT
定义 mem.hpp:14
constexpr size_t VGACTL_ADDR
定义 mem.hpp:17
constexpr size_t DISK_ADDR
定义 mem.hpp:19
constexpr size_t FB_ADDR
定义 mem.hpp:20
constexpr size_t DEVICE_BASE
定义 mem.hpp:11
constexpr size_t AUDIO_ADDR
定义 mem.hpp:18
constexpr size_t AUDIO_SBUF_ADDR
定义 mem.hpp:21
constexpr size_t KBD_ADDR
定义 mem.hpp:15
constexpr size_t MMIO_BASE
定义 mem.hpp:12
constexpr size_t RTC_ADDR
定义 mem.hpp:16