遅まきながら、「30日でできるOS自作入門」を読み始めた。
- 作者: 川合秀実
- 出版社/メーカー: 毎日コミュニケーションズ
- 発売日: 2006/03/01
- メディア: 単行本
- 購入: 36人 クリック: 735回
- この商品を含むブログ (299件) を見る
9日目はメモリ管理について。まずはメモリのサイズを取得してみる。 これは、WriteしてReadすることでメモリ領域かどうかを判定するプログラムを使用する。
このとき、コンパイラの最適化によって、Write / Read のコードが消えてしまうというストーリーなんだけど、GCCだと消えなかったぞ?
別に問題なく動いてしまった。
っていうか、最適化によるコード化消えてしまう問題を回避するんだったら、アセンブラをわざわざ書く必要もなくて、volatile
を付けるだけでOKではないかな?
unsigned int memtest_sub(unsigned int start, unsigned int end) { unsigned int i, old, pat0 = 0xaa55aa55, pat1 = 0x55aa55aa; volatile unsigned int *p; for (i = start; i <= end; i += 0x1000) { p = (volatile unsigned int *)i; old = *p; *p = pat0; *p ^= 0xffffffff; if (*p != pat1) { not_memory: *p = old; break; } *p ^= 0xffffffff; if (*p != pat0) { goto not_memory; } *p = old; } return i; }
まあもとも消えなかったわけだから、volatile を付けようが付けまいが結果は変わらなかったのだけれども...
念のため、QEMUは現在はデフォルトのメモリサイズが128MBになっているらしい。オプションで変更できるので32MBに変更して、メモリサイズが変わるかやってみた。
run: $(TARGET).img qemu-system-i386 -m 32M -fda $^
図. QEMUのメモリサイズを変更して計測してみる。
ちゃんとメモリサイズの変更を認識できた。よしよし。