Either user-level or system-level simulators requires to support some of the tasks performed by the target operating system.
User-level simulators do not simulate the whole operating system. To perform some ISA instructions like the system calls, it requires some additional System Capabilities mimicking the system behavior, or the ability to handle pthreads in the simulated program.
System-level simulators are simulating the whole operating system, so they do not rely on such translation to the native host. However some part of the hardware software such as the bios also needs to be executed / simulated.
User-level simulators focus on simulating the user-space part of the target ISA, such as computation instructions, load/stores, branches and so on... Such simulator usually do not implement complex scheduling techniques, running a single thread over a single processor dedicated to this only thread.
However, to simulate at user-level even a simple benchmark, it is required to implement tasks that are indeed dedicated to the target OS, like performing the simulated System Calls natively, or being able to simulate several threads on a CMP architecture.
So far, we have developed the following OS capabilities:
Full System simulators are simulating the full OS of the target architecture. Such simulators does not require some translation to the native operating system as user-level simu:lators does, however they have additional requirements tied to the booting or the target operating system: