min1visorのリファクタリング
やること
リファクタリングが必要な場所を探す
リファクタリングする
リファクタリングが必要な場所を探す
☑ 可変なグローバル変数への生ポインタによるアクセス
src/vm.rsのVM_LIST / NEXT_VM_ID
src/main.rsのVIRTIO_BLK / FAT32
☑ アロケーターのfree_pages()の実装
FATをメモリ上に読み込むのに失敗したときの処理で確保した領域を解放していない
☑ HALを削除する
AArch64以外に対応する予定がないため
☑ 警告の修正
未使用インポートや関数などが警告で出ている
すぐできた
可変なグローバル変数への生ポインタによるアクセスの修正
VM_LIST / NEXT_VM_IDを1つの構造体にしてMutexで囲むだけ
アロケーターのfree_pages()の実装
静的変数のALLOCATORを唯一のグローバルアロケータとして設定している
code:rs
pub fn free_pages(address: usize, number_of_pages: usize) {
unsafe {
ALLOCATOR.lock().dealloc_aligned(
address as *mut u8,
number_of_pages << paging::PAGE_SHIFT,
paging::PAGE_SIZE,
);
}
}
ここで使われているdealloc_alignedではPAGE_SIZEのアラインを渡しているが内部で呼ばれているdeallocはそのアラインを使用しない
アラインが小さすぎるとアロケーターとして使われているLinkedListの持てる最小の領域に切り上げられる