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