Archive for the UNIX Category

Note: xv6 process management

Posted in UNIX with tags , , on 2015 年 06 月 08 日 by Kun-Yi

這幾天 Jserv 丟出了一個 xv6_x86_64 的source code 之前有買了 Unix V6 的書,  但是看沒幾天就因為工作又忙起來, 所以沒啥讀, 今天找時間看了2hrs 書內的chapter 3 講 Process Management, 順便拿來對應一下 xv6 版本 原本的PDP-11 Unix V6 定義的最大 process number 是 50, 這個x86_64 則是 64 (不過應該可以自己改想要的值, 畢竟年代不一樣了 不像以前記憶體少的可憐) ./include/param.h:1:#define NPROC        64  // maximum number of processes ./kernel/proc.c:12:  struct proc proc[NPROC]; 另外因為支援 SMP 的關係 所以關於 proc 處理就加上 spinlock 了, 因此多了一個 struct ptable 其他的細節應該還是把 kernel/proc.c 仔細讀, 主要的 PROC for x86_64 因應SMP 與 MMU 與PDP-11 的不同所以做了不同的處理與定義

// Segments in proc->gdt.
#define NSEGS     7

// Per-CPU state
struct cpu {
  uchar id;                    // index into cpus[] below
  uchar apicid;                // Local APIC ID
  struct context *scheduler;   // swtch() here to enter scheduler
  struct taskstate ts;         // Used by x86 to find stack for interrupt
  struct segdesc gdt[NSEGS];   // x86 global descriptor table
  volatile uint started;       // Has the CPU started?
  int ncli;                    // Depth of pushcli nesting.
  int intena;                  // Were interrupts enabled before pushcli?

  // Cpu-local storage variables; see below
#if X64
  void *local;
#else
  struct cpu *cpu;
  struct proc *proc;           // The currently-running process.
#endif
};


#if X64
struct context {
  uintp r15;
  uintp r14;
  uintp r13;
  uintp r12;
  uintp r11;
  uintp rbx;
  uintp ebp; //rbp
  uintp eip; //rip;
};
#else
struct context {
  uintp edi;
  uintp esi;
  uintp ebx;
  uintp ebp;
  uintp eip;
};
#endif

enum procstate { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE };

// Per-process state
struct proc {
  uintp sz;                     // Size of process memory (bytes)
  pde_t* pgdir;                // Page table
  char *kstack;                // Bottom of kernel stack for this process
  enum procstate state;        // Process state
  int pid;                     // Process ID
  struct proc *parent;         // Parent process
  struct trapframe *tf;        // Trap frame for current syscall
  struct context *context;     // swtch() here to run process
  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
  char name[16];               // Process name (debugging)
};


procstate 定義了
UNUSED, 未使用, 這個狀態表示還沒有被使用, kernel 可以用來使用配置新的proc
EMBRYO. 孕育狀態, 剛被allocproc() 從UNUSED的狀態配置出PID 然後就切成這個狀態, 然後如果接下來配置給Proc 的stack 出錯的話, 會切回UNUSED

廣告