忍者ブログ
MASTER →  ADMIN / NEW ENTRY / COMMENT
現代魔法(nearly equal 情報技術)を勉強中な人のメモ(チラシの裏)
/ 2024/11/23 (Sat) / 編集
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

/ 2008/09/05 (Fri) / 編集
ようは「どのメモリが空いていて、どのメモリが使用中か」が知りたい、ついでに「どこがどれだけ空いてるか」がわかると素敵だ。

まずはメモリの容量を調べる
  1. キャッシュメモリを停止
  2. メインメモリに値を保存
  3. 値を取得、さっき代入した物と同じか確かめる
  4. もし違うならそこからはメモリじゃない(=その直前までは使える)
これらの処理はアセンブラでやること。
番地を1つづつ(つまり1Byteづつ)調べてもいいけど死ぬほど時間がかかるので4KBづつとかにするといい。


肝心の管理はこんなん作って
struct FREEINFO {
   /* あき情報、どの番地からどのくらい空いてるか */
   unsigned int addr, size;
 };
 struct MEMMAN {   /* メモリ管理 */
   int frees, maxfrees, lostsize, losts;
   struct FREEINFO free[MEMMAN_FREES];
 };

あとは「空いてるとこが連続してたらまとめる」とか「空いてる領域を教える」とか「領域を確保する(freeinfoを消す、つまりfreeではない)」とかをがんばってプログラムする

拍手[0回]

PR
/ 2008/09/05 (Fri) / 編集
asmhead.nasのメモ

  1. 割り込みの禁止
  2. マスタ、スレイブ、CPUのすべての割り込みを禁止
  3. A20GATEの設定
  4. 互換のためにデフォルトではメモリは1Mしかつかえないので、A20GATE信号線をONにすることで1M以上のメモリが使えるようにする(キーボードコントローラを経由して行う)
  5. INSTRSET "i486p"
  6. EAXなどの386以降の命令が使えるようにする
  7. GDTを仮設定
  8. GDT0の番地は8の倍数にしておくと少しだけ早くなる
  9. CR0(コントロールレジスタ0)の変更
  10. 最上位ビットを0にしてページング禁止、最下位ビットを1にしてプロテクテッドバーチャルアドレスモード(以下プロテクトモード)移行
  11. 32bitモードに移行
おおまかにまとめるとこんな感じらしい


拍手[2回]

/ 2008/09/04 (Thu) / 編集
衝撃の事実、マウスはキーボードコントローラで制御されているらしい!でもってキーボード制御回路の初期化をうまい事すればマウス制御回路を有効にできるらしい(bootpack.c:wait_KBC_sendalready(),init_keyboard())
でもってその次はマウス自体の有効化、これもキーボード制御回路を通してやるらしい(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)に登録されるらしい。

拍手[0回]

忍者ブログ [PR]