RISC-Vにてxv6を起動させるための続き。トラップフレームと、コンテキストの内容を書き換えることによってまずはswitch()によりforkretが呼ばれるようになるところまで来た。
最初のプロセスが呼ばれる仕組み
まずは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). }