savu() retu()

Download Report

Transcript savu() retu()

제25강 : Context Switching in pdp/unix, savu() retu()
Context Switching in pdp/unix
savu() retu()
1
sh
vi
sim
CPU
a.out i
a.out j
a.out k
u-stack
u-stack
u-stack
user
k-stack
user
k-stack
user
k-stack
R0
R1
|
SP
EP
savu( )
PAR PDR
SP,EP
KERNEL
proc[i]
proc[j]
proc[k] …
Kernel a.out
1.
Process-k was running so far
2.
We will run process-j next
3. Save current EP & SP in struct user
savu (u.u_rsav)
** no need to save ppda address
** Pk’s struct user saved EP & SP
2
sh
vi
sim
a.out i
a.out j
a.out k
u-stack
u-stack
u-stack
user
k-stack
user
k-stack
user
k-stack
CPU
PAR PDR
R0
R1
|
SP
EP
KERNEL
1. Process-k was running so far
proc[i]
proc[j]
proc[k] …
Kernel a.out
2. We will run process-j next
3. Save current EP & SP in struct
user
savu (u.u_rsav)
4.
5.
Choose next proc[j] to run
retu (proc[j] . p_addr)
loads Kernel 7th PAR  p_addr
3
CPU(SP, EP)  u.u_rsav
sh
vi
sim
a.out i
a.out j
a.out k
u-stack
u-stack
u-stack
user
k-stack
user
k-stack
user
k-stack
retu( )
CPU
PAR PDR
R0
R1
|
SP
EP
EP SP
ppda
ppda
KERNEL
p_addr
proc[i]
proc[j]
proc[k] …
Kernel a.out
1. Process-k was running so far
2. We will run process-j next
3. Save current EP & SP in struct
user
savu (u.u_rsav)
Now kernel is ready to work for new proc[j]
4. Choose next proc[j] to run
now kernel is pointing
to new image (vi’s a.out)
5. retu (proc[j] . p_addr)
to new struct user (vi’s environment)
loads Kernel 7th PAR  p_addr
(just say “u” and it’s new user struct now)
4
to new kernel stack (vi’s kernel history)
CPU(SP, EP)  u.u_rsav
summary
retu()
assembler procedure (8-2-1)
a.out
PAR PDR
proc[i].p_addr
load new ppda
from proc[ ]
user
kernel
stack
k-stack
struct user u.u_rsav[]
load SP & EP
bottom = ppda
EP
SP
5
summary
savu()
assembler procedure (8-2-1)
a.out
X
proc[i].p_addr
PAR PDR
don’t need this
proc[ ] already has it
user
kernel
stack
struct user u.u_rsav[]
save SP & EP
bottom = ppda =proc[]
k-stack
EP
SP
6
savu retu call trap()
r5 = EP
r6 = SP
r7 = PC
7
Summary
Context Switching
PAR PDR
text
data
calls savu()
for retiring process
CPU(SP, EP)
 u .u_rsav
calls retu()
for arising process
kernel’s 7th-page
 proc[new]
CPU(SP,EP)
 u .u_rsav
kernel
code
user
KERNEL
ppda
kernel
stack
for
PAR PDR
user
text
SP
EP
swappable
data
segment
data
stack
USER
8
• Assembler procedures (8-2-1)
– savu() + retu()
co-routine jump
• savu (u.u_rsav)save kernel SP EP => u.u_rsav (save)
Retiring process
(omit saving ppda addr – since it’s in p_addr)
Arising
process
• retu (proc[i].p_addr)
– aretu() + return
7-th kernel address reg. => new ppda
CPU kernel SP, EP <= from u.u_rsav
non-local goto
• aretu(x)
SP EP <= X (new stack frame)
• then “return” instruction
(pop return address)
To where? Not to immediate caller …
to whatever that was stored in stack before
9