Read: swtch.S and proc.c (focus on the code that switches
between processes, specifically scheduler
and sched
).
Also process creation: sys_fork() and copyproc().
Hand-In Procedure
You are to turn in this homework during lecture. Please write up your answers to the exercises below and hand them in to a 6.828 staff member at the beginning of lecture.
Introduction
In this homework you will investigate how the kernel switches between two processes.
Assignment:
Suppose a process that is running in the kernel
calls sched()
, which ends up jumping
into scheduler()
.
Turn in:
Where is the stack that sched()
executes on?
Turn in:
Where is the stack that scheduler()
executes on?
Turn in:
When sched()
calls swtch()
,
does that call to swtch()
ever return? If so, when?
Turn in:
Why does swtch()
copy the return instruction
pointer from the stack into the
context structure, only to copy it from the context
structure to the same place on the stack
when the process is re-activated?
Why doesn't swtch()
just leave the
return instruction pointer on the stack?
Surround the call to swtch()
in schedule()
with calls
to cons_putc()
like this:
cons_putc('a'); swtch(&cpus[cpu()].context, &p->context); cons_putc('b');
Similarly,
surround the call to swtch()
in sched()
with calls
to cons_putc()
like this:
cons_putc('c'); swtch(&cp->context, &cpus[cpu()].context); cons_putc('d');
Rebuild your kernel and boot it on bochs. With a few exceptions you should see a regular four-character pattern repeated over and over.
Turn in: What is the four-character pattern?
Turn in: The very first characters are ac
. Why does
this happen?
Turn in: Near the start of the last line you should see
bc
. How could this happen?
This completes the homework.