ARMv8.9-A / ARMv9.4-A ์์ ์ถ๊ฐ๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์ ์ด ๊ธฐ๋ฒ์ผ๋ก, page table์ ์์ ํ๊ฑฐ๋ TLB invalidation ์์ด ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ๊ทผ ๊ถํ์ ๋์ ์ผ๋ก ์ ํํ๋ ๊ฒ์ ๋ชฉ์ ์ผ๋ก ํ๋ค.
PAC, MTE๊ฐ ๊ฐ๊ฐ control flow ๋ฌด๊ฒฐ์ฑ๊ณผ ๋ฉ๋ชจ๋ฆฌ ํ๊น ์ ๋ด๋นํ๋ค๋ฉด, ์ด๋ฒ์ ๋ค๋ฃฐ PIE + POE๋ ๋ฉ๋ชจ๋ฆฌ ๋๋ฉ์ธ ๊ฒฉ๋ฆฌ๋ฅผ ํ๋์จ์ด ๋ ๋ฒจ์์ ๋ค๋ฃจ๋ ๊ธฐ๋ฒ์ด๋ค.
POE๋ฅผ ์ ๋๋ก ์ดํดํ๋ ค๋ฉด ARMv8.9์์ ํจ๊ป ๋์ ๋ Permission Indirection Extension (PIE) ๋ฅผ ๋จผ์ ์ง์ด์ผ ํ๋ค. ๋์ spec์ ๋ ๋ฆฝ์ ์ธ feature์ง๋ง, POE๋ PIE์ ํ๊ณ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ค๊ณ๋ ๋ณด์ ๊ธฐ๋ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
x86 ์ง์์์๋ ์ด๋ฏธ Intel Memory Protection Keys (MPK) ๋ผ๋ ๋น์ทํ ๊ธฐ๋ฅ์ด ์์๋ค.
MPK๋ userspace์์ page table entry๋ฅผ ์์ ํ์ง ์๊ณ ๋ PKRU ๋ ์ง์คํฐ ํ๋๋ง ๋ฐ๊ฟ์ ํน์ ๋ฉ๋ชจ๋ฆฌ ๋๋ฉ์ธ์ read/write๋ฅผ ๋น ๋ฅด๊ฒ on/offํ ์ ์๋ ๊ธฐ๋ฒ์ธ๋ฐ, syscall์ด๋ TLB flush ์์ด ์ ์ ๊ณต๊ฐ์์ ๊ถํ์ ๋ณ๊ฒฝํ๋ค๋ ์ ์ด ํต์ฌ์ด์๋ค.
ARM์๋ ARMv7 ์์ Memory Domains๋ผ๋ ๋น์ทํ ๊ฐ๋
์ด ์์๋ค. ํ์ง๋ง DACR (Domain Access Control Register)๋ EL0์์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๊ณ , AArch64์์๋ ์์ deprecated ๋์๋ค. ์ด๊ฑธ ์ ๋๋ก ๋ค์ ๋ง๋ค๊ฒ ๋ค๊ณ ๋์จ ๊ฒ PIE์ POE๋ค.
AArch64์ ๊ธฐ์กด permission ๋ชจ๋ธ์ direct ๋ฐฉ์์ด๋ค. PTE์ ๋ช ๊ฐ์ง ๋นํธ๋ค์ด ํด๋น ํ์ด์ง์ ๊ถํ์ ์ง์ ์ธ์ฝ๋ฉํ๋ค.
PTE[54] = UXN (User eXecute Never)
PTE[53] = PXN (Privileged eXecute Never)
PTE[51] = DBM/WRITE
PTE[6] = AP[1] (USER accessible)
์ด ๋ฐฉ์์ ๋จ์ํ๊ณ ์ง๊ด์ ์ด์ง๋ง, ๋ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์๋ค.
์ฒซ์งธ, ํํ ๊ฐ๋ฅํ permission ์กฐํฉ์ด ์ ํ์ ์ด๋ค. ์ 4๊ฐ ๋นํธ์ ์กฐํฉ์ผ๋ก๋ ๊ธฐ๋ณธ์ ์ธ r/w/x ์ ๋๋ง ํํ ๊ฐ๋ฅํ๊ณ , ์๋ฅผ ๋ค์ด "์ฝ๊ธฐ๋ ๊ฐ๋ฅํ์ง๋ง ์ฐ๊ธฐ๋ ํน์ instruction์ผ๋ก๋ง" ๊ฐ์ ์ธ๋ฐํ ๊ถํ์ ํํํ ๋ฐฉ๋ฒ์ด ์๋ค. (GCS๊ฐ ํ์๋ก ํ๋ ๋ฐ๋ก ๊ทธ ๊ถํ์ด๋ค)
๋์งธ, ๊ถํ์ ๋ณ๊ฒฝํ๋ ค๋ฉด ๋น์ฉ์ด ํฌ๋ค. mprotect() syscall์ ํตํด PTE๋ฅผ ์์ ํด์ผ ํ๋ฏ๋ก ํ์ฐ์ ์ผ๋ก kernel mode ์ ํ, TLB invalidation, ๋ฉํฐ์ฝ์ด ํ๊ฒฝ์์๋ TLB shootdown IPI๊น์ง ๋ฐ๋ผ์จ๋ค. JIT compiler, sandbox, memory isolation์ด ๋น๋ฒํ ๋ฐํ์ ํ๊ฒฝ์์๋ ์ด ๋น์ฉ์ด ๊ฝค ํฌ๋ค.
PTE์ ๋นํธ๋ฅผ "๊ถํ ๊ทธ ์์ฒด"๊ฐ ์๋ "๊ถํ ํ ์ด๋ธ์ ์ธ๋ฑ์ค"๋ก ์ฐ์!
PIE (FEAT_S1PIE)๋ permission ์ธ์ฝ๋ฉ ๋ฐฉ์์ indirectํ๊ฒ ๋ฐ๊พผ๋ค. ๊ธฐ์กด์ permission ๋นํธ๋ก ์ฌ์ฉํ๋ PTE ํ๋๋ค์ PIIndex (Permission Indirection Index) ๋ก ์ฌํ์ฉํ๊ณ , ์ค์ ๊ถํ์ ๋ณ๋ ๋ ์ง์คํฐ์ ์ ์๋ ํ
์ด๋ธ์์ lookupํ๋ ๋ฐฉ์์ด๋ค.
PIE๊ฐ ํ์ฑํ (TCR2_EL1.PIE = 1) ๋๋ฉด PTE์ 4๊ฐ ๋นํธ๊ฐ 4-bit PIIndex๋ก ์ฌํด์๋๋ค.
PIIndex[3] โ PTE[54] UXN (User eXecute Never)
PIIndex[2] โ PTE[53] PXN (Privileged eXecute Never)
PIIndex[1] โ PTE[51] WRITE/DBM
PIIndex[0] โ PTE[6] USER (AP[1])
PIIndex๋ ์ฐ์๋ ๋นํธ ํ๋๊ฐ ์๋๋ผ PTE ๋ด 4๊ฐ์ ๋ถ์ฐ๋ ๋นํธ๋ฅผ ์กฐํฉํด์ ๋ง๋๋ index๋ค. ๊ทธ๋์ Linux ์ปค๋์์ pte_pi_index()๋ผ๋ ๋ณ๋ ํจ์๋ก ๊ฐ ๋นํธ๋ฅผ ์์งํด์ ๊ณ์ฐํ๋ค.
4-bit์ด๋ฏ๋ก 0~15, ์ด 16๊ฐ์ domain์ ์ ์ํ ์ ์๋ค.
PIIndex๋ก lookupํ ์ค์ ๊ถํ์ ๋ ๊ฐ์ ๋ ์ง์คํฐ์ ์ ์๋๋ค.
| ๋ ์ง์คํฐ | ๋์ EL | ์ญํ |
|---|---|---|
PIRE0_EL1 | EL0 (userspace) | ๊ฐ์ PIIndex์ ๋ํด EL0์ ๋ถ์ฌํ ๊ถํ |
PIR_EL1 | EL1 (kernel) | ๊ฐ์ PIIndex์ ๋ํด EL1์ ๋ถ์ฌํ ๊ถํ |
๋ ๋ ์ง์คํฐ๊ฐ ์กด์ฌํ๋ ์ด์ ๋ domain ์๋ฅผ ๋๋ฆฌ๋ ค๋ ๊ฒ ์๋๋ผ, ๋์ผํ PIIndex์ ๋ํด EL0์ EL1์ด ์๋ก ๋ค๋ฅธ ๊ถํ์ ๊ฐ์ง ์ ์๋๋ก ํ๊ธฐ ์ํด์๋ค. ๊ฐ ๋ ์ง์คํฐ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก 16๊ฐ domain์ permission์ ์ ์ํ์ง๋ง, ์ด domain ์๋ 16๊ฐ๋ค.
๊ฐ ๋ ์ง์คํฐ๋ 64-bit์ด๋ฉฐ, domain๋น 4-bit์ฉ permission์ ์ ์ํ๋ค.
PIRE0_EL1 ๋๋ PIR_EL1:
[63:60] perm15 : r, w, x, gcs
[59:56] perm14 : r, w, x, gcs
...
[3:0] perm0 : r, w, x, gcs
PIIndex์ 16๊ฐ domain์ "์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์ญ 16๊ฐ์ง"๊ฐ ์๋๋ค. ๊ธฐ์กด PTE permission ๋นํธ 4๊ฐ์ ๋ชจ๋ ์กฐํฉ (2โด = 16)์ด ๊ทธ๋๋ก index๋ก ์ฌํ์ฉ๋๊ธฐ ๋๋ฌธ์, ๊ฐ index๋ ๊ธฐ์กด์ page type๊ณผ 1:1 ๋์๋๋ค.
Linux ์ปค๋ pgtable-prot.h์ ์ฃผ์์ผ๋ก ์ ์ฒด ๋งคํ์ด ๋ช
์๋์ด ์๋ค:
/* 0x0: PAGE_DEFAULT */
/* 0x1: PTE_USER (๋ฏธ์ฌ์ฉ) */
/* 0x2: PTE_WRITE (๋ฏธ์ฌ์ฉ) */
/* 0x3: PTE_WRITE | PTE_USER (๋ฏธ์ฌ์ฉ) */
/* 0x4: PAGE_EXECONLY PTE_PXN */
/* 0x5: PAGE_READONLY_EXEC PTE_PXN | PTE_USER */
/* 0x6: PTE_PXN | PTE_WRITE (๋ฏธ์ฌ์ฉ) */
/* 0x7: PAGE_SHARED_EXEC PTE_PXN | PTE_WRITE | PTE_USER */
/* 0x8: PAGE_KERNEL_ROX PTE_UXN */
/* 0x9: PAGE_GCS_RO PTE_UXN | PTE_USER */
/* 0xa: PAGE_KERNEL_EXEC PTE_UXN | PTE_WRITE */
/* 0xb: PAGE_GCS PTE_UXN | PTE_WRITE | PTE_USER */
/* 0xc: PAGE_KERNEL_RO PTE_UXN | PTE_PXN */
/* 0xd: PAGE_READONLY PTE_UXN | PTE_PXN | PTE_USER */
/* 0xe: PAGE_KERNEL PTE_UXN | PTE_PXN | PTE_WRITE */
/* 0xf: PAGE_SHARED PTE_UXN | PTE_PXN | PTE_WRITE | PTE_USER */
์ค์ ๋ก Linux์์ ๊ฐ domain์ ๋ถ์ฌํ๋ permission์ PIE_E0 (โ PIRE0_EL1) ์ PIE_E1 (โ PIR_EL1) ๋ก ์ ์๋๋ค.
// EL0 permission table (PIRE0_EL1)
#define PIE_E0 (
PIRx_ELx_PERM(pte_pi_index(_PAGE_GCS), PIE_GCS) // 0xb: GCSSTR๋ง ํ์ฉ
PIRx_ELx_PERM(pte_pi_index(_PAGE_GCS_RO), PIE_R) // 0x9: ์ฝ๊ธฐ๋ง
PIRx_ELx_PERM(pte_pi_index(_PAGE_EXECONLY), PIE_X_O) // 0x4: ์คํ๋ง (overlay on)
PIRx_ELx_PERM(pte_pi_index(_PAGE_READONLY_EXEC), PIE_RX_O) // 0x5: ์ฝ๊ธฐ+์คํ (overlay on)
PIRx_ELx_PERM(pte_pi_index(_PAGE_SHARED_EXEC), PIE_RWX_O) // 0x7: ์ฝ์ฐ์ค (overlay on)
PIRx_ELx_PERM(pte_pi_index(_PAGE_READONLY), PIE_R_O) // 0xd: ์ฝ๊ธฐ๋ง (overlay on)
PIRx_ELx_PERM(pte_pi_index(_PAGE_SHARED), PIE_RW_O)) // 0xf: ์ฝ์ฐ (overlay on)
// EL1 permission table (PIR_EL1)
#define PIE_E1 (
PIRx_ELx_PERM(pte_pi_index(_PAGE_GCS), PIE_NONE_O) // 0xb: ์ ๊ทผ ๋ถ๊ฐ
PIRx_ELx_PERM(pte_pi_index(_PAGE_GCS_RO), PIE_NONE_O) // 0x9: ์ ๊ทผ ๋ถ๊ฐ
PIRx_ELx_PERM(pte_pi_index(_PAGE_EXECONLY), PIE_NONE_O) // 0x4: ์ ๊ทผ ๋ถ๊ฐ
PIRx_ELx_PERM(pte_pi_index(_PAGE_READONLY_EXEC), PIE_R) // 0x5: ์ฝ๊ธฐ๋ง
PIRx_ELx_PERM(pte_pi_index(_PAGE_SHARED_EXEC), PIE_RW) // 0x7: ์ฝ์ฐ
PIRx_ELx_PERM(pte_pi_index(_PAGE_READONLY), PIE_R) // 0xd: ์ฝ๊ธฐ๋ง
PIRx_ELx_PERM(pte_pi_index(_PAGE_SHARED), PIE_RW) // 0xf: ์ฝ์ฐ
PIRx_ELx_PERM(pte_pi_index(_PAGE_KERNEL_ROX), PIE_RX) // 0x8: ์ฝ๊ธฐ+์คํ
PIRx_ELx_PERM(pte_pi_index(_PAGE_KERNEL_EXEC), PIE_RWX) // 0xa: ์ฝ์ฐ์ค
PIRx_ELx_PERM(pte_pi_index(_PAGE_KERNEL_RO), PIE_R) // 0xc: ์ฝ๊ธฐ๋ง
PIRx_ELx_PERM(pte_pi_index(_PAGE_KERNEL), PIE_RW)) // 0xe: ์ฝ์ฐ
์ฌ๊ธฐ์ ์ฃผ๋ชฉํ ์ ์ด ๋ ๊ฐ์ง ์๋ค.
GCS permission์ด PIE ์์ด๋ ๋ถ๊ฐ๋ฅํ ์ด์ : PAGE_GCS (0xb)๋ direct model์์ PTE_UXN | PTE_WRITE | PTE_USER๋ก, "UXN์ด๋ฉด์ USER ์ ๊ทผ ๊ฐ๋ฅ"์ด๋ผ๋ ๋ชจ์์ ์ธ ์กฐํฉ์ด์๋ค. PIE ํ์์๋ ์ด ๋นํธ ์กฐํฉ์ index๋ก ์ฌํด์ํด์ PIE_GCS๋ผ๋ ์ permission์ ๋ถ์ฌํ ์ ์๊ฒ ๋๋ค. "์ผ๋ฐ write๋ ๋ง๊ณ GCSSTR instruction์ผ๋ก๋ง ์ธ ์ ์๋" GCS ์ ์ฉ ๊ถํ์ด ๋ฐ๋ก ์ด๊ฒ์ด๋ค. GCS๋ PIE ์์ด๋ ํํ ์์ฒด๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
_O suffix์ ์๋ฏธ: PIE_RW_O์ฒ๋ผ _O๊ฐ ๋ถ์ encoding์ "POE overlay ์ ์ฉ ๊ฐ๋ฅ" ๋ฒ์ ์ด๋ค. EL0์ฉ PIRE0_EL1์์๋ ์ ๋ถ _O suffix ๋ฒ์ ์ ์ฌ์ฉํด์ผ POE์ ํจ๊ป ๋์ํ๋ค. EL1์ฉ PIR_EL1์๋ overlay๊ฐ ์ ์ฉ๋์ง ์์ผ๋ฏ๋ก _O ์๋ ๋ฒ์ ์ ์ด๋ค.
PIE๋ก ๋ ํ๋ถํ ๊ถํ ํํ์ด ๊ฐ๋ฅํด์ก์ง๋ง, ๊ถํ ๋ณ๊ฒฝ ๋น์ฉ ๋ฌธ์ ๋ ์ฌ์ ํ ํด๊ฒฐ๋์ง ์๋๋ค.
PIRE0_EL1์ EL1(์ปค๋)์์๋ง ์ธ ์ ์๊ณ , ๋ณ๊ฒฝ ํ TLB flush๊ฐ ํ์ํ๋ค. ๊ถํ์ ๋ฐ๊พธ๋ ค๋ฉด ์ฌ์ ํ ์ปค๋ ์ง์
์ด ๋ถ๊ฐํผํ๋ค.
์ฌ๊ธฐ์ POE๊ฐ ๋ฑ์ฅํ๋ค.
PIE๋ก base permission์ ์ ํ์ผ๋ฉด, ๊ทธ ์์ overlay๋ฅผ ์์์ EL0์์ ์ง์ ์กฐ์ด์!
POE (FEAT_S1POE)๋ PIE๊ฐ ๊ฒฐ์ ํ base permission ์์ ์ถ๊ฐ์ ์ธ ์ ํ(overlay) ์ EL0์์ ์ง์ , syscall ์์ด ๊ฑธ ์ ์๋ ๊ธฐ๋ฒ์ด๋ค.
POE๋ PIE์ ๋ ๋ฆฝ์ ์ธ ๋ณ๋์ index ๊ณต๊ฐ์ ์ฌ์ฉํ๋ค.
| PIIndex | POIndex | |
|---|---|---|
| PTE ๋นํธ ์์น | UXN[54], PXN[53], DBM[51], USER[6] โ ๋ถ์ฐ๋ 4๋นํธ | [62:60] โ ์ฐ์๋ 3๋นํธ |
| ๋นํธ ์ | 4-bit | 3-bit |
| domain ์ | 16๊ฐ | 8๊ฐ |
| lookup ๋ ์ง์คํฐ | PIRE0_EL1 / PIR_EL1 | POR_EL0 / POR_EL1 |
| ๋๊ฐ ์์ | EL1 (์ปค๋) | EL0 (์ ์ , syscall ์์ด!) |
PIIndex์ POIndex๋ ์๋ก ๋ค๋ฅธ PTE ๋นํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ํ๋์ PTE์ ๋ index๊ฐ ๋์์ ์กด์ฌํ๋ค.
POIndex๋ 3-bit์ด๋ฏ๋ก 0~7, ์ด 8๊ฐ์ domain์ด๋ค. ์ด domain๋ค์ PIE์ 16๊ฐ domain๊ณผ ๋ณ๊ฐ์ ๊ณต๊ฐ์ด๋ฉฐ, "์ด๋ค ์คํ ๋งฅ๋ฝ(context)์์ ํ์ฉํ ๊ถํ" ์ ์ ์ํ๋ค.
POR_EL0:
[63:60] perm7 : r, w, x, po
[59:56] perm6 : r, w, x, po
[55:52] perm5 : r, w, x, po
[51:48] perm4 : r, w, x, po
[47:44] perm3 : r, w, x, po
[43:40] perm2 : r, w, x, po
[39:36] perm1 : r, w, x, po
[3:0] perm0 : (๊ณ ์ : full permission, ํธํ์ฑ ๋ณด์ฅ)
domain 0๋ full permission์ผ๋ก ๊ณ ์ ๋์ด ์์ด์ ์ค์ง์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ overlay domain์ 7๊ฐ (index 1~7) ๋ค.
๋ extension์ด ๋ชจ๋ ํ์ฑํ๋ ๊ฒฝ์ฐ, ๊ถํ ์ฒด์ธ์ ๋ค์๊ณผ ๊ฐ๋ค.
PTE[UXN,PXN,WRITE,USER] โ PIRE0_EL1[PIIndex] โ base_perm (PIE๊ฐ ๊ฒฐ์ )
โ AND
PTE[62:60] โ POR_EL0[POIndex] โ overlay_perm (POE๊ฐ ์ถ๊ฐ ์ ํ)
โ
effective_perm
overlay๋ ๊ถํ์ ์ถ๊ฐํ ์ ์๊ณ ์ ํ๋ง ๊ฐ๋ฅํ๋ค. ๋ํ POR_EL0๋ TLB์ ์บ์ฑ๋์ง ์์ผ๋ฏ๋ก, ๋ ์ง์คํฐ write ํ ๋ฒ์ผ๋ก ์ฆ์ effective permission์ด ๋ฐ๋๋ค.
PIE ์์ด POE๋ง ํ์ฑํ๋ ๊ฒฝ์ฐ์๋ ๊ธฐ์กด direct PTE permission์ด base_perm์ด ๋๋ค.
CONFIG_ARM64_POE=y # ARMv8.9 architectural features ๋ฉ๋ด
PIE ์ด๊ธฐํ๋ arch/arm64/mm/proc.S์ __cpu_setup์์:
mrs_s x1, SYS_ID_AA64MMFR3_EL1
ubfx x1, x1, #ID_AA64MMFR3_EL1_S1PIE_SHIFT, #4
cbz x1, .Lskip_indirection
mov_q x0, PIE_E0 // PIRE0_EL1 ์ธํ
msr REG_PIRE0_EL1, x0
mov_q x0, PIE_E1 // PIR_EL1 ์ธํ
msr REG_PIR_EL1, x0
mov x0, TCR2_ELx_PIE
msr REG_TCR2_EL1, x0 // PIE ํ์ฑํ
POE context switch๋ arch/arm64/kernel/process.c์์ POR_EL0๋ฅผ per-task๋ก save/restore.
Linux 6.13-rc1๋ถํฐ PIE + POE ๋ชจ๋ mainline ๋ฐ์ ์๋ฃ.
POE๋ Linux Memory Protection Keys (pkeys) syscall ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋ ธ์ถ๋๋ค.
// 1. protection key ํ ๋น (์ปค๋์ด POIndex๋ฅผ ํ ๋น)
int pkey = pkey_alloc(0, 0);
// 2. ๋ฉ๋ชจ๋ฆฌ ์์ญ์ pkey ์ฐ๊ฒฐ (PTE์ POIndex ๋นํธ๋ฅผ ์ค์ , ์ปค๋ ์ง์
ํ์)
pkey_mprotect(addr, len, PROT_READ | PROT_WRITE, pkey);
// 3. EL0์์ POR_EL0 ์ง์ ์์ โ syscall ์์!
pkey_set(pkey, PKEY_DISABLE_WRITE); // write overlay ์ ํ
pkey_set(pkey, PKEY_DISABLE_ACCESS); // read/write overlay ์ ํ
// 4. ๋ค์ ํ์ฉ
pkey_set(pkey, 0);
step 1~2๋ ์ปค๋ ์ง์ ์ด ํ์ํ์ง๋ง, ๊ถํ์ ์์ฃผ ๋ฐ๊พธ๋ step 3~4๋ ์์ ์ ์ ๊ณต๊ฐ์์ ๋ ์ง์คํฐ write ํ ๋ฒ์ผ๋ก ๋๋๋ค๋ ๊ฒ ํต์ฌ ์ด์ .
PIE + POE์ ํต์ฌ ํ๊ฒ์ intra-process isolation์ด๋ค.
PIE_GCS permission์ ํตํด return address stack ๋ณดํธDomain ์ ์ ํ: POIndex๊ฐ 3-bit์ด๋ฏ๋ก ์ค์ง์ ์ผ๋ก 7๊ฐ overlay domain๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. PIE์ 16๊ฐ domain๊ณผ๋ ๋ณ๊ฐ์ ๊ณต๊ฐ์ด๊ณ , ๋์ ์กฐํฉํด์ ๋๋ฆด ์๋ ์์ง๋ง (NanoZone ๋ ผ๋ฌธ ์ฐธ๊ณ ) ๊ทธ๊ฑด ์ํคํ ์ฒ ์คํ ๋ฐ์ ์ฐ๊ตฌ ๋ ๋ฒจ ๊ธฐ๋ฒ์ด๋ค.
intra-process ๋ฒ์: POE๋ ํ๋ก์ธ์ค ๋ด ๊ฒฉ๋ฆฌ๋ค. ์ปค๋์ด ํํ๋๋ฉด PIRE0_EL1 ์ด๋ PTE์ POIndex๋ฅผ ์กฐ์ํ ์ ์๋ค.
POR_EL0 ๋ฌด๊ฒฐ์ฑ: POR_EL0๋ EL0์์ ์ง์ ์์ ๊ฐ๋ฅํ๋ฏ๋ก, ๊ณต๊ฒฉ์๊ฐ ์์ ์ฝ๋ ์คํ ๊ถํ์ ์ด๋ฏธ ํ๋ํ๋ค๋ฉด overlay ์ค์ ์ ๋ฐ๊ฟ๋ฒ๋ฆด ์ ์๋ค. POE๋ ๋ฒ๊ทธ๋ก ์ธํ ์๋์น ์์ ์ ๊ทผ์ ๋ง๋ ๋ฐ๋ ํจ๊ณผ์ ์ด์ง๋ง, ์
์์ ์ธ ์ฝ๋์ ์๋์ ์ธ ์ฐํ์ ๋ํด์๋ ๋ณ๋ ๋ณดํธ ๋ ์ด์ด๊ฐ ํ์ํ๋ค.
์ฒ์์ PIE ์คํ๋ง ๋ดค์ ๋๋ "PTE ๋นํธ๋ฅผ index๋ก ์ฌํ์ฉํ๋ cleverํ trick์ด๊ตฌ๋" ์ ๋์๋๋ฐ, domain ๋งคํ ํ
์ด๋ธ์ ์ง์ ๋ฏ์ด๋ณด๋ ์ค๊ณ ์๋๊ฐ ๊ฝค ๋ช
ํํ๋ค. ๊ธฐ์กด 16๊ฐ์ง PTE ๋นํธ ์กฐํฉ์ ๊ทธ๋๋ก index๋ก ์ฌํ์ฉํด์ ํ์ ํธํ์ฑ์ ์ ์งํ๋ฉด์ GCS ๊ฐ์ ์ ๊ท permission type์ ๋ผ์ ๋ฃ๋ ๋ฐฉ์์ด ์ธ์์ ์ด๋ค. ํนํ PAGE_GCS๊ฐ direct model์์๋ ๋ชจ์์ ์ธ ๋นํธ ์กฐํฉ์ด์๋ ๊ฑธ PIE๋ก ์ ์ฉํ๊ฒ ์ฌํ์์ํจ ๋ถ๋ถ์ด ์ฌ๋ฏธ์๋ค.
PIE์ POE์ ์ญํ ๋ถ๋ด๋ ๊น๋ํ๋ค. PIE๋ ์ปค๋์ด "์ด ํ์ด์ง์๋ ์ด๋ค permission์ ์ค ์ ์๋์ง"๋ฅผ ํ ์ด๋ธ๋ก ์ ์ํ๊ณ , POE๋ ์ ์ ๊ฐ "์ง๊ธ ์ด ์คํ ๋งฅ๋ฝ์์ ๊ทธ ์ค ์ผ๋ง๋ ํ์ฉํ ๊ฑด์ง"๋ฅผ ๋ ์ง์คํฐ๋ก ์ค์๊ฐ ์กฐ์ ํ๋ ๊ตฌ์กฐ. ๋์ด ์ง์ ์ด๋ค์ผ ๋น๋ก์ "ํํ๋ ฅ ์๋ ๊ถํ์ ๋น์ฉ ์์ด ๋ฐ๊พธ๋" ๊ฒ ์์ฑ๋๋ค.
๋ค์์ ๋์ฌ POE2 (FEAT_S1POE2)๋ domain ์๋ฅผ ๋๋ฆฌ๊ณ caller context ๊ธฐ๋ฐ overlay๊น์ง ์ง์ํ๋ค๊ณ ํ๋, ๊ธฐ๋ํด๋ณผ ๋ง ํ๋ค.
๊ด๋ จํด์ PIE + POE๋ฅผ ARM CCA ํ๊ฒฝ์ ๋ฉ๋ชจ๋ฆฌ ๊ฒฉ๋ฆฌ์ ํ์ฉํ NanoZone ๋ ผ๋ฌธ๋ ์ต๊ทผ ๋์์ผ๋ ๊ด์ฌ ์๋ค๋ฉด ์ฝ์ด๋ณผ ๋ง ํ๋ค.