Simulate how a CPU with dual-mode operation executes a user program that uses system calls.
The kernel has this system-call table (like Linux x86-64):
| Number | Name |
|---|---|
| 0 | read |
| 1 | write |
| 39 | getpid |
| 57 | fork |
| 60 | exit |
| 62 | kill |
The program's process has PID 1204. Input: one instruction per line until the end of input:
add,load,store— ordinary instructions (allowed in user mode);hlt,cli,out,settimer— privileged instructions;syscall NAME— trap into the kernel with the call's number.
Execute them in order, starting in user mode. Print one line per instruction:
- ordinary:
user: add - privileged in user mode:
EXCEPTION: privileged instruction 'cli' in user mode -> process 1204 terminated, and stop (no further instructions run); syscall NAMEwith a known name:trap -> kernel: syscall 1 (write) ... return to userexcept:getpidprintstrap -> kernel: syscall 39 (getpid) returns 1204 ... return to user;forkprintstrap -> kernel: syscall 57 (fork) returns child pid 1205 ... return to user(each fork creates the next PID: 1205, 1206…);exitprintstrap -> kernel: syscall 60 (exit) -> process 1204 exitsand stops.
- unknown system call:
trap -> kernel: unknown syscall 'NAME' returns -ENOSYS ... return to user.
At the end print Mode switches: N (each trap into the kernel and each return to user mode counts as one switch; a trap that terminates the process counts only the entry) and Instructions executed: M (including the one that stopped the program).
Input:
load
syscall getpid
add
syscall write
syscall fork
cli
store
Output:
user: load
trap -> kernel: syscall 39 (getpid) returns 1204 ... return to user
user: add
trap -> kernel: syscall 1 (write) ... return to user
trap -> kernel: syscall 57 (fork) returns child pid 1205 ... return to user
EXCEPTION: privileged instruction 'cli' in user mode -> process 1204 terminated
Mode switches: 7
Instructions executed: 6