gem5 se模式中,进行物理内存分配的时候,实现了简单的虚拟地址到物理地址映射机制
在src/mem/page_table.cc中是具体的函数
在src/sim/process.cc中调用page_table.cc中的map函数添加物理地址到虚拟地址的映射;
Process::allocateMem(Addr vaddr, int64_t size, bool clobber)
{
int npages = divCeil(size, (int64_t)PageBytes);
Addr paddr = system->allocPhysPages(npages);
pTable->map(vaddr, paddr, size,
clobber ? EmulationPageTable::Clobber :
EmulationPageTable::MappingFlags(0));
}
实际的物理地址分配函数为allocPhysPages,在src/sim/system.cc中
System::allocPhysPages(int npages)
{
Addr return_addr = pagePtr << PageShift;
pagePtr += npages;
Addr next_return_addr = pagePtr << PageShift;
AddrRange m5opRange(0xffff0000, 0xffffffff);
if (m5opRange.contains(next_return_addr)) {
warn("Reached m5ops MMIO region\n");
return_addr = 0xffffffff;
pagePtr = 0xffffffff >> PageShift;
}
if ((pagePtr << PageShift) > physmem.totalSize())
fatal("Out of memory, please increase size of physical memory.");
return return_addr;
}
其中PageShift设置页大小;pagePtr<<PageShift已分配的页数;最后判断如果已分配的页数超过内存限制,报错:增加内存大小
m5opRange是一段invalid的区域,若分配的在这一段区域,则跳过,分配后面的