Rust ์ํ ์ค๋น
Rust ์ฝ๋ ์คํ์ ์์ํ๊ธฐ ์ ์ ๋ช ๊ฐ์ง ์ด๊ธฐํ๋ฅผ ์คํํด์ผ ํฉ๋๋ค.
.section .init.entry, "ax"
.global entry
entry:
/*
* ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ตฌ์ฑ์ ๋ก๋ํ๊ณ ์ ์ฉํฉ๋๋ค. MMU์ ์บ์๋ฅผ
* ์ฌ์ฉ ์ค์ ํ ์ค๋น๊ฐ ๋์์ต๋๋ค. .
*/
adrp x30, idmap
msr ttbr0_el1, x30
mov_i x30, .Lmairval
msr mair_el1, x30
mov_i x30, .Ltcrval
/* ์ง์๋๋ PA ๋ฒ์๋ฅผ TCR_EL1.IPS์ ๋ณต์ฌํฉ๋๋ค. */
mrs x29, id_aa64mmfr0_el1
bfi x30, x29, #32, #4
msr tcr_el1, x30
mov_i x30, .Lsctlrval
/*
* ์ด ์ง์ ์์ ์ค๋ ๋ชจ๋ ๋ด์ฉ์ด ์๋ฃ๋์๋์ง ํ์ธํ๊ณ
* ์ค๋๋ ๋ก์ปฌ TLB ํญ๋ชฉ์ ์ฌ์ฉํ๊ธฐ ์ ์ ๋ฌดํจํํฉ๋๋ค.
*/
isb
tlbi vmalle1
ic iallu
dsb nsh
isb
/*
* MMU์ ์บ์๋ฅผ ์ฌ์ฉํ๋๋ก sctlr_el1์ ๊ตฌ์ฑํ๊ณ ์ด ์์
์ด
* ์๋ฃ๋ ๋๊น์ง ์งํํ์ง ์์ต๋๋ค.
*/
msr sctlr_el1, x30
isb
/* EL1์์ ํธ๋ํ ๋ถ๋ ์์์ ์ก์ธ์ค๋ฅผ ์ฌ์ฉ ์ค์งํฉ๋๋ค. */
mrs x30, cpacr_el1
orr x30, x30, #(0x3 << 20)
msr cpacr_el1, x30
isb
/* bss ์น์
์ 0์ผ๋ก ๋ง๋ญ๋๋ค. */
adr_l x29, bss_begin
adr_l x30, bss_end
0: cmp x29, x30
b.hs 1f
stp xzr, xzr, [x29], #16
b 0b
1: /* ์คํ์ ์ค๋นํฉ๋๋ค. */
adr_l x30, boot_stack_end
mov sp, x30
/* ์์ธ ๋ฒกํฐ๋ฅผ ์ค์ ํฉ๋๋ค. */
adr x30, vector_table_el1
msr vbar_el1, x30
/* Rust ์ฝ๋๋ฅผ ํธ์ถํฉ๋๋ค. */
bl main
/* ๋ฃจํ๊ฐ ์ธํฐ๋ฝํธ๋ฅผ ์์ํ ๊ธฐ๋ค๋ฆฝ๋๋ค. */
2: wfi
b 2b
- ์ด๋ C์ ๊ฒฝ์ฐ์ ๋์ผํฉ๋๋ค. ํ๋ก์ธ์ ์ํ๋ฅผ ์ด๊ธฐํํ๊ณ BSS๋ฅผ 0์ผ๋ก ์ค์ ํ๊ณ ์คํ ํฌ์ธํฐ๋ฅผ ์ค์ ํฉ๋๋ค.
- BSS(์ญ์ฌ์ ์ธ ์ด์ ๋ก, ๋ธ๋ก ์์ ๊ธฐํธ block starting symbol ์ด๋ผ๊ณ ๋ถ๋ฆผ)๋ ์ค๋ธ์ ํธ ํ์ผ์์ 0์ผ๋ก ์ด๊ธฐํ๋ ์ ์ ์ผ๋ก ํ ๋น๋ ๋ณ์๋ค์ ๋ด๊ณ ์์ต๋๋ค. BSS๋ ์ค์ ๋ก ์ด๋ฏธ์ง์ ํฌํจ๋์ง๋ ์์ต๋๋ค. ์ด์ฐจํผ 0์ผ๋ก ์ด๊ธฐํ ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ปดํ์ผ๋ฌ๋ ๋ก๋ ํ๋ก๊ทธ๋จ์ด BSS์ ์ํ๋ ๋ณ์๋ค์ 0์ผ๋ก ์ด๊ธฐํ ํ ๊ฒ์ผ๋ก๊ธฐ๋ํ๊ณ ์ค๋ธ์ ํธ ํ์ผ์ ๋ง๋ญ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ด๊ธฐํ๋๊ณ ์ด๋ฏธ์ง๊ฐ ๋ก๋๋๋ ๋ฐฉ์์ ๋ฐ๋ผ BSS๊ฐ ์ด๋ฏธ 0์ผ๋ก ์ค์ ๋์์ ์๋ ์์ง๋ง ํ์คํ ํ๊ธฐ ์ํด 0์ผ๋ก ์ค์ ํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ๊ธฐ ์ ์ MMU์ ์บ์๋ฅผ ์ฌ์ฉ ์ค์ ํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ์ง ์์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์ ๋ ฌ๋์ง ์์ ์ก์ธ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ์ ๋ ฌ๋์ง ์์ ์ก์ธ์ค๋ฅผ ์์ฑํ์ง ์๋๋ก
+strict-align
์ ์ค์ ํ๋aarch64-unknown-none
ํ๊ฒ์ Rust ์ฝ๋๋ฅผ ๋น๋ํ๋ฏ๋ก ์ด ๊ฒฝ์ฐ์๋ ๋ฌธ์ ๊ฐ ์์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ๋ฐ๋์ ๊ทธ๋ฐ ๊ฒ์ ์๋๋๋ค. - VM์์ ์คํํ๋ค๋ฉด ์บ์ ์ผ๊ด์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ฌธ์ ๋ VM์ ์บ์๊ฐ ์ฌ์ฉ ์ค์ง๋ ์ํ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์ก์ธ์คํ๋ ๋ฐ๋ฉด ํธ์คํธ์๋ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ์ ๋ํด ์บ์ํ ์ ์๋ ๋ณ์นญ์ด ์๋ค๋ ์ ์ ๋๋ค. ํธ์คํธ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ช ์์ ์ผ๋ก ์ก์ธ์คํ์ง ์๋๋ผ๋ ์ถ์ธก ์ก์ธ์ค๋ ์บ์ ์ฑ์ฐ๊ธฐ๋ก ์ด์ด์ง ์ ์์ผ๋ฉฐ, ์บ์๊ฐ ์ ๋ฆฌ๋๊ฑฐ๋ VM์ด ์บ์๋ฅผ ์ฌ์ฉ ์ค์ ํ๋ฉด ๋ ์ค ํ๋์ ๋ณ๊ฒฝ์ฌํญ์ด ์์ค๋ฉ๋๋ค. ์บ์๋ VA ๋๋ IPA๊ฐ ์๋ ์ค์ ์ฃผ์๋ก ํค๊ฐ ์ง์ ๋ฉ๋๋ค.
- ์ ๋ ฌ๋์ง ์์ ์ก์ธ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ์ ๋ ฌ๋์ง ์์ ์ก์ธ์ค๋ฅผ ์์ฑํ์ง ์๋๋ก
- ํธ์์ ๊ธฐ๊ธฐ์ฉ ์ฃผ์ ๊ณต๊ฐ์ ์ฒ์ 1GiB, DRAM์ฉ ๋ค์ 1GiB, ๋ ๋ง์ ๊ธฐ๊ธฐ๋ฅผ ์ํ ๋ ๋ค๋ฅธ 1GiB๋ฅผ ID ๋งคํํ๋ ํ๋์ฝ๋ฉ๋ ํ์ด์ง ํ
์ด๋ธ(
idmap.S
์ฐธ๊ณ )์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ QEMU์์ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์๊ณผ ์ผ์นํฉ๋๋ค. - ์์ธ ๋ฒกํฐ(
vbar_el1
)๋ ์ค์ ํฉ๋๋ค. ์ด์ ๊ดํด์๋ ๋์ค์ ์์ธํ ์์๋ด ๋๋ค. - ์ค๋ ์คํ์ ๋ชจ๋ ์์์๋ ์์ธ ์์ค 1(EL1)์์ ์คํํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๋ค๋ฅธ ์์ธ ์์ค์์ ์คํํด์ผ ํ๋ ๊ฒฝ์ฐ ์ด์ ๋ฐ๋ผ
entry.S
๋ฅผ ์์ ํด์ผ ํฉ๋๋ค.