よもぎのメモ帳

備忘録的な感じで技術的なことをストックしていきます。

よもぎのOS自作入門 9日目/30日

はじめに

これは2020年夏休み企画「30日でOS自作してみよう!」9日目の記事です。

企画についてはこちら

y0m0g1.hatenablog.com

昨日やったことを書いていきます。

昨日の進捗

f:id:y0m0g1:20200826215940p:plain
メモリの容量と空き容量

メモリを管理するための機能が追加されました。メモリのアロケーション*1と解放の機能だね。

昨日やったこと

メモリを管理するために、まずメモリの容量を調べます。

適当な値をメモリに”書き込んで”、その値を”読み込み”ます。 メモリがあれば、ちゃんと書き込んだ値をそのまま読み込む事ができるのですが、 メモリがないとでたらめな値が帰ってくる。そんなかんじなので””でくくってます。 そのために一旦キャッシュを無効にします。キャッシュが機能ちゃうと正しくメモリの容量が調べられないからですね。

具体的には、EFLAGSレジスタACビットを見ると、キャッシュのない386以前かキャッシュのある486以降かがわかって、キャッシュを禁止するCR0レジスタの中のフラグをいじってます。 そうしてから、for文まわして調べていきます。Cのコンパイラの最適化が効いてしまうから、この部分はアセンブリで書いた。

f:id:y0m0g1:20200826222729p:plain
メモリが理論値まであるやつ

f:id:y0m0g1:20200826223043p:plain
アセンブリで、正しく

メモリの管理は、空きスペースの開始アドレスとその空きサイズを構造体の配列で管理するみたいな感じです。*2

まあよくある感じなので、多分大丈夫。それで進捗にあげた感じの出来になりました。

if文が続いて正しくネストできてなかったりして困った。

今日も一日頑張るぞい!*3

*1:割り当て、c言語mallocとかcallocとかそんな感じだよね

*2:伝われ

*3:あと1時間だけど……