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 |
59 | |