aarch64-paging

aarch64-pagingクレートはAArch64仮想メモリシステムアーキテクチャに則ったページテーブルの生成を可能にします。

use aarch64_paging::{
    idmap::IdMap,
    paging::{Attributes, MemoryRegion},
};

const ASID: usize = 1;
const ROOT_LEVEL: usize = 1;

// 仮想物理同一となる新しいページテーブルを作成します。
let mut idmap = IdMap::new(ASID, ROOT_LEVEL);
// 2 MiB のメモリ領域を読み取り専用としてマッピングします。
idmap.map_range(
    &MemoryRegion::new(0x80200000, 0x80400000),
    Attributes::NORMAL | Attributes::NON_GLOBAL | Attributes::READ_ONLY,
).unwrap();
// `TTBR0_EL1` を設定してページテーブルを有効にします。
idmap.activate();
  • 現時点ではEL1しかサポートされていませんが、他の例外レベルのサポートも簡単に追加できるはずです。
  • これはAndroidでProtected VM Firmwareのために利用されています。
  • この例は本物のハードウェアかQEMUを必要とするので、簡単には実行できません。