高级操作系统——XV6进程管理(proc.c)

struct {
  struct spinlock lock;
  struct proc proc[NPROC];
} ptable;//进程索引表,64个进程以数组的形式记录

static struct proc *initproc;//初始进程,userinit调用中赋值
// Look in the process table for an UNUSED proc.
// If found, change state to EMBRYO and initialize
// state required to run in the kernel.
// Otherwise return 0.
static struct proc*
allocproc(void)
{
  struct proc *p;
  char *sp;
//锁住&ptable
  acquire(&ptable.lock);
  for(p = ptable.proc; p < &ptable.proc[NPROC]; p++)
    if(p->state == UNUSED)//从进程索引表中找到UNUSED进程
      goto found;
  release(&ptable.lock);
  return 0;//若未找到说明分配失败

found:
  p->state = EMBRYO;
  p->pid = nextpid++;//进程pid
  release(&ptable.lock);

  // Allocate kernel stack.分配内核栈
  if((p->kstack = kalloc()) == 0){//kalloc位于kalloc.c中
 //*kalloc()函数的作用是分配一个4096B大小的空间,而在param.h中规定了一个进程的内核栈大小为4096*/
	  p->state = UNUSED;//分配失败,修改状态,相当于放回索引表
    return 0;
  }
  sp = p->kstack + KSTACKSIZE;//param.h中定义 4096【size of per-process kernel stack】/*sp指针指向最大地址的位置(因为栈的生长方向是至上而下的,也就是说后入栈的元素的地址要更小)*/

  // Leave room for trap frame.理解为内核栈
  sp -= sizeof *p->tf;//tf是trapframe类型,sizeof即求trapframe的大小
  p->tf = (struct trapframe*)sp;//根据trapframe的大小,移动指针后将其赋值p->tf

  // Set up new context to start executing at forkret,
  // which returns to trapret.
  sp -= 4;
  *(uint*)sp = (uint)trapret;

  sp -= sizeof *p->context;
  p->context = (struct context*)sp;
  memset(p->context, 0, sizeof *p->context);
  p->context->eip = (uint)forkret;

  return p;
}
// Set up first user process.
void
userinit(void)
{
  struct proc *p;
  extern char _binary_initcode_start[], _binary_initcode_size[];

  p = allocproc();
  initproc = p;//因为userinit此方法只有初始化的时候调用,可以理解为将initproc设置为主进程
  if((p->pgdir = setupkvm()) == 0)// Set up kernel part of a page table.可以理解为分配page table分配页表 pgdir页表起始地址
    panic("userinit: out of memory?");
  inituvm(p->pgdir, _binary_initcode_start, (int)_
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值