change the page table from map to hash_map and create small cache to to speed up lookups
--HG-- extra : convert_revision : 4c73ed33c2a22ae3254b459b0fd189e6ac9d438e
This commit is contained in:
parent
07cd37c48b
commit
ecab4b426c
|
@ -54,6 +54,9 @@ PageTable::PageTable(System *_system, Addr _pageSize)
|
||||||
system(_system)
|
system(_system)
|
||||||
{
|
{
|
||||||
assert(isPowerOf2(pageSize));
|
assert(isPowerOf2(pageSize));
|
||||||
|
pTableCache[0].vaddr = 0;
|
||||||
|
pTableCache[1].vaddr = 0;
|
||||||
|
pTableCache[2].vaddr = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
PageTable::~PageTable()
|
PageTable::~PageTable()
|
||||||
|
@ -95,7 +98,7 @@ PageTable::allocate(Addr vaddr, int size)
|
||||||
assert(pageOffset(vaddr) == 0);
|
assert(pageOffset(vaddr) == 0);
|
||||||
|
|
||||||
for (; size > 0; size -= pageSize, vaddr += pageSize) {
|
for (; size > 0; size -= pageSize, vaddr += pageSize) {
|
||||||
std::map<Addr,Addr>::iterator iter = pTable.find(vaddr);
|
m5::hash_map<Addr,Addr>::iterator iter = pTable.find(vaddr);
|
||||||
|
|
||||||
if (iter != pTable.end()) {
|
if (iter != pTable.end()) {
|
||||||
// already mapped
|
// already mapped
|
||||||
|
@ -103,6 +106,12 @@ PageTable::allocate(Addr vaddr, int size)
|
||||||
}
|
}
|
||||||
|
|
||||||
pTable[vaddr] = system->new_page();
|
pTable[vaddr] = system->new_page();
|
||||||
|
pTableCache[2].paddr = pTableCache[1].paddr;
|
||||||
|
pTableCache[2].vaddr = pTableCache[1].vaddr;
|
||||||
|
pTableCache[1].paddr = pTableCache[0].paddr;
|
||||||
|
pTableCache[1].vaddr = pTableCache[0].vaddr;
|
||||||
|
pTableCache[0].paddr = pTable[vaddr];
|
||||||
|
pTableCache[0].vaddr = vaddr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,7 +121,22 @@ bool
|
||||||
PageTable::translate(Addr vaddr, Addr &paddr)
|
PageTable::translate(Addr vaddr, Addr &paddr)
|
||||||
{
|
{
|
||||||
Addr page_addr = pageAlign(vaddr);
|
Addr page_addr = pageAlign(vaddr);
|
||||||
std::map<Addr,Addr>::iterator iter = pTable.find(page_addr);
|
paddr = 0;
|
||||||
|
|
||||||
|
if (pTableCache[0].vaddr == vaddr) {
|
||||||
|
paddr = pTableCache[0].paddr;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (pTableCache[1].vaddr == vaddr) {
|
||||||
|
paddr = pTableCache[1].paddr;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (pTableCache[2].vaddr == vaddr) {
|
||||||
|
paddr = pTableCache[2].paddr;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
m5::hash_map<Addr,Addr>::iterator iter = pTable.find(page_addr);
|
||||||
|
|
||||||
if (iter == pTable.end()) {
|
if (iter == pTable.end()) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -37,9 +37,9 @@
|
||||||
#define __PAGE_TABLE__
|
#define __PAGE_TABLE__
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <map>
|
|
||||||
|
|
||||||
#include "arch/isa_traits.hh"
|
#include "arch/isa_traits.hh"
|
||||||
|
#include "base/hashmap.hh"
|
||||||
#include "base/trace.hh"
|
#include "base/trace.hh"
|
||||||
#include "mem/request.hh"
|
#include "mem/request.hh"
|
||||||
#include "mem/packet.hh"
|
#include "mem/packet.hh"
|
||||||
|
@ -53,7 +53,14 @@ class System;
|
||||||
class PageTable
|
class PageTable
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
std::map<Addr,Addr> pTable;
|
m5::hash_map<Addr,Addr> pTable;
|
||||||
|
|
||||||
|
struct cacheElement {
|
||||||
|
Addr paddr;
|
||||||
|
Addr vaddr;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
struct cacheElement pTableCache[3];
|
||||||
|
|
||||||
const Addr pageSize;
|
const Addr pageSize;
|
||||||
const Addr offsetMask;
|
const Addr offsetMask;
|
||||||
|
|
Loading…
Reference in a new issue