よもぎのOS自作入門 9日目/30日
はじめに
これは2020年夏休み企画「30日でOS自作してみよう!」9日目の記事です。
企画についてはこちら
昨日やったことを書いていきます。
昨日の進捗
メモリを管理するための機能が追加されました。メモリのアロケーション*1と解放の機能だね。
昨日やったこと
メモリを管理するために、まずメモリの容量を調べます。
適当な値をメモリに”書き込んで”、その値を”読み込み”ます。 メモリがあれば、ちゃんと書き込んだ値をそのまま読み込む事ができるのですが、 メモリがないとでたらめな値が帰ってくる。そんなかんじなので””でくくってます。 そのために一旦キャッシュを無効にします。キャッシュが機能ちゃうと正しくメモリの容量が調べられないからですね。
具体的には、EFLAGS
レジスタのAC
ビットを見ると、キャッシュのない386以前かキャッシュのある486以降かがわかって、キャッシュを禁止するCR0レジスタの中のフラグをいじってます。
そうしてから、for
文まわして調べていきます。Cのコンパイラの最適化が効いてしまうから、この部分はアセンブリで書いた。
メモリの管理は、空きスペースの開始アドレスとその空きサイズを構造体の配列で管理するみたいな感じです。*2
まあよくある感じなので、多分大丈夫。それで進捗にあげた感じの出来になりました。
if
文が続いて正しくネストできてなかったりして困った。
今日も一日頑張るぞい!*3