我在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块实际检查了什么?
答案 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()
看起来像是返回TranslationEntry
或null
。如果第一部分为真,则需要首先检查null
,因为||
语句的第二部分未被评估。如果省略null
的此测试,f.valid
会引发空指针异常。
现在:else if( f != null )
:
如果f为null或f无效,则第一个if语句为false。要知道发生了哪种情况,你必须测试其中的一个。您也可以测试if( f.valid == true )
但是,和以前一样,这可能会引发空指针异常。所以这真正要求的是:if( f != null && f.valid == true )
。