Skip to content
Snippets Groups Projects
proc.h 2.28 KiB
Newer Older
rsc's avatar
rsc committed
// Segments in proc->gdt
#define SEG_KCODE 1  // kernel code
#define SEG_KDATA 2  // kernel data+stack
rtm's avatar
rtm committed
#define SEG_UCODE 3
#define SEG_UDATA 4
rsc's avatar
rsc committed
#define SEG_TSS   5  // this process's task state
#define NSEGS     6
rtm's avatar
rtm committed

rsc's avatar
rsc committed
// Saved registers for kernel context switches.
kolya's avatar
kolya committed
// Don't need to save all the segment registers (%cs, etc),
rsc's avatar
rsc committed
// because they are constant across kernel contexts.
kolya's avatar
kolya committed
// Stack pointer is encoded in the address of context,
// which must be placed at the bottom of the stack.
rsc's avatar
rsc committed
// The layout of context must match code in swtch.S.
struct context {
kolya's avatar
kolya committed
  uint edi;
  uint esi;
  uint ebx;
  uint ebp;
  uint eip;
enum proc_state { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE };
rtm's avatar
rtm committed

rsc's avatar
rsc committed
// Per-process state
struct proc {
kolya's avatar
kolya committed
  char *mem;                   // Start of process memory (kernel address)
  uint sz;                     // Size of process memory (bytes)
  char *kstack;                // Bottom of kernel stack for this process
  enum proc_state state;       // Process state
  int pid;                     // Process ID
  struct proc *parent;         // Parent process
  void *chan;                  // If non-zero, sleeping on chan
  int killed;                  // If non-zero, have been killed
rsc's avatar
rsc committed
  struct file *ofile[NOFILE];  // Open files
kolya's avatar
kolya committed
  struct inode *cwd;           // Current directory
  struct context *context;     // Switch here to run process
  struct trapframe *tf;        // Trap frame for current syscall
  char name[16];               // Process name (debugging)
rtm's avatar
rtm committed
};

// Process memory is laid out contiguously, low addresses first:
rsc's avatar
rsc committed
//   text
//   original data and bss
//   fixed-size stack
//   expandable heap

// Per-CPU state
rtm's avatar
rtm committed
struct cpu {
kolya's avatar
kolya committed
  uchar apicid;                // Local APIC ID
  struct proc *curproc;        // Process currently running.
  struct context *context;     // Switch here to enter scheduler
  struct taskstate ts;         // Used by x86 to find stack for interrupt
  struct segdesc gdt[NSEGS];   // x86 global descriptor table
rsc's avatar
 
rsc committed
  volatile uint booted;        // Has the CPU started?
kolya's avatar
kolya committed
  int ncli;                    // Depth of pushcli nesting.
  int intena;                  // Were interrupts enabled before pushcli? 
rtm's avatar
rtm committed
};

extern struct cpu cpus[NCPU];
extern int ncpu;
rsc's avatar
 
rsc committed

// "cp" is a short alias for curproc().
// It gets used enough to make this worthwhile.
#define cp curproc()