NACHOS虚拟内存和缓存实现

时间:2015-12-17 13:44:15

标签: java operating-system tlb virtual-address-space nachos

我在java中正在做NACHOS第3阶段项目(缓存和虚拟内存)。我在实现下面给出的功能时有一些困惑:

/**
 * Restore the state of this process after a context switch. Called by
 * UThread.restoreState()
 */

public void restoreState() {
    // Invalidate all TLB entries;
    for(int i=0; i < Machine.processor().getTLBSize(); i++){
        Lib.debug(dbgVM, "Invalidating TLB on context switch.");
        TranslationEntry entry = Machine.processor().readTLBEntry(i);
        entry.valid = false;
        Machine.processor().writeTLBEntry(i, entry);
    }

    syncPageTable();
}

/**
 * Called when the process is context switched in. Synchs the process
 * pagetable with the global one so that read/writeVirtualMemory calls
 * can proceed as they would normally in the UserProcess class.
 */
private void syncPageTable(){
    for(TranslationEntry e : pageTable){
        TranslationEntry f = vmk.lookupAddress(super.getPid(), e.vpn);
        if(f == null || f.valid == false){
            e.valid = false;
        }else if(f != null){
            f.valid = true;
        }
    }
}

此处, vmk =(VMKernel)Kernel.kernel; 。我还没有理解 syncPageTable()函数。 for子句中的 TranslationEntry e:pageTable 是什么意思,if-else块实际检查了什么?

1 个答案:

答案 0 :(得分:0)

for( TranslationEntry e : pageTable ) { /* block */ }

这称为'for each'语句。它遍历pageTable中的每个TranslationEntry并执行块中的语句。当前条目名为“e”。阅读javadoc以获取更多详细信息。

形式化:

for( <type> <variable-name> : <name of the container containing <type> entries> ) {}

关于块中的语句:函数lookupAddress()看起来像是返回TranslationEntrynull。如果第一部分为真,则需要首先检查null,因为||语句的第二部分未被评估。如果省略null的此测试,f.valid会引发空指针异常。

现在:else if( f != null ): 如果f为null或f无效,则第一个if语句为false。要知道发生了哪种情况,你必须测试其中的一个。您也可以测试if( f.valid == true )但是,和以前一样,这可能会引发空指针异常。所以这真正要求的是:if( f != null && f.valid == true )