xv6-cs450/proc.h

74 lines
2.5 KiB
C
Raw Normal View History

2006-09-07 16:12:30 +02:00
// Segments in proc->gdt
#define SEG_KCODE 1 // kernel code
#define SEG_KDATA 2 // kernel data+stack
2006-06-12 17:22:12 +02:00
#define SEG_UCODE 3
#define SEG_UDATA 4
2006-09-07 16:12:30 +02:00
#define SEG_TSS 5 // this process's task state
2006-09-06 19:50:20 +02:00
#define NSEGS 6
2006-06-12 17:22:12 +02:00
2006-09-07 16:12:30 +02:00
// 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
2007-08-28 14:48:33 +02:00
// 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;
2006-07-11 03:07:40 +02:00
};
enum proc_state { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE };
2006-09-07 16:12:30 +02:00
// 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
2007-08-23 16:40:30 +02:00
struct proc *parent; // Parent process
2006-09-07 16:12:30 +02:00
void *chan; // If non-zero, sleeping on chan
int killed; // If non-zero, have been killed
struct file *ofile[NOFILE]; // Open files
struct inode *cwd; // Current directory
2007-08-28 14:48:33 +02:00
struct context context; // Switch here to run process
2006-09-07 16:12:30 +02:00
struct trapframe *tf; // Trap frame for current interrupt
2007-08-08 10:38:11 +02:00
char name[16]; // Process name (debugging)
2006-06-12 17:22:12 +02:00
};
2007-08-24 16:56:17 +02:00
// Process memory is laid out contiguously, low addresses first:
2006-09-07 16:12:30 +02:00
// text
// original data and bss
// fixed-size stack
// expandable heap
2007-08-24 16:56:17 +02:00
// Arrange that cp point to the struct proc that this
// CPU is currently running. Such preprocessor
// subterfuge can be confusing, but saves a lot of typing.
2006-09-07 16:12:30 +02:00
extern struct proc *curproc[NCPU]; // Current (running) process per CPU
2007-08-10 18:37:27 +02:00
#define cp (curproc[cpu()]) // Current process on this CPU
#define MPSTACK 512
2006-09-07 16:12:30 +02:00
// Per-CPU state
struct cpu {
2006-09-07 16:12:30 +02:00
uchar apicid; // Local APIC ID
2007-08-28 14:48:33 +02:00
struct context context; // Switch here to enter scheduler
2006-09-07 16:12:30 +02:00
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?
int nlock; // Number of locks currently held
};
extern struct cpu cpus[NCPU];
extern int ncpu;