3月13日

6時頃寝た。電話で13時頃起きた。ご飯を食べてから眠かったのでまた寝た。18時頃起きた。

Netflix でアナイアレイションという映画を見た。面白くはなくて、CG の出来の悪さが目立っていた。こういう映画って誰が好きなのかさっぱり分からない。

あと3週間後には毎日9時に出勤する毎日なはずなのだが、ビジョンが全くない。生活時間がここまで破綻しているのは人生で最高点なのではないか。

最近太陽を見ていない。太陽の光でホルモンがコントロールされるというのは進化の過程で得たのだろうが、現代ではもう必要ないし、生活時間だけで不健康になっていくのはやめてほしい。早く肉体を捨てたい。

JOS 7週目

3/6

  • Lab 3 Part A
    • Exercise 2 lab3: finish exercise2 (maybe) · itkq/jos@d0892b0 · GitHub
      • 実装できたと思いきや再起動ループになる…
      • が実際は想定通りの動作で、下に説明があった (気づかなくてハマった)。ELF バイナリ hello の中で文字を表示する int 命令があり、ここで CPU の kernel space から user space への遷移の許可をしていないため CPU はリセットしてリブートする (この挙動自体はレガシーらしい)
      • env_alloc() まわりのイメージはこんな感じだとおもう f:id:itkq:20180306192722p:plain

3/7

3/8

3/10

とりあえず Lab 3 まで終えたが…あと3週間でやるぞやるぞ

JOS 6週目

2/26

  • Lab2 part3: Kernel Address Space を読むが進捗は無し

2/27

  • アイカツ武道館 Day 1 に行って来年の今頃どんな景色を見つめたいのか考える

2/28

  • アイカツ武道館 Day 2 に行って輝きに包まれる

3/1

  • Lab 2 part3 を実装 Finish lab2 · itkq/jos@a4b73fc · GitHub
    • 特にヒントは書いてないが boot_map_region() を実装すれば良いことが分かった
    • 要件通り Page Table Page を alloc して check_kern_pgdir() は通るが check_page_installed_pgdir() でコケる
    • part 2 で実装した部分が微妙に間違っているっぽい…

3/2

  • Lab 2: Memory Management を達成した (チャレンジ課題は手を付けていない)

ようやくページテーブルあたりをスッキリ理解したのでまとめておく。次のコードは pmap.c の一部である。

// pmap.c
// static void check_page(void)

    // should be able to allocate three pages
    pp0 = pp1 = pp2 = 0;
    assert((pp0 = page_alloc(0)));
    assert((pp1 = page_alloc(0)));
    assert((pp2 = page_alloc(0)));

    assert(pp0);
    assert(pp1 && pp1 != pp0);
    assert(pp2 && pp2 != pp1 && pp2 != pp0);

    // temporarily steal the rest of the free pages
    fl = page_free_list;
    page_free_list = 0;

    // should be no free memory
    assert(!page_alloc(0));

    // there is no page allocated at address 0
    assert(page_lookup(kern_pgdir, (void *) 0x0, &ptep) == NULL);

    // there is no free memory, so we can't allocate a page table
    assert(page_insert(kern_pgdir, pp1, 0x0, PTE_W) < 0);

    // free pp0 and try again: pp0 should be used for page table
    page_free(pp0);
    assert(page_insert(kern_pgdir, pp1, 0x0, PTE_W) == 0);
    assert(PTE_ADDR(kern_pgdir[0]) == page2pa(pp0));
    assert(check_va2pa(kern_pgdir, 0x0) == page2pa(pp1));
    assert(pp1->pp_ref == 1);
    assert(pp0->pp_ref == 1);

    // should be able to map pp2 at PGSIZE because pp0 is already allocated for page table
    assert(page_insert(kern_pgdir, pp2, (void*) PGSIZE, PTE_W) == 0);
    assert(check_va2pa(kern_pgdir, PGSIZE) == page2pa(pp2));
    assert(pp2->pp_ref == 1);

このコードが期待する、linear address から physical address への変換構図は下図のようになる。

f:id:itkq:20180302170509p:plain

struct PageInfo* pages は物理ページとのマッピングに使われるが、*(struct PageInfo *) が 4096 bytes なのではない。 物理ページは page_init() で見ているように、物理メモリのうち未使用の領域を 4096 bytes のチャンクとして扱っているだけである……最初混乱した。

3/3

JOS 4~5週目

修論を完全に破壊したのでモチベはあったのだが、エディタをカスタマイズしたくなりついでに vim から neovim に移行していたら時間が消失した。 neovim はそこそこ満足した状態になった。

f:id:itkq:20180222233951p:plain

2/11

  • stab document を軽く読む
    • GCC は -g オプションで .s ファイルに追加のデバッグ情報を埋め込み、リンカによって実行ファイルにも伝播する
    • オブジェクトファイルには stab (symbol table) アセンブラディレクティブとして埋め込まれる
  • Lab 1: Booting a PC Finish lab1 · itkq/jos@224c471 · GitHub

2/21

  • xv6 book Chapter 1: Operating system organization をまともに読む
    • process multiplexing をするために process isolation が必要で、そのためには virtual address (address space) が必要
    • strong isolation のために、application が直接物理リソースを触るのではなく OS が抽象化する
      • Unix process: 透過的なプロセッサスイッチ、exec(2) によるメモリイメージ配置抽象化、file descriptor
    • プログラマの利便性と strong isolation のための system call interface
      • ある process が fail したとき OS も落ちたようでは困る
      • x86 の kernel mode と user mode
      • monolithic kernel, micro kernel
  • Lab 2: Memory Management

2/24

  • xv6 book Chapter 2: Page Tables の序盤を読む
    • x86 は 220 の論理的な PTEs (Page Table Entries) から成る
    • Page Table は two-level tree としてストアされる
      • VA (Virtual Address) => PDE (Page Directory Entry) => PTE => Physical Page
  • Lab2, Part2: Virtual Memory に取り組むが終わらず
    • たぶんまだ物理ページと論理ページの関係がわかってない

JOS 3週目

修論発表を破壊したので来週こそは頑張りたい。

2/3

やったこと

  • HW: boot xv6
    • 一晩置いたらすんなりできた。

やること

  • boot loader の動きを追う (boot/main.c)

2/5

やったこと

  • BIOS 起動から kernel 読み込みまでの流れを整理
    • BIOS ROM の始点 0xffff0 から BIOS が起動する。
    • BIOS 初期化の後ブートセクタ (512 byte) を 0x7c00 ~ 0x7cff に読み込む。
    • 32-bit protected mode にスイッチし 0x7c00 にロングジャンプしてブートローダが起動する。
    • 1 page (4096 byte) 分 ELF ヘッダーを読み込んで検証する。
    • PHT (Program Header Table) を読みつつプログラムセグメントをそれぞれロードする。
    • 最後に ELF ヘッダーの entry point をコールしてカーネルが起動。
  • VMA と LMA の理解
  • Exercise 6, 7, 8

やること

  • cprintf() を追う

2/8

やったこと

  • Lab 1 の提出課題であるバックトレース表示の mon_backtrace()
    • ebp, return eip 表示の実装

やること

  • debuginfo_eip() の実装
  • args 数の謎… "Why can't the backtrace code detect how many arguments there actually are? How could this limitation be fixed?"

JOS 2週目

修の論がアレしてきたりしてあまり時間が取れなかった。

1/29

https://pdos.csail.mit.edu/6.828/2017/xv6/book-rev10.pdf Appendix A を読んで x86レジスタなどを覚える。 memory-mapped I/O が分かった気になる。ディスクの最初のセクタは boot sector と呼ばれ BIOS がそこを読む。 real mode と protected mode はあとで読む。

アセンブラのスタックを使った関数呼び出しについて。学部のコンパイラ作る講義でやったけど結構忘れていた。 逆アセンブルで遊んでみる(6)関数内の処理を追いかけてみた - ゆずさん研究所 が分かりやすかった。

Lab 2 にある pointer.c でハマったが普通にリトルエンディアンだね…。

1/30

link address と load address がまだ分かっていない。GDB の使い方が若干分かってきた。 boot xv6 の HW は、xv6 kernel が始まる 0x10000c 時点での x/24x $esp の内容を説明せよというもの。

(gdb) x/24x $esp
0x7bcc: 0x00007da5      0x00000000      0x00000000      0x00000000
0x7bdc: 0x00010054      0x00000000      0x00000000      0x00000000
0x7bec: 0x00000000      0x00000000      0x00000000      0x00000000
0x7bfc: 0x00007c4d      0x8ec031fa      0x8ec08ed8      0xa864e4d0
0x7c0c: 0xb0fa7502      0xe464e6d1      0x7502a864      0xe6dfb0fa
0x7c1c: 0x16010f60      0x200f7c78      0xc88366c0      0xc0220f01

0x10054 がまだ追いきれていない。

1/31

“PC Assembly Language” 1.2 Computer Organization を読んで、real mode, 16-bit protected mode, 32-bit protected mode をまともに理解した。 8086, 80286, 80386 への対応。 xv6のブートプロセスめも 32bit-modeになるまで - Qiita は参考になった。

まだ HW は終わってない…

JOS 1週目

TURING COMPLETE FM を聴いた結果、やっぱ低レイヤー、OS やるかという気持ちになった。

turingcomplete.fm

rkx1209.hatenablog.com

以下の記事で紹介されていた MIT の Operating System の授業 をやってみることにした。

komukomo.hatenablog.com

1/23, 1/24

macOS High Sierra で JOS, xv6 の動作させることができた。LEC 1 ~ 3, Homework 1 ~ 2, Lab 1 あたりをやっていた。

github.com

C でシェル書く課題は高専でもやった記憶があったので、思い出しつつできた。しかしアセンブラ…わからんな… 社会人になる前にできるところまでやるとする。