⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 console.cc

📁 Nachos是个教学用的小型操作系统
💻 CC
字号:
// console.cc //	Routines to simulate a serial port to a console device.//	A console has input (a keyboard) and output (a display).//	These are each simulated by operations on UNIX files.//	The simulated device is asynchronous, so we have to invoke //	the interrupt handler (after a simulated delay), to signal that //	a byte has arrived and/or that a written byte has departed.////  DO NOT CHANGE -- part of the machine emulation//// Copyright (c) 1992-1996 The Regents of the University of California.// All rights reserved.  See copyright.h for copyright notice and limitation // of liability and disclaimer of warranty provisions.#include "copyright.h"#include "console.h"#include "main.h"//----------------------------------------------------------------------// ConsoleInput::ConsoleInput// 	Initialize the simulation of the input for a hardware console device.////	"readFile" -- UNIX file simulating the keyboard (NULL -> use stdin)// 	"toCall" is the interrupt handler to call when a character arrives//		from the keyboard//----------------------------------------------------------------------ConsoleInput::ConsoleInput(char *readFile, CallBackObj *toCall){    if (readFile == NULL)	readFileNo = 0;					// keyboard = stdin    else    	readFileNo = OpenForReadWrite(readFile, TRUE);	// should be read-only    // set up the stuff to emulate asynchronous interrupts    callWhenAvail = toCall;    incoming = EOF;    // start polling for incoming keystrokes    kernel->interrupt->Schedule(this, ConsoleTime, ConsoleReadInt);}//----------------------------------------------------------------------// ConsoleInput::~ConsoleInput// 	Clean up console input emulation//----------------------------------------------------------------------ConsoleInput::~ConsoleInput(){    if (readFileNo != 0)	Close(readFileNo);}//----------------------------------------------------------------------// ConsoleInput::CallBack()// 	Simulator calls this when a character may be available to be//	read in from the simulated keyboard (eg, the user typed something).////	First check to make sure character is available.//	Then invoke the "callBack" registered by whoever wants the character.//----------------------------------------------------------------------voidConsoleInput::CallBack(){  char c;  int readCount;    ASSERT(incoming == EOF);    if (!PollFile(readFileNo)) { // nothing to be read        // schedule the next time to poll for a packet        kernel->interrupt->Schedule(this, ConsoleTime, ConsoleReadInt);    } else {     	// otherwise, try to read a character    	readCount = ReadPartial(readFileNo, &c, sizeof(char));	if (readCount == 0) {	   // this seems to happen at end of file, when the	   // console input is a regular file	   // don't schedule an interrupt, since there will never	   // be any more input	   // just do nothing....	}	else {	  // save the character and notify the OS that	  // it is available	  ASSERT(readCount == sizeof(char));	  incoming = c;	  kernel->stats->numConsoleCharsRead++;	}	callWhenAvail->CallBack();    }}//----------------------------------------------------------------------// ConsoleInput::GetChar()// 	Read a character from the input buffer, if there is any there.//	Either return the character, or EOF if none buffered.//----------------------------------------------------------------------charConsoleInput::GetChar(){   char ch = incoming;   if (incoming != EOF) {	// schedule when next char will arrive       kernel->interrupt->Schedule(this, ConsoleTime, ConsoleReadInt);   }   incoming = EOF;   return ch;}//----------------------------------------------------------------------// ConsoleOutput::ConsoleOutput// 	Initialize the simulation of the output for a hardware console device.////	"writeFile" -- UNIX file simulating the display (NULL -> use stdout)// 	"toCall" is the interrupt handler to call when a write to //	the display completes.//----------------------------------------------------------------------ConsoleOutput::ConsoleOutput(char *writeFile, CallBackObj *toCall){    if (writeFile == NULL)	writeFileNo = 1;				// display = stdout    else    	writeFileNo = OpenForWrite(writeFile);    callWhenDone = toCall;    putBusy = FALSE;}//----------------------------------------------------------------------// ConsoleOutput::~ConsoleOutput// 	Clean up console output emulation//----------------------------------------------------------------------ConsoleOutput::~ConsoleOutput(){    if (writeFileNo != 1)	Close(writeFileNo);}//----------------------------------------------------------------------// ConsoleOutput::CallBack()// 	Simulator calls this when the next character can be output to the//	display.//----------------------------------------------------------------------voidConsoleOutput::CallBack(){    putBusy = FALSE;    kernel->stats->numConsoleCharsWritten++;    callWhenDone->CallBack();}//----------------------------------------------------------------------// ConsoleOutput::PutChar()// 	Write a character to the simulated display, schedule an interrupt //	to occur in the future, and return.//----------------------------------------------------------------------voidConsoleOutput::PutChar(char ch){    ASSERT(putBusy == FALSE);    WriteFile(writeFileNo, &ch, sizeof(char));    putBusy = TRUE;    kernel->interrupt->Schedule(this, ConsoleTime, ConsoleWriteInt);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -