JOS 8, 9週目

3/11

  • Homework 8 hw08: finish · itkq/jos@8224e02 · GitHub

    • 結構悩んだが結局はヒントをよく読む
      • pushal, popal: register の save と restore
      • current_stack->sp = esp の手順
    • stack を thread のものに切り替えることをする
      • 1回目の thread_switch() が呼ばれる直前 f:id:itkq:20180312024749p:plain
      • 1回目の thread_switch()ret する直前
        • スタックポインタの切り替え
        • コンテキスト (registers) の入れ替え f:id:itkq:20180312024753p:plain
      • 2回目の thread_switch() が呼ばれる直前 f:id:itkq:20180312024756p:plain
      • 2回目の thread_switch()ret する直前
        • 同様 f:id:itkq:20180312025903p:plain
  • homework 9

    • condition variable がなにを指すのかよくわからなくてハマった
    • 要するに pthread_cond_wait() が入っている if もしくは while のブロックの条件のことで、それが真になるまでそのスレッドは待つ

3/12

  • Lab 4
    • exercise 1 ~ exercise 5
      • それほどはむずかしくない

3/13-15

  • Lab4
    • exercise 6 で2日溶かした
      • iteration が上手くいかない、各 CPU が同じ environment を掴んでしまっている?
      • lib/libmain.c で thisenv = envs; という先頭しか掴まないようになっていてビビる、直す
      • これは Lab 3 の領域なので Lab 3 にて make grade すると user/hello.c で失敗
      • sys_getenvid() システムコールがよくわからない値を返していた
      • カーネル空間では動いてるっぽいのでなんだとおもったら kern/syscall.csyscall() の dispatcher に SYS_getenvid の対応を書いてなかった!!!!!!!!!!!!!!!
      • これも直したら通った
    • exercise 7
      • child environment の syscall の引数がおかしい
        • 謎だけど tf をコピーするときに eax, esi にゴミが残っていて死んでたのでクリアした (あってるかは不明)
      • parent が free になったあと halt してる
        • exercise 6 の漏れだった

3/16

  • Lab 4 exercise 8
    • やるだけ

3/17

  • Lab 4 exercise 9
  • esp に eip を置いておくと、handler 内での trap という再帰的な動きにも対応できる。結構悩んだ

3/18

  • exercise 10, 11
    • ページをコピーした dumbfork() とは違って fork() では ページのマッピング をコピーする
    • sys_exofork がよくわかってなかった。eax を 0 にすることで戻り値を 0 にしていた

3/19

  • exercise 12
    • どこかでバグらせていて lib/fork 中で user page fault が起きる、原因がぜんぜんわからん…

3/21-3/24

  • 突然発熱して体調を崩して死んでた