System calls are a way for unprivileged, user applications to request services from the kernel. In the RISC-V architecture, we invoke the call using the
ecall
instruction. This will cause the CPU to halt what it’s doing, elevate privilege modes, and then jump to whatever function handler is stored in themtvec
(machine trap vector) register. Remember, this is the “funnel” where all traps are handled, including our system calls.We have to set up our convention for handling system calls. We can use a convention that already exists, so we can interface with a library, such as newlib. But, let’s make this ours! We get to say what the system call numbers are, and where they will be when we execute a system call.
This is part 7 in a long series about writing a RISC-V operating system in Rust.