MemoryManager 是 ZerOS 内核的内存管理器,提供堆内存(Heap)和栈内存(Shed)的统一管理,支持多进程内存隔离。所有内存数据存储在 Exploit 程序(PID 10000)的内存中。
Heap - 堆内存实现Shed - 栈内存实现KernelMemory - 内核内存(用于存储内存管理数据)动态内存分配和释放,用于存储可变数据。
特性:
代码区和资源链接区,用于存储常量和静态数据。
特性:
allocateMemory(pid, heapSize, shedSize, heapId, shedId)为程序分配内存。
参数:
pid (number): 进程 IDheapSize (number): 堆内存大小(字节,-1 表示不需要堆)shedSize (number): 栈内存大小(字节,-1 表示不需要栈,实际不使用)heapId (number|null): 堆 ID(可选,如果不提供则自动生成)shedId (number|null): 栈 ID(可选,如果不提供则自动生成)返回值: Object - 内存分配结果
{
heapId: number,
shedId: number,
heap: Heap|null,
shed: Shed|null
}
示例:
// 分配堆和栈内存
const memory = MemoryManager.allocateMemory(this.pid, 1024, 512);
// 使用堆内存
if (memory.heap) {
const addr = memory.heap.allocate(100, 'myKey');
memory.heap.writeData(addr, 'Hello World');
}
// 使用栈内存
if (memory.shed) {
memory.shed.writeCode(0, 'function code');
}
freeMemory(pid)释放程序的所有内存。
参数:
pid (number): 进程 ID返回值: boolean - 是否成功
示例:
MemoryManager.freeMemory(this.pid);
checkMemory(pid)检查内存使用情况。
参数:
pid (number): 进程 ID,-1 表示检查所有程序返回值: Object|null - 内存信息对象
{
totalPrograms: number,
programs: [
{
pid: number,
programName: string,
heaps: [
{
heapId: number,
heapSize: number,
heapUsed: number,
heapFree: number
}
],
sheds: [
{
shedId: number,
shedSize: number
}
],
totalHeapSize: number,
totalHeapUsed: number,
totalHeapFree: number,
totalShedSize: number
}
]
}
示例:
// 检查所有程序的内存
const allMemory = MemoryManager.checkMemory(-1);
// 检查特定程序的内存
const programMemory = MemoryManager.checkMemory(this.pid);
registerProgramName(pid, programName)注册程序名称。
参数:
pid (number): 进程 IDprogramName (string): 程序名称返回值: boolean - 是否成功
示例:
MemoryManager.registerProgramName(this.pid, 'MyApp');
getProgramName(pid)获取程序名称。
参数:
pid (number): 进程 ID返回值: string - 程序名称(如果未注册则返回 Program-{pid})
示例:
const name = MemoryManager.getProgramName(this.pid);
console.log(name); // "MyApp" 或 "Program-1234"
setLogLevel(level)设置日志级别。
参数:
level (number): 日志级别(0-3)// 在程序初始化时分配内存
__init__: async function(pid, initArgs) {
this.pid = pid;
// 分配内存(1KB 堆,512B 栈)
const memory = MemoryManager.allocateMemory(this.pid, 1024, 512);
this.heap = memory.heap;
this.shed = memory.shed;
// 使用堆内存
const addr = this.heap.allocate(100, 'myData');
this.heap.writeData(addr, 'Hello World');
}
// 写入数据
const addr = this.heap.allocate(50, 'userData');
this.heap.writeData(addr, JSON.stringify({ name: 'John', age: 30 }));
// 读取数据
const data = this.heap.readString(addr, 50);
const user = JSON.parse(data);
// 检查内存使用
const memoryInfo = MemoryManager.checkMemory(this.pid);
console.log(`堆使用: ${memoryInfo.programs[0].totalHeapUsed} / ${memoryInfo.programs[0].totalHeapSize}`);
__exit__: async function() {
// 释放内存
MemoryManager.freeMemory(this.pid);
}
所有内存管理数据存储在 Exploit 程序(PID 10000)的内存中:
APPLICATION_SOP - 应用程序分区管理表PROGRAM_NAMES - 程序名称映射NEXT_HEAP_ID - 下一个堆 IDNEXT_SHED_ID - 下一个栈 IDheapId 和 shedId 区分__exit__ 中手动释放ps 命令中显示checkMemory(-1) 会检查所有程序的内存使用情况