aarch64-paging

aarch64-paging ํฌ๋ ˆ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด AArch64 ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜์— ๋”ฐ๋ผ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

// ID ๋งคํ•‘์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
let mut idmap = IdMap::new(ASID, ROOT_LEVEL);
// 2MiB ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.
idmap.map_range(
    &MemoryRegion::new(0x80200000, 0x80400000),
    Attributes::NORMAL | Attributes::NON_GLOBAL | Attributes::READ_ONLY,
).unwrap();
// `TTBR0_EL1`์„ ์„ค์ •ํ•˜์—ฌ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
idmap.activate();
  • ํ˜„์žฌ๋Š” EL1๋งŒ ์ง€์›ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์ต์…‰์…˜ ๋ ˆ๋ฒจ(Exception Level: EL)๋„ ์–ด๋ ต์ง€ ์•Š๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Android์—์„œ ๋ณดํ˜ธ๋œ VM ํŽŒ์›จ์–ด์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ด ์˜ˆ์‹œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ํ•˜๋“œ์›จ์–ด ๋˜๋Š” QEMU์—์„œ ์‹คํ–‰ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.