OS自作入門 / 2008/09/05 (Fri) / 編集 |
ようは「どのメモリが空いていて、どのメモリが使用中か」が知りたい、ついでに「どこがどれだけ空いてるか」がわかると素敵だ。
まずはメモリの容量を調べる
番地を1つづつ(つまり1Byteづつ)調べてもいいけど死ぬほど時間がかかるので4KBづつとかにするといい。
肝心の管理はこんなん作って
あとは「空いてるとこが連続してたらまとめる」とか「空いてる領域を教える」とか「領域を確保する(freeinfoを消す、つまりfreeではない)」とかをがんばってプログラムする
まずはメモリの容量を調べる
- キャッシュメモリを停止
- メインメモリに値を保存
- 値を取得、さっき代入した物と同じか確かめる もし違うならそこからはメモリじゃない(=その直前までは使える)
番地を1つづつ(つまり1Byteづつ)調べてもいいけど死ぬほど時間がかかるので4KBづつとかにするといい。
肝心の管理はこんなん作って
struct FREEINFO { /* あき情報、どの番地からどのくらい空いてるか */ unsigned int addr, size; }; struct MEMMAN { /* メモリ管理 */ int frees, maxfrees, lostsize, losts; struct FREEINFO free[MEMMAN_FREES]; };
あとは「空いてるとこが連続してたらまとめる」とか「空いてる領域を教える」とか「領域を確保する(freeinfoを消す、つまりfreeではない)」とかをがんばってプログラムする
PR
OS自作入門 / 2008/09/05 (Fri) / 編集 |
asmhead.nasのメモ
- 割り込みの禁止 マスタ、スレイブ、CPUのすべての割り込みを禁止
- A20GATEの設定 互換のためにデフォルトではメモリは1Mしかつかえないので、A20GATE信号線をONにすることで1M以上のメモリが使えるようにする(キーボードコントローラを経由して行う)
- INSTRSET "i486p" EAXなどの386以降の命令が使えるようにする
- GDTを仮設定 GDT0の番地は8の倍数にしておくと少しだけ早くなる
- CR0(コントロールレジスタ0)の変更 最上位ビットを0にしてページング禁止、最下位ビットを1にしてプロテクテッドバーチャルアドレスモード(以下プロテクトモード)移行
- 32bitモードに移行
OS自作入門 / 2008/09/04 (Thu) / 編集 |
衝撃の事実、マウスはキーボードコントローラで制御されているらしい!でもってキーボード制御回路の初期化をうまい事すればマウス制御回路を有効にできるらしい(bootpack.c:wait_KBC_sendalready(),init_keyboard())
でもってその次はマウス自体の有効化、これもキーボード制御回路を通してやるらしい(bootpack.c : enable_mouse())
そしてマウスからの割り込みの受付、面倒なことにマウスのIRQは12、つまりPIC1についているらしい。なのでPIC1に「IRQ12の受付完了」と教えた後PIC1が繋がっているPIC0のIRQ2にも受付完了を知らせないといけないらしい
これでデータがキュー(mousefifo)に登録されるらしい。
でもってその次はマウス自体の有効化、これもキーボード制御回路を通してやるらしい(bootpack.c : enable_mouse())
そしてマウスからの割り込みの受付、面倒なことにマウスのIRQは12、つまりPIC1についているらしい。なのでPIC1に「IRQ12の受付完了」と教えた後PIC1が繋がっているPIC0のIRQ2にも受付完了を知らせないといけないらしい
//int.c void inthandler2c(int *esp) /* PS/2マウスからの割り込み */ { unsigned char data; /* IRQ-12受付完了をPIC1に通知 */ io_out8(PIC1_OCW2, 0x64); /* IRQ-02受付完了をPIC0に通知 */ io_out8(PIC0_OCW2, 0x62); data = io_in8(PORT_KEYDAT); fifo8_put(&mousefifo, data); return; }
これでデータがキュー(mousefifo)に登録されるらしい。