1

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

其次,名称 translateInt、finalizePhysical 对代码中发生的事情有何暗示。

最后,函数 req->setpaddr() 参数背后的直觉适用于不同的情况,例如在前缀匹配 IntAddrPrefixMSR 的情况下与 MiscReg 相乘。

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;
4

0 回答 0