Ubuntu 18.04.1 LTSでやる 30日OS本 〜9日目〜

Ubuntu 18.04.1 LTSでやる 30日OS本、9日目です。 他の章へのリンクはここにあります。

1. ソースの整理

はい。

2. メモリ容量チェック(1)

やってみると、QEMU上で128 MBと出てくる… 本文によると、32 MBと出てほしいところ3072 MBと出るらしいのですが。

試しにmemtest_subbreak;continue;に差し替えてやると表示は3072 MBになるので、ループの範囲を間違えているわけではなさそうです。 また、実機で動かすとまた違った値が出てきます(ちゃんとメモリの状態に依存する動作になっている可能性が高い)。

原因がよくわからなかったので、とりあえず次に進むことにしました。

3. メモリ容量チェック(2)

memtest_subアセンブラで書き直します。これをやっても結果は変わらず128 MBでした。

このことから、どうやらコンパイラは本文で述べているような最適化は行っていなかったといえそうです。 確かに、コンパイラに最適化オプション-O2を指定して2. でのプログラムを実行させたところ、本文のように3072 MBとなる挙動が確認できました。

そうすると、QEMUの設定が本文と違う結果になった原因として考えられます。 実際、QEMUのオプションとして-m 32(メモリサイズを指定するオプション)をつけてやると表示は32 MBになりました。 他の値を指定しても表示に反映されますね。いい感じです。

以上で挙動の食い違いの原因を特定できました。めでたし。

4. メモリ管理に挑戦

memman_freeの冒頭、ソートされた列の中から適切な挿入位置を探すというのをやっています。 本文だと線型探索をしているので {O(N)}ですが、これは二部探索をすることで {O(\log N)}に改善できます。 (でも Nが4000くらいなのであまり旨味がなさそうです)

あとは本文通り作成していきました。少し長めですが、書いている内容は素直だと思います。