1 User-Level Processes Needed to test the system call you implement The “Noff” format file required –Look at the Makefile in test MIPS “syscall” instruction invokes the routine RaiseException
2 How does it work?
3 How does it work? (cont.)
4 Related Nachos Codes test/start.s – Startup assembly code for every user program of Nachos. syscall.h –Definitions of the system call prototypes exception.cc –The handler for system calls and other exceptions is here.
5 Directories of Nachos Main directories –filesys –machine –network –threads –userprog Test programs –test
6 Related Files Major –test/start.s The code that starts the program execution –userprog/syscall.h Defines the system call constants –userprog/execption.cc The system call handler Minor –machine/machine.h Register definitions –test/halt.c Test user program –filesys/filesys.h File system definitions –filesys/filesys.cc Stub implementation –filesys/openfile.h –filesys/openfile.cc
7 Some Public Variables for the Kernel register: an array of 40 registers –Declared in machine/machine.h mainMemory: memory is byte- addressable and organized into 128-byte pages –Declared in machine/machine.h
8 Starting of a User Program test/start.s –Define what is needed for a user program. starting point system call startup assembly code of every user program of Nachos –Initialize and run a C program by jumping to location 0.
9 Exception Types Execution errors System calls …
10 The Progress of a System Call in a User Program The user program is responsible for –storing of the system codes in Register 2 –storing of the arguments in Register 4,5, 6, and 7. ExceptionHandler fetches the number for the system call in Register 2. Execute the corresponding codes for the system call. Increase the PC. –See the register definitions in machine.h
11 Declaring of System Call userprog/syscall.h –system call codes Ex: #define SC_Exit1 –Interface for Nachos system calls Ex: void Exit(int status);
12 The Entry Point into the Nachos Kernel ExceptionHandler –userprog/execption.cc Entry point into the Nachos kernel from user programs. –syscall –exceptions
13 The Entry Point into the Nachos Kernel (cont.) The code for the system call is placed in Register 2. arg –arg1 is in Register 4. –arg2 is in Register 5. –arg3 is in Register 6. –arg4 is in Register 7. The return value is in Register 2. Note –If you are handling a system call, don't forget to increment the pc before return to the user program.
14 Getting or Setting of the Data in a Register The function body is in machine/machine.cc. Kernel machine ReadRegister(x) –x is the register number. –The return type is the integer type. Kernel machine WriteRegister(x,y) –x is the register number. –y is the value.
15 Example: system call add(arg1,arg2) Retrieve the two arguments by –op1=(int)kernel machine ReadRegister(4) –op2=(int)kernel machine ReadRegister(5) Set the return value by –Kernel machine WriteRegister(2, (int)result)
16 Example: system call add(arg1,arg2) (cont.) Modify the return point by –Setting the previous PC (for debugging) kernel machine WriteRegister( PrevPCReg, kernel machine ReadRegister(PCReg)); –Setting the PC to the next instruction (all instructions are 4 byte wide) kernel machine WriteRegister( PCReg, kernel machine ReadRegister(PCReg) + 4); –Setting the next PC for a branch execution kernel->machine->WriteRegister( NextPCReg, kernel->machine->ReadRegister(PCReg)+4);
17 How If an Argument is an Char Array? Retrieve the logical address with –kernel->machine->ReadRegister(?) Retrieve the data with –kernel->machine->ReadMem(int x, int y, int *z) It is declared in ~/code/machine/machine.h and implemented in ~/code/machine/translate.cc. x is the virtual address to read from. y is the number of bytes to read (1, 2, or 4). z is the place to write the result.
18 kernel->machine->ReadMem Translate a virtual address into a physical address by –Translate(int virtAddr, int* physAddr, int size, bool writing) virtAddr: the virtual address to translate physAddr: the place to store the physical address size: the amount of memory being read or written writing: if TRUE, check the "read-only" bit in the TLB
19 Run Your Program Normal mode: –”./nachos –x../test/XXX” Debugger mode: –”./nachos –d../test/XXX”
20 Example Exit() void ExceptionHandler(ExceptionType which) { int type = machine->ReadRegister(2); if ((which == SyscallException) && (type == SC_Halt)) { DEBUG('a', "Shutdown, initiated by user program.\n"); interrupt->Halt(); }if ((which == SyscallException) && (type == SC_Exit)) { /* newly added system call EXIT */ //get the first argument int a4 = machine->ReadRegister(4); printf("\n\n\tNEW SYSCALL: you are in EXIT.\n\n\tThe return value you passed is --> %d\n\n\t The current thread will terminate...\n\n\n", a4); currentThread->Finish(); } else { printf("Unexpected user mode exception %d %d\n", which, type); ASSERT(FALSE); } }