620 likes | 755 Views
The Minimal Instruction Set Computer (MISC) in Java: Demonstration of Operating System Concepts. Kirk Scott Computer Science The University of Alaska Anchorage. Overall Plan of Overheads. These overheads fall into 3 sections: 1. An explanation of MISC in general
E N D
The Minimal Instruction Set Computer (MISC) in Java:Demonstration of Operating System Concepts Kirk Scott Computer Science The University of Alaska Anchorage
Overall Plan of Overheads • These overheads fall into 3 sections: • 1. An explanation of MISC in general • 2. Modifications to MISC • 3. What is the Point of This?
An Introduction to MISC • MISC is a Java simulation of a simple CPU • The simulation includes a simple machine language • Machine programs can be written in this language
MISC contains a simple operating system • The operating system functions are written in Java as part of the simulation • In MISC, absolute machine code is loaded at memory address 0 and executed there • Program loading and execution in MISC can be modified in several ways
The Basic Structure of MISC • Bytes and registers • Bytes, words, and memory • General remarks on machine instruction execution • Fetch, decode, and execute • The machine language instruction set
The Basic Structure, Continued • General remarks on the form of machine language • An example program • The Java methods comprising the simulation • The command line interface • A summary of the structure of the Java simulation by class, constructor, and method
Bytes and Registers • The MISC architecture makes use of 4 byte words • The contents of a register are modeled by an object containing a character array of 8 bytes
Each bit is modeled by the presence of the character ‘1’ or the character ‘0’ in a position in an 8 byte array • The registers are packaged together in an array named “reg” • The index of the array identifies the particular register
Registers: • register name decimal index binary code • identification in reg array of index • unusedreg[0] "00000000" • general purpose • Areg[1] "00000001" • Breg[2] "00000010" • Creg[3] "00000011" • Dreg[4] "00000100"
Registers, cont’d.: • register name decimal index binary code • identification in reg array of index • memory offsets • codeoffsetreg[5] "00000101" • dataoffsetreg[6] "00000110" • unused1 reg[7] "00000111" • unused2 reg[8] "00001000" • unused3 reg[9] "00001001" • flag reg[10] "00001010"
Registers, cont’d.: • register name decimal index binary code • identification in reg array of index • control unit registers • instruction reg[11] "00001011" • operand1 reg[12] "00001100" • operand2 reg[13] "00001101" • extra reg[14] "00001110" • ALU registers • aluinreg1 reg[15] "00001111" • aluinreg2 reg[16] "00010000" • aluoutregreg[17] "00010001"
Bytes, Words, and Memory • A word in MISC consists of 4 bytes • Memory is implemented as an array of words • The index of the array is the word offset into memory • Memory: array name • memory[]
General Remarks on Machine Instruction Execution • These are the general rules for move and arithmetic instructions • A register or a memory variable can be a destination • A constant, a register, or a memory variable can be a source • Memory to memory operations are not allowed
Fetch, Decode, and Execute • A program is loaded to memory location 0 by default • The machine takes control of execution • The machine steps through the program code until it encounters an empty (“00000000”) instruction byte
Execution starts with the value 0 in the code offset register • The next 4 contiguous bytes of code memory are put into the instruction, operand1, operand2, and extra registers • After the retrieval of each instruction the code offset is incremented for the next retrieval
The Machine Language Instruction Set • The MOVE Instruction • assembly instruction method in simulation machine instruction • MOVE register, registervoid moveDestRegSrcReg() “10000001” • MOVE memory, register void moveToMemFromReg() “10000010” • MOVE register, memory void movetoregfrommem() “10000011” • MOVE memory, constant void movetomemfromconst() “10000100” • MOVE register, constant void movetoregfromconst() “10000101”
The ADD Instruction • assembly instruction method in simulation machine instruction • ADD register, register void addDestRegSrcReg() “10000110” • ADD memory, register void addToMemFromReg() “10000111” • ADD register, memory void addToRegFromMem() “10001000” • ADD memory, constant void addToMemFromConst() “10001001” • ADD register, constant void addToRegFromConst() “10001010”
The SUB Instruction • assembly instruction method in simulation machine instruction • SUB register, register void subDestRegSrcReg() “10001011” • SUB memory, register void subFromMemSrcReg() “10001100” • SUB register, memory void subFromRegSrcMem() “10001101” • SUB memory, constant void subFromMemSrcConst() “10001110” • SUB register, constant void subFromRegSrcConst() “10001111”
The JUMP Instruction • assembly instruction method in simulation machine instruction • JMP unsigned integer void jumpUnconditional() “10010000” • JPOS unsigned integer void jumpOnPositive() “10010001” • JNEG unsigned integer void jumpOnNegative() “10010010” • JZERO unsigned integer void jumpOnZero() “10010011” • JOVER unsigned integer void jumpOnOverflow() “10010100”
General Remarks on the Form of Machine Language • The data declarations come first, then the program code • The program will be loaded at offset 0 • Words 0-7 are reserved for data variables and will be filled with 0’s if there are not that many variables • No program, including data, can be longer than 31 lines • The source file signals termination with a row of asterisks
Data Declaration Line • Byte 1: value • Bytes 2-4: unused • Line of Code • Byte 1: instruction • Byte 2: operand 1 • Byte 3: operand 2 • Byte 4: unused
An Example Machine Language Program • The example is a machine language program that sums the first 10 integers • The machine language alone with artificial line breaks and segment labels follows • The *’s are used on input to detect the end of the program.
data segment • 00001011000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000
code segment • 10000101000001000000000100000000 • 10000111000000010000010000000000 • 10001010000001000000000100000000 • 10000011000000110000000000000000 • 10001011000000110000010000000000 • 10010001000010010000000000000000 • ********************************
The Example Program Data Segment with Assembly Language Guide • /.DATA/// • 00001011 00000000 00000000 00000000 • /LOOPLIM/X0B// • loop limit offset 0, value 11 • 00000000 00000000 00000000 00000000 • /ACCUM/X00// • accumulator offset 1, value 0
The Example Program Code Segment with Assembly Language Guide • /.CODE/// • 10000101 00000100 00000001 00000000 • /MOVE/D/X01/ • move reg D, const 1 • movetoregfromconst 4, 1 • /.LABEL/LOOPTOP// • 10000111 00000001 00000100 00000000 • /ADD/ACCUM/D/ • (LABEL) add data offset 1, reg D • addtomemfromreg 1, 4
10001010 00000100 00000001 00000000 • /ADD/D/X01/ • add reg D, 1 • addtoregfromconst 4, 1 • 10000011 00000011 00000000 00000000 • /MOVE/C/LOOPLIM/ • move reg C, data offset 0 • movetoregfrommem 3, 0
10001011 00000011 00000100 00000000 • /SUB/C/D/ • sub reg C, reg D • subtractdestregsrcreg 3, 4 • 10010001 00001001 00000000 00000000 • /JPOS/LOOPTOP// • Since space is reserved for 8 variables, the first instruction comes at word 8. • jump on positive to “LABEL” • jumponpositive 9 • ******** ******** ******** ******** • /.END///
The Java Files Comprising the Simulation • The simulation consists of 4 java files: • MachineWord.java • Machine.java • Osystem.java • MachineOSProgram.java • MachineOSProgram contains main()
The Command Line Interface • MISC presents these 3 command prompts: • rpf (run program file) • dmc (dump memory contents) • exit
rpf • rpf = run program file • This prompts the user for the machine language program to run • Machine language programs should be text files
dmc • dmc = dump machine contents • This prompts the user for the name of the output file to create • This should be a text file • MISC has no I/O capabilities • You know what a program did by looking at the dmc file
exit • exit = quit the simulation
A Summary of the Structure of the Java Simulation by Class, Constructor, and Method • MachineByte.java • MachineWord.java • Machine.java • This is the heart of the simulation • It contains these critical methods: • totalReset() • resetOffsets() • takeControl()
Osystem.java • This has a constructor in which a copy of the Machine is constructed • It contains these critical methods: • runProgramFile() • dumpMemoryContents()
MachineOSProgram.java • This contains the main() method • It is the simulation driver • In it a copy of the Osystem is constructed • It loops, checking for user input from the command prompt
MyTerminalIO • This presents the command prompt in a graphical user interface
2. Modifications to MISC • MISC can be modified to illustrate these operating system concepts: • Memory allocation • Absolute code • Relative code • Concurrency and scheduling
By default, programs in MISC are loaded and executed at address 0 in memory • The following overhead shows a dmc file after running the example program
memory contents • 00001011000000000000000000000000 • 00110111000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 10000101000001000000000100000000 • 10000111000000010000010000000000 • 10001010000001000000000100000000 • 10000011000000110000000000000000 • 10001011000000110000010000000000 • 10010001000010010000000000000000 • 00000000000000000000000000000000 • …
Modifications to MISC Which Illustrate Operating System Concepts • Here are three possible modifications to MISC: • 1. Load machine programs at addresses other than 0 • Modify relative code to absolute code for a non-zero address • 2. Load machine programs at addresses other than 0 with dynamic address checking • Load relative code and modify the simulation to check memory accesses
3. Load and run more than one machine program at a time • This builds on modification 2 • Memory accesses for each loaded program have to be correctly handled • Execution of multiple programs also involves scheduling
Modification 1 • Support program loading at an address other than 0 • Alter the machine program code at load time • Memory address references are changed to correspond with the load address • The loaded program is absolute code for the new address • The following overhead shows a dmc file after running the example program with these modifications
memory contents • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • … • 00001011000000000000000000000000 • 00110111000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 10000101000001000000000100000000 • 10000111001000010000010000000000 • 10001010000001000000000100000000 • 10000011000000110010000000000000 • 10001011000000110000010000000000 • 10010001001010010000000000000000 • 00000000000000000000000000000000 • …
Modification 2 • Support program loading at an address other than 0 • Do not alter the machine program code at load time • A machine language program is loaded to an address other than 0 • The machine code is relative code
Each time the running machine program wants to do a memory access, it returns the relative address in the machine code to the operating system • The operating system checks to see if it’s within range
The operating system adds the memory access to the base address where the program was loaded • The operating system passes this absolute address back to the machine for program memory access • The following overhead shows a dmc file after running the example program with these modifications • It looks no different from the previous modification
memory contents • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • … • 00001011000000000000000000000000 • 00110111000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 00000000000000000000000000000000 • 10000101000001000000000100000000 • 10000111001000010000010000000000 • 10001010000001000000000100000000 • 10000011000000110010000000000000 • 10001011000000110000010000000000 • 10010001001010010000000000000000 • 00000000000000000000000000000000 • …
Modification 3 • Modify MISC to load and run more than one machine language program concurrently • Round robin scheduling can be implemented • Instead of time-slicing, use instruction counts • Switch between from one machine program to another when it has executed a fixed number of instructions • Note that threading of command prompt input is necessary to accomplish this