1 // Per-CPU state
2 struct cpu {
3 uchar apicid; // Local APIC ID
4 struct context *scheduler; // swtch() here to enter scheduler
5 struct taskstate ts; // Used by x86 to find stack for interrupt
6 struct segdesc gdt[NSEGS]; // x86 global descriptor table
7 volatile uint started; // Has the CPU started?
8 int ncli; // Depth of pushcli nesting.
9 int intena; // Were interrupts enabled before pushcli?
10 struct proc *proc; // The process running on this cpu or null
11 };
12
13 extern struct cpu cpus[NCPU];
14 extern int ncpu;
15
16 //PAGEBREAK: 17
17 // Saved registers for kernel context switches.
18 // Don't need to save all the segment registers (%cs, etc),
19 // because they are constant across kernel contexts.
20 // Don't need to save %eax, %ecx, %edx, because the
21 // x86 convention is that the caller has saved them.
22 // Contexts are stored at the bottom of the stack they
23 // describe; the stack pointer is the address of the context.
24 // The layout of the context matches the layout of the stack in swtch.S
25 // at the "Switch stacks" comment. Switch doesn't save eip explicitly,
26 // but it is on the stack and allocproc() manipulates it.
27 struct context {
28 uint edi;
29 uint esi;
30 uint ebx;
31 uint ebp;
32 uint eip;
33 };
34
35 enum procstate { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE };
36
37 // Per-process state
38 struct proc {
39 uint sz; // Size of process memory (bytes)
40 pde_t* pgdir; // Page table
41 char *kstack; // Bottom of kernel stack for this process
42 enum procstate state; // Process state
43 int pid; // Process ID
44 struct proc *parent; // Parent process
45 struct trapframe *tf; // Trap frame for current syscall
46 struct context *context; // swtch() here to run process
47 void *chan; // If non-zero, sleeping on chan
48 int killed; // If non-zero, have been killed
49 struct file *ofile[NOFILE]; // Open files
50 struct inode *cwd; // Current directory
51 char name[16]; // Process name (debugging)
52 };
53
54 // Process memory is laid out contiguously, low addresses first:
55 // text
56 // original data and bss
57 // fixed-size stack
58 // expandable heap