Skip to content
Snippets Groups Projects
proc.h 2.33 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
rsc's avatar
rsc committed
#define NSEGS     6
rtm's avatar
rtm committed

rsc's avatar
rsc committed
// Saved registers for kernel context switches.
// Don't need to save all the %fs etc. segment registers,
// because they are constant across kernel contexts.
// Save all the regular registers so we don't need to care
rsc's avatar
rsc committed
// which are caller save, but not the return register %eax.
// (Not saving %eax just simplifies the switching code.)
// The layout of context must match code in swtch.S.
struct context {
  int eip;
  int esp;
  int ebx;
  int ecx;
  int edx;
  int esi;
  int edi;
  int ebp;
enum proc_state { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE };
rtm's avatar
rtm committed

rsc's avatar
rsc committed
// Per-process state
struct proc {
  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
rsc's avatar
 
rsc committed
  struct proc *parent;      // Parent process
rsc's avatar
rsc committed
  void *chan;               // If non-zero, sleeping on chan
  int killed;               // If non-zero, have been killed
  struct file *ofile[NOFILE];  // Open files
rsc's avatar
 
rsc committed
  struct inode *cwd;        // Current directory
rsc's avatar
rsc committed
  struct context context;   // Switch here to run process
rsc's avatar
rsc committed
  struct trapframe *tf;     // Trap frame for current interrupt
rsc's avatar
rsc committed
  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

rtm's avatar
rtm committed
#define MPSTACK 512

rsc's avatar
rsc committed
// Per-CPU state
rtm's avatar
rtm committed
struct cpu {
rsc's avatar
rsc committed
  uchar apicid;               // Local APIC ID
rsc's avatar
 
rsc committed
  struct proc *curproc;       // Process currently running.
rsc's avatar
rsc committed
  struct context context;     // Switch here to enter scheduler
rsc's avatar
rsc committed
  struct taskstate ts;        // Used by x86 to find stack for interrupt
  struct segdesc gdt[NSEGS];  // x86 global descriptor table
  char mpstack[MPSTACK];      // Per-CPU startup stack
  volatile int booted;        // Has the CPU started?
rsc's avatar
 
rsc committed
  int nsplhi;                 // Depth of splhi nesting.
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()