Next: Disk
Device Up: Nachos
Machine Previous: Software
Managed TLB
Console Device
Nachos provides a terminal console device and a single disk device. Nachos
devices are accessed through low-level primitives that simply initiate
an I/O operation. The operation itself is performed later, with an ``operation
complete'' interrupt notifying Nachos when the operation has completed.
The Console class simulates the behavior of a character-oriented
CRT device. Data can be written to the device one character at a time through
the PutChar() routine. When a character has successfully been transmitted,
a ``transmit complete'' interrupt takes place and the user-supplied handler
is invoked. The interrupt handler presumably checks if more characters
are waiting to be output, invoking PutChar again if appropriate.
Likewise, input characters arrive one-at-a-time. When a new character
arrives, the console device generates an interrupt and the user-supplied
input interrupt service routine is invoked to retrieve the character from
the device and (presumably) place it into a buffer from which higher-level
routines (e.g., GetChar()) can retrieve it later.
The Console object supports the following operations:
-
Console(char *readFile, char *writeFile, VoidFunctionPtr readAvail,
VoidFunctionPtr writeDone, int callArg)
-
The constructor creates an instance of a terminal console. Argument readFile
contains the Unix file name of where the data is to be read from; if NULL,
standard input is assumed. Likewise, argument writeFile indicates
where output written to the console is to go; if NULL, standard output
is assumed. When a character becomes available for reading, readAvail
is invoked with an argument of callArg to notify the Nachos that
a character is available. The character itself is retrieved by calling
Console::GetChar(). Upon return, it is assumed that the character
has been retrieved and when the next one arrives, readAvail will
be called again.
-
void PutChar(char ch)
-
Writes character ch to the output device. Once output has started,
it is an error to invoke PutChar() again before the corresponding
I/O complete interrupt has taken place. Once the console device has written
the character to the device, it invokes the user-supplied procedure writeDone
, passing it callArg as an argument.
-
char GetChar()
-
Retrieves a character from the console. GetChar returns EOF if no
new data is available. Normally, the user would not invoke GetChar
unless the availability of new data had first been signalled via the readAvail()
interrupt service routine.
-
void CheckCharAvail()
-
an internal procedure used to see if new data is available for reading.
When a console device is created by the constructor, the appropriate Unix
files (or stdin/stdout) are opened and a timer event is scheduled to take
place 100 time units in the future. When the timer expires, the routine
CheckCharAvail is invoked to see if any data is present. If so,
CheckCharAvail reads that character and invokes the user-supplied
input interrupt handler readAvail. It then schedules a new timer
event so that the process repeats every 100 time units. Thus, CheckCharAvail
simply polls every 100 clock ticks for new data, calling the interrupt
service routine whenever data is present for processing.
Device output is initiated by calling PutChar, giving it a single
character to output. Once character output has been initiated, the device
is made busy until the output complete interrupt takes place. PutChar
simply outputs the one character, sets an internal flag to indicate that
the device is busy, and then schedules a timer interrupt to take place
100 clock ticks later. When the timer expires, the state of the device
is changed from busy to idle, and the user-supplied output interrupt complete
routine is invoked. This routine would presumably invoke PutChar
if additional output characters were queued awaiting output.
|
Nachos
Tutorials
Roadmap
Source Code
Introduction
Threads
Interrupts
Synchronization
System Calls
Exception Handling
Multiprogramming
File System
Networking
Tutorials
Lab 1 Tutorial
Lab 2 Tutorial
Lab 3 Tutorial
Lab 4 Tutorial
Lab 5 Tutorial
|