FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

最初のプロセスを起動させるための試行錯誤

RISC-Vにてxv6を起動させるための続き。トラップフレームと、コンテキストの内容を書き換えることによってまずはswitch()によりforkretが呼ばれるようになるところまで来た。

github.com

最初のプロセスが呼ばれる仕組み

まずはuserinit()により最初のプロセスが登録されるのだが、そこで、switchされたときの最初のとび先としてforkretが指定される。

allocproc(void)
{
  struct proc *p;
  char *sp;

  acquire(&ptable.lock);
  for(p = ptable.proc; p < &ptable.proc[NPROC]; p++)
...

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

  return p;
}

switchが呼ばれると、コンテキストの切り替えが行われ、まずはforkretが呼ばれる。

 603042570:M:MBar:[80106164][P80106164] e147a783 : lw         tp,0xe14(tp)         tp=>80114000 (80113e14)=>80113e9c tp<=80113e9c
 603042571:M:MBar:[80106168][P80106168] 00478713 : addi       sp,tp,0x004          tp=>80113e9c sp<=80113ea0
 603042572:M:MBar:[8010616c][P8010616c] 801177b7 : lui        tp,0x80117           tp<=80117000
 603042573:M:MBar:[80106170][P80106170] 9e87a783 : lw         tp,0x9e8(tp)         tp=>80117000 (801169e8)=>80114270 tp<=80114270
 603042574:M:MBar:[80106174][P80106174] 01c7a783 : lw         tp,0x01c(tp)         tp=>80114270 (8011428c)=>8dffff4c tp<=8dffff4c
 603042575:M:MBar:[80106178][P80106178] 00078593 : addi       s9,tp,0x000          tp=>8dffff4c s9<=8dffff4c
 603042576:M:MBar:[8010617c][P8010617c] 00070513 : addi       s8,sp,0x000          sp=>80113ea0 s8<=80113ea0
 603042577:M:MBar:[80106180][P80106180] 6b1000ef : jal        ra,0x6b100           ra<=80106184 pc<=80107030
 603042578:M:MBar:[80107030][P80107030] fd810113 : addi       fp,fp,0xfd8          fp=>8010e100 fp<=8010e0d8
 603042579:M:MBar:[80107034][P80107034] 02112223 : sw         ra,0x024(fp)         fp=>8010e0d8 ra=>80106184 (8010e0fc)<=80106184
 603042580:M:MBar:[80107038][P80107038] 03812023 : sw         a6,0x020(fp)         fp=>8010e0d8 a6=>00000000 (8010e0f8)<=00000000
 603042581:M:MBar:[8010703c][P8010703c] 01712e23 : sw         a5,0x01c(fp)         fp=>8010e0d8 a5=>00000000 (8010e0f4)<=00000000
 603042582:M:MBar:[80107040][P80107040] 01612c23 : sw         a4,0x018(fp)         fp=>8010e0d8 a4=>00000000 (8010e0f0)<=00000000
 603042583:M:MBar:[80107044][P80107044] 01512a23 : sw         a3,0x014(fp)         fp=>8010e0d8 a3=>00000000 (8010e0ec)<=00000000
 603042584:M:MBar:[80107048][P80107048] 01412823 : sw         a2,0x010(fp)         fp=>8010e0d8 a2=>00000000 (8010e0e8)<=00000000
 603042585:M:MBar:[8010704c][P8010704c] 01312623 : sw         a1,0x00c(fp)         fp=>8010e0d8 a1=>00010054 (8010e0e4)<=00010054
 603042586:M:MBar:[80107050][P80107050] 01212423 : sw         a0,0x008(fp)         fp=>8010e0d8 a0=>00010054 (8010e0e0)<=00010054
 603042587:M:MBar:[80107054][P80107054] 00912223 : sw         s7,0x004(fp)         fp=>8010e0d8 s7=>00100000 (8010e0dc)<=00100000
 603042588:M:MBar:[80107058][P80107058] 00812023 : sw         s6,0x000(fp)         fp=>8010e0d8 s6=>8010e120 (8010e0d8)<=8010e120
 603042589:M:MBar:[8010705c][P8010705c] 00252023 : sw         fp,0x000(s8)         s8=>80113ea0 fp=>8010e0d8 (80113ea0)<=8010e0d8
 603042590:M:MBar:[80107060][P80107060] 00058113 : addi       fp,s9,0x000          s9=>8dffff4c fp<=8dffff4c
 603042591:M:MBar:[80107064][P80107064] 02412083 : lw         ra,0x024(fp)         fp=>8dffff4c (8dffff70)=>801062f8 ra<=801062f8
 603042592:M:MBar:[80107068][P80107068] 02012c03 : lw         a6,0x020(fp)         fp=>8dffff4c (8dffff6c)=>00000000 a6<=00000000
 603042593:M:MBar:[8010706c][P8010706c] 01c12b83 : lw         a5,0x01c(fp)         fp=>8dffff4c (8dffff68)=>00000000 a5<=00000000
 603042594:M:MBar:[80107070][P80107070] 01812b03 : lw         a4,0x018(fp)         fp=>8dffff4c (8dffff64)=>00000000 a4<=00000000
 603042595:M:MBar:[80107074][P80107074] 01412a83 : lw         a3,0x014(fp)         fp=>8dffff4c (8dffff60)=>00000000 a3<=00000000
 603042596:M:MBar:[80107078][P80107078] 01012a03 : lw         a2,0x010(fp)         fp=>8dffff4c (8dffff5c)=>00000000 a2<=00000000
 603042597:M:MBar:[8010707c][P8010707c] 00c12983 : lw         a1,0x00c(fp)         fp=>8dffff4c (8dffff58)=>00000000 a1<=00000000
 603042598:M:MBar:[80107080][P80107080] 00812903 : lw         a0,0x008(fp)         fp=>8dffff4c (8dffff54)=>00000000 a0<=00000000
 603042599:M:MBar:[80107084][P80107084] 00412483 : lw         s7,0x004(fp)         fp=>8dffff4c (8dffff50)=>00000000 s7<=00000000
 603042600:M:MBar:[80107088][P80107088] 00012403 : lw         s6,0x000(fp)         fp=>8dffff4c (8dffff4c)=>00000000 s6<=00000000
 603042601:M:MBar:[8010708c][P8010708c] 02810113 : addi       fp,fp,0x028          fp=>8dffff4c fp<=8dffff74
 603042602:M:MBar:[80107090][P80107090] 00008067 : jalr       zero,ra,0x067        ra=>801062f8 pc<=801062f8
<Func: forkret 0x801062f8>
 603042603:M:MBar:[801062f8][P801062f8] ff010113 : addi       fp,fp,0xff0          fp=>8dffff74 fp<=8dffff64
 603042604:M:MBar:[801062fc][P801062fc] 00112623 : sw         ra,0x00c(fp)         fp=>8dffff64 ra=>801062f8 (8dffff70)<=801062f8
 603042605:M:MBar:[80106300][P80106300] 00812423 : sw         s6,0x008(fp)         fp=>8dffff64 s6=>00000000 (8dffff6c)<=00000000
 603042606:M:MBar:[80106304][P80106304] 01010413 : addi       s6,fp,0x010          fp=>8dffff64 s6<=8dffff74
 603042607:M:MBar:[80106308][P80106308] 801147b7 : lui        tp,0x80114           tp<=80114000
 603042608:M:MBar:[8010630c][P8010630c] 23c78513 : addi       s8,tp,0x23c          tp=>80114000 s8<=8011423c
 603042609:M:MBar:[80106310][P80106310] 578000ef : jal        ra,0x57800           ra<=80106314 pc<=80106888
<Func: release 0x80106888>
 603042610:M:MBar:[80106888][P80106888] fe010113 : addi       fp,fp,0xfe0          fp=>8dffff64 fp<=8dffff44
 603042611:M:MBar:[8010688c][P8010688c] 00112e23 : sw         ra,0x01c(fp)         fp=>8dffff44 ra=>80106314 (8dffff60)<=80106314
````

そこから先、forkretによる最初のプロセスの初期化が行われるのだが、そこで止まってしまった。

// A fork child's very first scheduling by scheduler() // will swtch here. "Return" to user space. void forkret(void) { static int first = 1; // Still holding ptable.lock from scheduler. release(&ptable.lock);

if (first) { // Some initialization functions must be run in the context // of a regular process (e.g., they call sleep), and thus cannot // be run from main(). first = 0; iinit(ROOTDEV); initlog(ROOTDEV); }

// Return to "caller", actually trapret (see allocproc). }