+ All Categories
Home > Documents > Kernel Privileged mode Unprivileged mode · 2015-10-06 · Kernel Privileged mode Unprivileged mode...

Kernel Privileged mode Unprivileged mode · 2015-10-06 · Kernel Privileged mode Unprivileged mode...

Date post: 21-May-2020
Category:
Upload: others
View: 30 times
Download: 2 times
Share this document with a friend
21
Kernel Process 1 Process 2 Process 3 Process 4 Privileged mode Unprivileged mode
Transcript

Kernel

Process 1 Process 2 Process 3 Process 4

Privileged mode

Unprivileged mode

Kernel Privileged mode

Unprivileged mode

Application stack frames

Stack 1 Code

close(…)

Process cannot call a kernel function directly. Kernel memory is protected.

Kernel Privileged mode

Unprivileged mode

Application stack frames

Stack 1 Code

close(…)

close(…)

Calls close in userspace system call library

Kernel Privileged mode

Unprivileged mode

Application stack frames

Stack 1 Code

close(…)

li a0,999

li v0,49

syscall close(…)

Calls close in userspace system call library

Load call param

Set the syscall #

Application stack frames

Stack 1 Code

common_exception

(switches to the kernel stack for this thread)

… close(…)

Kernel stack 1

0x80000080

Application stack frames

Stack 1 Code

common_exception

(switches to the kernel stack for this thread)

(Saves the stack’s complete processor state into a trap frame)

close(…)

Kernel stack 1

0x80000080 trap frame

Application stack frames

Stack 1

close(…)

Kernel stack 1

trap frame

mips_trap(…)

• Check whether this is an exception, interrupt, or system call (all handled by mips_trap).

• If it is not an interrupt, turn

interrupts back on.

Application stack frames

Stack 1

close(…)

Kernel stack 1

trap frame

mips_trap(…)

syscall(…)

Application stack frames

Stack 1

close(…)

Kernel stack 1

trap frame

mips_trap(…)

syscall(…)

sys_close(…)

Application stack frames

Stack 1

close(…)

Kernel stack 1

trap frame

mips_trap(…)

syscall(…)

sys_close(…) Timer interrupt!

Application stack frames

Stack 1

close(…)

Kernel stack 1

trap frame

mips_trap(…)

syscall(…)

sys_close(…)

trap frame

Application stack frames

Stack 1

close(…)

Kernel stack 1

trap frame

mips_trap(…)

syscall(…)

sys_close(…)

trap frame

mips_trap(…)

thread_yield

thread_switch

switch frame

Application stack frames

Stack 1

close(…)

Kernel stack 1:1

trap frame

mips_trap(…)

syscall(…)

sys_close(…)

trap frame

mips_trap(…)

thread_yield

thread_switch

switch frame

Kernel stack 2:1

trap frame

mips_trap(…)

thread_yield

thread_switch

switch frame

Application stack frames

Stack 1

Process 1 Process 2

Application stack frames

Stack 1

close(…)

Kernel stack 1:1

trap frame

mips_trap(…)

syscall(…)

sys_close(…)

trap frame

mips_trap(…)

thread_yield

thread_switch

switch frame

Kernel stack 2:1

trap frame

mips_trap(…)

thread_yield

Application stack frames

Stack 1

Process 1 Process 2

Application stack frames

Stack 1

close(…)

Kernel stack 1:1

trap frame

mips_trap(…)

syscall(…)

sys_close(…)

trap frame

mips_trap(…)

thread_yield

thread_switch

switch frame

Kernel stack 2:1

trap frame

mips_trap(…)

Application stack frames

Stack 1

Process 1 Process 2

Application stack frames

Stack 1

close(…)

Kernel stack 1:1

trap frame

mips_trap(…)

syscall(…)

sys_close(…)

trap frame

mips_trap(…)

thread_yield

thread_switch

switch frame

Kernel stack 2:1

Application stack frames

Stack 1

Process 1 Process 2 Back to user space. Thread in process 2 resumes.

Application stack frames

Stack 1

close(…)

Kernel stack 1

trap frame

mips_trap(…)

syscall(…)

sys_close(…)

Let’s go back and assume the interrupt never happened.

Application stack frames

Stack 1

close(…)

Kernel stack 1

trap frame

mips_trap(…)

syscall(…)

When syscall returns, it modifies register values stored in the trap_frame.

Stores success flag in a3 and return value/error code in v0

Application stack frames

Stack 1

close(…)

Kernel stack 1

trap frame

mips_trap(…)

Eventually returns control to the user-space application.

Application stack frames

Stack 1

close(…)

Kernel stack 1

Eventually returns control to the user-space application.

Code

common_exception

jr k0 (jump back to the thread’s code)

rfe (Return From Exception: Sets the CPU back to unprivileged mode. Note that this is in the delay slot)

0x80000080

Application stack frames

Stack 1 Kernel stack 1

Returns from the user-space system call library back to the application code.


Recommended