Chapter 12

9章 重ね合わせ処理

misawa
misawa
2022.01.08に更新
このチャプターの目次

ここから 2022/1/1

new

Rust だと #[global_allocator]#[alloc_error_handler] が対応する. Allocator の実装には, linked_list_allocator を使った.
(追記: 同じく linked_list_allocator::LockedHeap を使おうとしている人, もしくは他の既存のアロケータを使おうとしている人は注意: chapter 14 のメモに理由と対策がある)
redox の ralloc を使おうかとも思ったのだが, shim を入れ替えるのは想定されていそうではあるのだが, 罠や面倒事がありそうな予感がして避けた.

前節で作ったページマネージャがここで実際に使われるわけだけれど, 使うと落ちる. ログ出力の有無で落ちるか変わったりする. どうやら, unused として諸々が消えていると動くようで, 結論から言うと, 前章で確保したスタック領域が狭すぎたらしい.
スタック領域を増やすと, 今度は boot loader が落ちる. kernel の(ロード時に必要な)サイズがでかすぎるのが問題で, メモリマップを見て空きが大きそうなアドレスに image-base を書き換えたら動いた. これ普通の boot loader / kernel はどうやっているんだろう. offset paging みたいなことを boot loader 側がしたらよいのか?

layer manager

どう設計するのがよいか考えるので, 無限に時間が吸われる. 結局, layer manager 側と manage される widget 側で, バッファ (を Arc<Mutex<_>> したもの) を共有するようにした.
ホントはダブルバッファとか使ってみたいが.

ここから 2022/1/2

高速化

コンソールは, 行数分だけ shadow buffer が使われた widget を用意し, スクロールは widget の移動として実装した.