Hyfaxのこと-あろけーと

x86リアルモードでモニターを作ろうシリーズです。
Windows11+wsl2で構築しています。

発端

なんかけっこう長くやってる気がするんですが、動くコマンドはechoの一つだけという現状。とってもさみしいです。ここはコマンドを増やしたいところ。
ファイルシステムまわりのプログラムの勉強と修行を兼ねてlsなんかはどうだろうか、とか思うわけです。

ルートディレクトリのLBAは保存してあるし、ディレクトリエントリをファイル名でサーチする処理はファイルロードで作ったし、ちょっと流用すればできそうな気がするんです。

ええと、ルートディレクトリをバッファに読み込んで……
バッファのサイズはどうしよう……
位置はどこにあればいいんだろう……
ほかの処理とかち合わないようにしないと……
ええと、ええと、ええと……

えぇい!面倒くさい!使い捨てのバッファなんか、いちいち細かいところなんか考えてられるかっ!!

というわけでメモリ・アロケータを作成することになるのでした。

仕様っぽなにか

もうね、使えるメモリは全部対象にしてしまおうと思うんです。面倒くさいので。
0x10000~0xA0000までをアプリケーションエリアとしているので、ここが対象です。

管理はビットマップで行きましょう。対象が(今どきのメモリサイズと比べて)大きくないので、それほどエリアコストになりません。

ページサイズは4KByteで。4KByteは大きすぎる気もしますが(今どきのメモリと比べれば)大した問題にならないでしょう

ビットマップそのものは最初のユーザーとしましょう。対象の1ページ目はビットマップスペースです。

システムコールで取得、解放できるように。

ビットマップのビットが使えるかどうかのテスト、そしてセットとクリアはマクロにします。処理が小さいこと、呼び出しコストがもったいないことを考慮しました。

厳密な排他処理は考慮しません。所詮はシングルタスク、シングルユーザのシステムですし。

こんなもんでしょうか。

マクロ

マップのビットが立っているかどうかを確認するマクロはこんな感じです。
bxで指定したbitの内容を8bitレジスタに返します。

bitをセットするマクロです。bxで指定されたbitをセットします。

bitをクリアするマクロはこう。bxで指定されたbitをクリアします。

初期化・アロケート・フリー

初期化はこうなります。何はともあれまず最初にこれを実行します。
自分自身の登録もしています。

アロケート処理です。失敗するとdx:axが0、Cフラグが立ちます。

フリー処理です。失敗するとaxに1、Cフラグが立ちます。

定数、変数はこうです。

おわりに

既存のloadappにも組み込みました。monitorが動かないとシステムコールが使えないので、boot1から呼ばれたのかTTSから呼ばれたのかフラグで判定しました。
これでこれからは配置とか気にせずにメモリを使うことができます。

このソースはgithubで公開しています。よろしければどうぞ。
https://github.com/CbWB-Inc/software/tree/main/laboratory/lab02/hyfax-08-alloc

今更ですがalloct.asmはテスト用のドライバアプリです。TTSがコマンド待ちになったら『alloct』と打ち込めば実行されます。

《2026/01/21 22:03:47》

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です