为什么翻译函数可以在gem5的tlb.cc中看到任何架构?

时间:2017-07-24 10:05:02

标签: c++ gem5

首先,为什么TLB代码应该具有翻译功能?他们不应该仅使用虚拟地址进行索引并提供相应的匹配物理地址。

其次,名称translateInt是什么,finalizePhysical建议他们的代码中发生的事情。

最后,针对不同情况的函数req-> setpaddr()的参数背后的直觉,例如乘以MiscReg,就像前缀匹配IntAddrPrefixMSR一样。

else if (prefix == IntAddrPrefixMSR) {
    vaddr = (vaddr >> 3) & ~IntAddrPrefixMask;
    req->setFlags(Request::MMAPPED_IPR);

    MiscRegIndex regNum;
    if (!msrAddrToIndex(regNum, vaddr))
        return std::make_shared<GeneralProtection>(0);

    //The index is multiplied by the size of a MiscReg so that
    //any memory dependence calculations will not see these as
    //overlapping.
    req->setPaddr((Addr)regNum * sizeof(MiscReg));
    return NoFault;
} else if (prefix == IntAddrPrefixIO) {
    // TODO If CPL > IOPL or in virtual mode, check the I/O permission
    // bitmap in the TSS.

    Addr IOPort = vaddr & ~IntAddrPrefixMask;
    // Make sure the address fits in the expected 16 bit IO address
    // space.
    assert(!(IOPort & ~0xFFFF));
    if (IOPort == 0xCF8 && req->getSize() == 4) {
        req->setFlags(Request::MMAPPED_IPR);
        req->setPaddr(MISCREG_PCI_CONFIG_ADDRESS * sizeof(MiscReg));
    } else if ((IOPort & ~mask(2)) == 0xCFC) {
        req->setFlags(Request::UNCACHEABLE | Request::STRICT_ORDER);
        Addr configAddress =
            tc->readMiscRegNoEffect(MISCREG_PCI_CONFIG_ADDRESS);
        if (bits(configAddress, 31, 31)) {
            req->setPaddr(PhysAddrPrefixPciConfig |
                    mbits(configAddress, 30, 2) |
                    (IOPort & mask(2)));
        } else {
            req->setPaddr(PhysAddrPrefixIO | IOPort);
        }
    } else {
        req->setFlags(Request::UNCACHEABLE | Request::STRICT_ORDER);
        req->setPaddr(PhysAddrPrefixIO | IOPort);
    }
    return NoFault;

0 个答案:

没有答案