summaryrefslogtreecommitdiff
path: root/proc.h
diff options
context:
space:
mode:
Diffstat (limited to 'proc.h')
-rw-r--r--proc.h64
1 files changed, 32 insertions, 32 deletions
diff --git a/proc.h b/proc.h
index 7d97dfa..7ffaffb 100644
--- a/proc.h
+++ b/proc.h
@@ -8,6 +8,36 @@
#define SEG_TSS 6 // this process's task state
#define NSEGS 7
+// Per-CPU state
+struct cpu {
+ uchar id; // Local APIC ID; index into cpus[] below
+ struct context *scheduler; // swtch() here to enter scheduler
+ struct taskstate ts; // Used by x86 to find stack for interrupt
+ struct segdesc gdt[NSEGS]; // x86 global descriptor table
+ volatile uint booted; // Has the CPU started?
+ int ncli; // Depth of pushcli nesting.
+ int intena; // Were interrupts enabled before pushcli?
+
+ // Cpu-local storage variables; see below
+ struct cpu *cpu;
+ struct proc *proc; // The currently-running process.
+};
+
+extern struct cpu cpus[NCPU];
+extern int ncpu;
+
+// Per-CPU variables, holding pointers to the
+// current cpu and to the current process.
+// The asm suffix tells gcc to use "%gs:0" to refer to cpu
+// and "%gs:4" to refer to proc. seginit sets up the
+// %gs segment register so that %gs refers to the memory
+// holding those two variables in the local cpu's struct cpu.
+// This is similar to how thread-local variables are implemented
+// in thread libraries such as Linux pthreads.
+extern struct cpu *cpu asm("%gs:0"); // &cpus[cpunum()]
+extern struct proc *proc asm("%gs:4"); // cpus[cpunum()].proc
+
+//PAGEBREAK: 17
// Saved registers for kernel context switches.
// Don't need to save all the segment registers (%cs, etc),
// because they are constant across kernel contexts.
@@ -31,13 +61,13 @@ enum procstate { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE };
// Per-process state
struct proc {
uint sz; // Size of process memory (bytes)
- pde_t* pgdir; // Linear address of proc's pgdir
+ pde_t* pgdir; // Page table
char *kstack; // Bottom of kernel stack for this process
enum procstate state; // Process state
volatile int pid; // Process ID
struct proc *parent; // Parent process
struct trapframe *tf; // Trap frame for current syscall
- struct context *context; // Switch here to run process
+ struct context *context; // swtch() here to run process
void *chan; // If non-zero, sleeping on chan
int killed; // If non-zero, have been killed
struct file *ofile[NOFILE]; // Open files
@@ -48,35 +78,5 @@ struct proc {
// Process memory is laid out contiguously, low addresses first:
// text
// original data and bss
-// invalid page
// fixed-size stack
// expandable heap
-
-// Per-CPU state
-struct cpu {
- uchar id; // Local APIC ID; index into cpus[] below
- struct context *scheduler; // Switch here to enter scheduler
- struct taskstate ts; // Used by x86 to find stack for interrupt
- struct segdesc gdt[NSEGS]; // x86 global descriptor table
- volatile uint booted; // Has the CPU started?
- int ncli; // Depth of pushcli nesting.
- int intena; // Were interrupts enabled before pushcli?
-
- // Cpu-local storage variables; see below
- struct cpu *cpu;
- struct proc *proc;
-};
-
-extern struct cpu cpus[NCPU];
-extern int ncpu;
-
-// Per-CPU variables, holding pointers to the
-// current cpu and to the current process.
-// The asm suffix tells gcc to use "%gs:0" to refer to cpu
-// and "%gs:4" to refer to proc. ksegment sets up the
-// %gs segment register so that %gs refers to the memory
-// holding those two variables in the local cpu's struct cpu.
-// This is similar to how thread-local variables are implemented
-// in thread libraries such as Linux pthreads.
-extern struct cpu *cpu asm("%gs:0"); // This cpu.
-extern struct proc *proc asm("%gs:4"); // Current proc on this cpu.