Rust+UEFIでOS作りたいので、はりぼてOSのメモリアロケータをRustに移植できないかなーと思ってやってみた。(あるものを流用した方が楽だよね。)
双方向線形リスト化するなどの改良が入ってるけど本質は同じもの。
このGitHubに上げてます。
ざっくりとした使い方はこんな感じ
// インスタンスを生成する
let mut manager = PageMemoryManager::new();
unsafe{
// UEFIのメモリマップとかから、情報をもらって
// メモリ管理モジュールにメモリの空き情報を登録する
manager.free_page_frames(memtranse(0x10000,0x1000));
manager.free_page_frames(memtranse(0x14000,0x2000));
manager.free_page_frames(memtranse(0x13000,0x1000));
// 使う。領域は1ページの倍数で降ってくる。
let mem1=manager.get_page_frames(0x2000).unwrap();
let mem2=manager.get_page_frames(0x1000).unwrap();
let mem3=manager.get_page_frames(0x1000).unwrap();
println!("{:?} pages:{}",mem1.memory(),mem1.pages());
println!("{:?} pages:{}",mem2.memory(),mem2.pages());
println!("{:?} pages:{}",mem3.memory(),mem3.pages());
}
アロケートできなければpanicする。便利だなぁ。
C言語だったらifが確実に入って読みにくいコードになってた気がする。
Rustほんと便利なのでベアメタル環境とかで積極的に使われていくべきなんだよなぁ
きょうはここまで。