What is µMPS?
µMPS is an educational computer system architecture and an accompanying emulator designed from the ground up to achieve the right tradeoff between simplicity and elegance on one side, and realism on the other. This makes µMPS ideally suited for use in education, such as hands-on operating systems or computer architecture university courses.
The µMPS processor implements the MIPS I instruction set, and can therefore be supported out of the box by existing MIPS compilers. The architecture details a complete set of I/O devices (terminals, disks, tape readers, printers, and network adapters) that feature a clean, consistent, programming interface. The latest revision of the µMPS architectire (µMPS2) brings multiprocessor support.
The emulator comes with built-in debugging features and an easy to use graphical user interface. Apart from the emulator itself, several support utilites are provided that can get you quickly stared in developing programs for µMPS.
µMPS is free software, licensed under the GNU General Public License, version 2.
Features
Architecture Features
MIPS CPU
The µMPS integer instruction set is a strict superset of MIPS I. The extensions include a wait for interrupt instruction (a must for every modern instruction set) and read-modify-write primitives.
While fully compatible at the ISA level with real implementations of MIPS I (R2000/R3000), µMPS somewhat differs from those in the coprocessor interface. Compared to R2000/R3000 CPUs, µMPS provides simplified virtual memory management.
Multiprocessor support
The µMPS2 architecture includes (shared memory) multiprocessor support. The multiprocessor hardware interface was designed to cater simple and sophisticated uses alike; it is simple to use for programmers who only need basic multiprocessor support, but also provides advanced features (such as fine grained interrupt distribution control) for systems that require them. Up to 16 processors are supported by the architecture.
Peripheral devices
µMPS supports the following hardware devices: disks, tapes, terminals, network interfaces, and printers. The different device controllers have a simple and consistent memory-mapped I/O interface. Devices are backed by regular files by the emulator and non-volatile memory can be retained between emulation runs.
Emulator Features
-
Graphical user interface
The µMPS emulator comes with a modern, easy to use graphical user interface, built using the Qt framework. All user interactions with the emulator, from configuration of the emulated machine to debugging, are performed using the GUI.
-
Built-in debugging features
µMPS also comes with built in debugging support. Most of the features you have come to expect from a debugger are present: breakpoints, memory traces, watchpoints, and a code disassembly view. Memory content from arbitrary memory regions can be can be displayed in hexadecimal representation and edited in-place.
µMPS Versus Related Systems
µMPS versus simple MIPS processor simulators
We believe µMPS can be a replacement for the simple assembly source-level MIPS processor simulators, such as SPIM or MARS, that are widely used in introductory computer architecture or similar courses that include an assembly programming component. There are, nonetheless, striking differences between these and µMPS:
Programs such as SPIM and MARS simulate the execution of MIPS programs by interpreting some variant of MIPS assembly language. By contrast, µMPS executes actual MIPS machine code.
µMPS emulates a complete computer system, as opposed to the above systems which only simulate a processor, and possibly a console device with an ad-hoc syscall interface.
Note that, compared to simulators such as SPIM and MARS, programming for µMPS is somewhat more complex. The learning curve is not very steep, however, and there is plenty of documentation to guide you.
µMPS versus other full system emulators
Emulators such as QEMU emulate real computer systems, including their complexities. µMPS, on the other hand, was conceived primarily as a pedagogical tool and its architecture can be seen as an idealized and simplified version of existing ones. Also, because these emulators are meant to efficiently run real-world operating systems, they put first and foremost an emphasis on performance, at the cost of code complexity. The µMPS code base is, by comparison, significantly less complex and is approachable by less experienced programmers.
History, Credits, and Acknowledgments
The µMPS project has a long history. The direct predecessor of µMPS was MPS, developed at the Computer Science department of the University of Bologna by Mauro Morsiani, under the supervision of Renzo Davoli. MPS, like its descendants, is a full system emulator: it emulates a computer system comprising a single processor, a bus, and a set of peripheral devices. The emulated processor is a R2000/R3000, the original 32-bit MIPS (retrospectively MIPS I) CPU. The emulator featured a graphical user interface, implemented using the XForms toolkit, and built-in debugging functionality.
MPS was in turn inspired by CHIP (Cornell Hypothetical Instructional Processor) and the accompanying HOCA operating system project. CHIP/HOCA were used before the adoption of MPS/µMPS in the operating systems lab course at the University of Bologna, to which they were brought by Ozalp Babaoglu.
µMPS was an evolution of the original MPS project. Its design was based on experience with MPS in undergraduate operating systems courses taught by Renzo Davoli (University of Bologna) and Michael Goldweber (Xavier University). The architecture replaced the relatively complex virtual memory management subsytem of the R3000 processor with a streamlined one, easier to comprehend and program.
Tomislav Jonjic extended the µMPS architecture with multiprocessor support and took over the project maintainance; this revised architecture, referred to as µMPS2, is the one implemented by current versions of the emulator. The user interface has been completely redesigned and reimplemented using the Qt framework.
The authoritative reference on µMPS, µMPS(2) Principles of Operation, was written by Michael Goldweber and Renzo Davoli.
In addition to the implicit acknowledgments we have given above, the authors would also like to thank the numerous students who have assisted the project by testing it and by giving valuable suggestions.