📄 kernel.java
字号:
}
else
{
addr = Long.parseLong(tmp);
}
if (0 > addr || addr > address_limit)
{
System.out.println("MemoryManagement: " + addr + ", Address out of range in " + commands);
System.exit(-1);
}
instructVector.addElement(new Instruction(command,addr));
}
}
}
in.close();
} catch (IOException e) { /* Handle exceptions */ }
runcycles = instructVector.size();
if ( runcycles < 1 )
{
System.out.println("MemoryManagement: no instructions present for execution.");
System.exit(-1);
}
if ( doFileLog )
{
File trace = new File(output);
trace.delete();
}
runs = 0;
for (i = 0; i < virtPageNum; i++)
{
Page page = (Page) memVector.elementAt(i);
if ( page.physical != -1 )
{
map_count++;
}
for (j = 0; j < virtPageNum; j++)
{
Page tmp_page = (Page) memVector.elementAt(j);
if (tmp_page.physical == page.physical && page.physical >= 0)
{
physical_count++;
}
}
if (physical_count > 1)
{
System.out.println("MemoryManagement: Duplicate physical page's in " + config);
System.exit(-1);
}
physical_count = 0;
}
if ( map_count < ( virtPageNum +1 ) / 2 )
{
for (i = 0; i < virtPageNum; i++)
{
Page page = (Page) memVector.elementAt(i);
if ( page.physical == -1 && map_count < ( virtPageNum + 1 ) / 2 )
{
page.physical = i;
map_count++;
}
}
}
for (i = 0; i < virtPageNum; i++)
{
Page page = (Page) memVector.elementAt(i);
if (page.physical == -1)
{
controlPanel.removePhysicalPage( i );
}
else
{
controlPanel.addPhysicalPage( i , page.physical );
}
}
for (i = 0; i < instructVector.size(); i++)
{
high = block * virtPageNum;
Instruction instruct = ( Instruction ) instructVector.elementAt( i );
if ( instruct.addr < 0 || instruct.addr > high )
{
System.out.println("MemoryManagement: Instruction (" + instruct.inst + " " + instruct.addr + ") out of bounds.");
System.exit(-1);
}
}
}
public void setControlPanel(ControlPanel newControlPanel)
{
controlPanel = newControlPanel ;
}
public void getPage(int pageNum)
{
Page page = ( Page ) memVector.elementAt( pageNum );
controlPanel.paintPage( page );
}
private void printLogFile(String message)
{
String line;
String temp = "";
File trace = new File(output);
if (trace.exists())
{
try
{
DataInputStream in = new DataInputStream( new FileInputStream( output ) );
while ((line = in.readLine()) != null) {
temp = temp + line + lineSeparator;
}
in.close();
}
catch ( IOException e )
{
/* Do nothing */
}
}
try
{
PrintStream out = new PrintStream( new FileOutputStream( output ) );
out.print( temp );
out.print( message );
out.close();
}
catch (IOException e)
{
/* Do nothing */
}
}
public void run()
{
step();
while (runs != runcycles)
{
try
{
Thread.sleep(2000);
}
catch(InterruptedException e)
{
/* Do nothing */
}
step();
}
}
public void step()
{
int i = 0;
Instruction instruct = ( Instruction ) instructVector.elementAt( runs );
controlPanel.instructionValueLabel.setText( instruct.inst );
controlPanel.addressValueLabel.setText( Long.toString( instruct.addr , addressradix ) );
getPage( Virtual2Physical.pageNum( instruct.addr , virtPageNum , block ) );
if ( controlPanel.pageFaultValueLabel.getText() == "YES" )
{
controlPanel.pageFaultValueLabel.setText( "NO" );
}
if ( instruct.inst.startsWith( "READ" ) )
{
Page page = ( Page ) memVector.elementAt( Virtual2Physical.pageNum( instruct.addr , virtPageNum , block ) );
if ( page.physical == -1 )
{
if ( doFileLog )
{
printLogFile( "READ " + Long.toString(instruct.addr , addressradix) + " ... page fault" );
}
if ( doStdoutLog )
{
System.out.println( "READ " + Long.toString(instruct.addr , addressradix) + " ... page fault" );
}
PageFault.replacePage( memVector , virtPageNum , Virtual2Physical.pageNum( instruct.addr , virtPageNum , block ) , controlPanel );
controlPanel.pageFaultValueLabel.setText( "YES" );
}
else
{
page.R = 1;
page.lastTouchTime = 0;
if ( doFileLog )
{
printLogFile( "READ " + Long.toString( instruct.addr , addressradix ) + " ... okay" );
}
if ( doStdoutLog )
{
System.out.println( "READ " + Long.toString( instruct.addr , addressradix ) + " ... okay" );
}
}
}
if ( instruct.inst.startsWith( "WRITE" ) )
{
Page page = ( Page ) memVector.elementAt( Virtual2Physical.pageNum( instruct.addr , virtPageNum , block ) );
if ( page.physical == -1 )
{
if ( doFileLog )
{
printLogFile( "WRITE " + Long.toString(instruct.addr , addressradix) + " ... page fault" );
}
if ( doStdoutLog )
{
System.out.println( "WRITE " + Long.toString(instruct.addr , addressradix) + " ... page fault" );
}
PageFault.replacePage( memVector , virtPageNum , Virtual2Physical.pageNum( instruct.addr , virtPageNum , block ) , controlPanel ); controlPanel.pageFaultValueLabel.setText( "YES" );
}
else
{
page.M = 1;
page.lastTouchTime = 0;
if ( doFileLog )
{
printLogFile( "WRITE " + Long.toString(instruct.addr , addressradix) + " ... okay" );
}
if ( doStdoutLog )
{
System.out.println( "WRITE " + Long.toString(instruct.addr , addressradix) + " ... okay" );
}
}
}
for ( i = 0; i < virtPageNum; i++ )
{
Page page = ( Page ) memVector.elementAt( i );
if ( page.R == 1 && page.lastTouchTime == 10 )
{
page.R = 0;
}
if ( page.physical != -1 )
{
page.inMemTime = page.inMemTime + 10;
page.lastTouchTime = page.lastTouchTime + 10;
}
}
runs++;
controlPanel.timeValueLabel.setText( Integer.toString( runs*10 ) + " (ns)" );
}
public void reset() {
memVector.removeAllElements();
instructVector.removeAllElements();
controlPanel.statusValueLabel.setText( "STOP" ) ;
controlPanel.timeValueLabel.setText( "0" ) ;
controlPanel.instructionValueLabel.setText( "NONE" ) ;
controlPanel.addressValueLabel.setText( "NULL" ) ;
controlPanel.pageFaultValueLabel.setText( "NO" ) ;
controlPanel.virtualPageValueLabel.setText( "x" ) ;
controlPanel.physicalPageValueLabel.setText( "0" ) ;
controlPanel.RValueLabel.setText( "0" ) ;
controlPanel.MValueLabel.setText( "0" ) ;
controlPanel.inMemTimeValueLabel.setText( "0" ) ;
controlPanel.lastTouchTimeValueLabel.setText( "0" ) ;
controlPanel.lowValueLabel.setText( "0" ) ;
controlPanel.highValueLabel.setText( "0" ) ;
init( command_file , config_file );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -