xv6/proc.h

65 lines
1.6 KiB
C
Raw Normal View History

2006-09-06 17:50:20 +00:00
// segments in proc->gdt
2006-06-12 15:22:12 +00:00
#define SEG_KCODE 1 // kernel code
#define SEG_KDATA 2 // kernel data+stack
#define SEG_UCODE 3
#define SEG_UDATA 4
2006-09-06 17:50:20 +00:00
#define SEG_TSS 5 // this process's task state
#define NSEGS 6
2006-06-12 15:22:12 +00:00
2006-07-11 01:07:40 +00:00
struct jmpbuf {
// saved registers for kernel context switches
// don't need to save all the fs etc. registers because
// they are constant across kernel contexts
// save all the regular registers so we don't care which are caller save
// don't save eax because that's the return register
// layout known to setjmp.S
int ebx;
int ecx;
int edx;
int esi;
int edi;
int esp;
int ebp;
int eip;
2006-07-11 01:07:40 +00:00
};
enum proc_state { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE };
2006-06-12 15:22:12 +00:00
struct proc{
2006-08-29 21:35:30 +00:00
char *mem; // start of process's memory (a kernel address)
2006-09-06 17:50:20 +00:00
// process memory is laid out contiguously:
// text
// original data and bss
// fixed-size stack
// expandable heap
2006-08-29 21:35:30 +00:00
uint sz; // user memory size
char *kstack; // kernel stack
enum proc_state state;
2006-06-15 19:58:01 +00:00
int pid;
int ppid;
void *chan; // sleep
int killed;
2006-06-27 14:35:53 +00:00
struct fd *fds[NOFILE];
2006-08-15 15:53:46 +00:00
struct inode *cwd;
2006-07-11 01:07:40 +00:00
struct jmpbuf jmpbuf;
struct trapframe *tf; // points into kstack, used to find user regs
2006-06-12 15:22:12 +00:00
};
extern struct proc proc[];
2006-07-11 01:07:40 +00:00
extern struct proc *curproc[NCPU]; // can be NULL if no proc running.
#define MPSTACK 512
struct cpu {
2006-07-20 09:07:53 +00:00
uchar apicid; // Local APIC ID
2006-07-11 01:07:40 +00:00
struct jmpbuf jmpbuf;
struct taskstate ts; // only to give cpu address of kernel stack
struct segdesc gdt[NSEGS];
char mpstack[MPSTACK]; // per-cpu start-up stack
volatile int booted;
int nlock; // # of locks currently held
};
extern struct cpu cpus[NCPU];
extern int ncpu;