์๋ ์์ ์ ๋๋ ์ฌ๋ฏธ๋ก ๊ฒฐ์ ํ์ต๋๋ค ๊ณผ์ ์ ๊ฐ์ญ์ฑ์ ์ฆ๋ช
ํ๋ค ๊ธฐ๊ณ ์ฝ๋์์ JavaScript(๋ณด๋ค ์ ํํ๊ฒ๋ Asm.js)๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. ์คํ์ ์ํด QEMU๊ฐ ์ ํ๋์๊ณ ์ผ๋ง ํ Habr์ ๋ํ ๊ธฐ์ฌ๊ฐ ์์ฑ๋์์ต๋๋ค. ๋๊ธ์์ ๋๋ WebAssembly์์ ํ๋ก์ ํธ๋ฅผ ๋ค์ ๋ง๋ค๊ณ ์ฌ์ง์ด ์ค์ค๋ก ๊ทธ๋ง๋๋ผ๋ ์กฐ์ธ์ ๋ฐ์์ต๋๋ค. ๊ฑฐ์ ๋๋ฌ๋ค ์ ์ง ํ๋ก์ ํธ๊ฐ ๋ง์์ ๋ค์ง ์์์ต๋๋ค ... ์์
์ด ์งํ ์ค์ด์์ง๋ง ๋งค์ฐ ๋๋ฆฌ๊ฒ ์งํ๋์์ผ๋ฉฐ ์ต๊ทผ์ ํด๋น ๊ธฐ์ฌ๊ฐ ๋ํ๋ฌ์ต๋๋ค.
์์
QEMU๋ฅผ JavaScript๋ก "์ด๋ป๊ฒ๋ " ํฌํ ํ๋ ๋ฐฉ๋ฒ์ ์ด๋ฏธ ๋ฐฐ์ ๊ธฐ ๋๋ฌธ์ ์ด๋ฒ์๋ ํ๋ช ํ๊ฒ ์ํํ๊ณ ์ค๋๋ ์ค์๋ฅผ ๋ฐ๋ณตํ์ง ์๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
์ค๋ฅ ๋ฒํธ XNUMX: ํฌ์ธํธ ๋ฆด๋ฆฌ์ค์์ ๋ถ๊ธฐ
๋์ ์ฒซ ๋ฒ์งธ ์ค์๋ ์
์คํธ๋ฆผ ๋ฒ์ 2.4.1์์ ๋ด ๋ฒ์ ์ ํฌํฌํ ๊ฒ์ด์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๊ทธ๊ฒ์ ์ข์ ์๊ฐ์ธ ๊ฒ ๊ฐ์์ต๋๋ค. ํฌ์ธํธ ๋ฆด๋ฆฌ์ค๊ฐ ์กด์ฌํ๋ค๋ฉด ์๋ง๋ ๋จ์ํ 2.4๋ณด๋ค ๋ ์์ ์ ์ผ ๊ฒ์
๋๋ค. master
. ๊ทธ๋ฆฌ๊ณ ๋ด ๋ฒ๊ทธ๋ฅผ ๊ฝค ๋ง์ด ์ถ๊ฐํ ๊ณํ์ด์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ฌ๋์ ๋ฒ๊ทธ๋ ์ ํ ํ์ํ์ง ์์์ต๋๋ค. ์๋ง๋ ๊ทธ๋ ๊ฒ๋์์ ๊ฒ์
๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ฌธ์ ๋ QEMU๊ฐ ๊ฐ๋งํ ์์ง ์๊ณ ์ด๋ ์๊ฐ์๋ ์์ฑ๋ ์ฝ๋๋ฅผ 10% ์ต์ ํํ๊ฒ ๋ค๊ณ ๋ฐํํ๊ธฐ๋ ํ๋ค. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ์ฌ๋ด์ ๋ง๋ค ํ์๊ฐ ์์ต๋๋ค: QEMU.js์ ๋จ์ผ ์ค๋ ๋ ํน์ฑ๊ณผ ์๋ QEMU๊ฐ ๋ฉํฐ ์ค๋ ๋ฉ์ ๋ถ์ฌ๋ฅผ ์๋ฏธํ์ง ์๋๋ค๋ ์ฌ์ค(์ฆ, ๊ด๋ จ๋์ง ์์ ์ฌ๋ฌ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ๋์์ ์๋ํ๋ ๊ธฐ๋ฅ ๋ฐ ๋จ์ํ "๋ชจ๋ ์ปค๋์ ์ฌ์ฉํ๋ ๊ฒ"์ด โโ์๋๋ผ ์ธ๋ถ์์ ํธ์ถํ ์ ์๋๋ก ์ค๋ ๋์ ์ฃผ์ ๊ธฐ๋ฅ์ "ํด์ "ํด์ผ ํ์ต๋๋ค. ์ด๋ก ์ธํด ํฉ๋ณ ์ค์ ๋ช ๊ฐ์ง ์์ฐ์ ์ธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ง์ ์์ ์ผ๋ถ ๋ณ๊ฒฝ๋ ์ฌ์ค์ master
๋ด ์ฝ๋๋ฅผ ๋ณํฉํ๋ ค๊ณ ์๋ํ ์ฝ๋๋ ํฌ์ธํธ ๋ฆด๋ฆฌ์ค์์ ์ฒด๋ฆฌ ์ ํ๋์์ผ๋ฏ๋ก(๋ฐ๋ผ์ ๋ด ๋ธ๋์น์์๋) ํธ์์ฑ์ด ์ถ๊ฐ๋์ง ์์์ ๊ฒ์
๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ ๋ ํ๋กํ ํ์
์ ๋ฒ๋ฆฌ๊ณ ๋ถํ์ฉ์ผ๋ก ๋ถํดํ๊ณ ๋ ์๋ก์ด ๊ฒ์ ๊ธฐ๋ฐ์ผ๋ก ์ฒ์๋ถํฐ ์ ๋ฒ์ ์ ๋ง๋๋ ๊ฒ์ด ์ฌ์ ํ ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ๊ฒฐ์ ํ์ต๋๋ค. master
.
๋ ๋ฒ์งธ ์ค์: TLP ๋ฐฉ๋ฒ๋ก
๋ณธ์ง์ ์ผ๋ก ์ด๊ฒ์ ์ค์๊ฐ ์๋๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก "์ด๋๋ก ์ด๋ป๊ฒ ์ด๋ํ ๊ฒ์ธ๊ฐ?"์ "์ฐ๋ฆฌ๊ฐ ๊ฑฐ๊ธฐ์ ๋์ฐฉํ ๊ฒ์ธ๊ฐ?"์ ๋ํ ์์ ํ ์คํด์ ์กฐ๊ฑด์์ ํ๋ก์ ํธ๋ฅผ ๋ง๋๋ ๊ธฐ๋ฅ์ผ๋ฟ์ ๋๋ค. ์ด๋ฌํ ์กฐ๊ฑด์์๋ ์ํฌ๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ ๋นํ ์ ํ์ด์์ง๋ง ๋น์ฐํ ๋ถํ์ํ๊ฒ ๋ฐ๋ณตํ๊ณ ์ถ์ง ์์์ต๋๋ค. ์ด๋ฒ์๋ ์์์ ์ปค๋ฐ, ์์์ ์ธ ์ฝ๋ ๋ณ๊ฒฝ(Wikiquote์ ๋ฐ๋ฅด๋ฉด Linus Torvalds๊ฐ ๋๊ตฐ๊ฐ์ ๋ํด ๋งํ ๊ฒ์ฒ๋ผ "์ปดํ์ผํ ๋๊น์ง (๊ฒฝ๊ณ ์ ํจ๊ป) ์์์ ๋ฌธ์๋ฅผ ์ฐ๊ฒฐ"ํ์ง ์์) ๋ฑ์ ํ๋ช ํ๊ฒ ์ํํ๊ณ ์ถ์์ต๋๋ค.
์ธ ๋ฒ์งธ ์ค์: ํฌ๋๋ฅผ ๋ชจ๋ฅด๊ณ ๋ฌผ์ ๋ค์ด๊ฐ๋ ๊ฒ
์์ง ์ด ๋ฌธ์ ๋ฅผ ์์ ํ ์์ ์ง๋ ๋ชปํ์ง๋ง ์ด์ ์ ํญ์ด ๊ฐ์ฅ ์ ์ ๊ธธ์ ์ ํ ๋ฐ๋ฅด์ง ์๊ณ "์ฑ์ธ์ผ๋ก์" ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์ฆ, TCG ๋ฐฑ์๋๋ฅผ ์ฒ์๋ถํฐ ์์ฑํ๊ธฐ๋ก ํ์ต๋๋ค. ๋์ค์ ์ด๋ ๊ฒ ๋งํด์ผ ํฉ๋๋ค. "๋ฌผ๋ก ๋๋ฆฌ์ง๋ง ๋ชจ๋ ๊ฒ์ ์ ์ดํ ์๋ ์์ต๋๋ค. ๊ทธ๊ฒ TCI๊ฐ ์์ฑ๋ ๋ฐฉ์์ ๋๋ค..." ๋์ฑ์ด ์ด๊ฒ์ ์ฒ์์๋ ๋ถ๋ช ํ ํด๊ฒฐ์ฑ ์ฒ๋ผ ๋ณด์์ต๋๋ค. ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋ค์ โ๊ฒํธ๊ฐ ๋ชจ์๋คโ๊ณ ๋งํ๋ฏ์ดั, ๊ทธ๋ฌ๋ ๊ทธ ์ฝ๋๋ ์๋๋๋ค.โ: ์ฝ๋๋ ๋ฌผ๋ก ๋ฐ์ด๋๋ฆฌ์ด์ง๋ง ์ ์ด๊ฐ ๋จ์ํ ์ฝ๋๋ก ์ ์ก๋ ์๋ ์์ต๋๋ค. ์ปดํ์ผ์ ์ํด ๋ช ์์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ์ ํธ์๋์ด์ผ ํ๋ฉฐ JS ์ธ๊ณ์ ํน์ ๊ฐ์ฒด๊ฐ ์์ฑ๋์ด์ผ ํฉ๋๋ค. ์ด๋๊ฐ์ ์ ์ฅ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ธ RISC ์ํคํ ์ฒ์์ ๋ด๊ฐ ์ดํดํ๋ ํ ์ผ๋ฐ์ ์ธ ์ํฉ์ ์ฌ์์ฑ๋ ์ฝ๋์ ๋ํ ๋ช ๋ น ์บ์๋ฅผ ๋ช ์์ ์ผ๋ก ์ฌ์ค์ ํด์ผ ํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ์ฐ๋ฆฌ์๊ฒ ํ์ํ ๊ฒ์ด ์๋๋ผ๋ฉด ์ด์จ๋ ์ข ๋ฃ๋ฉ๋๋ค. ๊ฒ๋ค๊ฐ ์ง๋๋ฒ ์๋์์ ์ ์ด๊ฐ ๋ฒ์ญ ๋ธ๋ก์ ์ค๊ฐ์ผ๋ก ์ ๋ฌ๋์ง ์๋ ๊ฒ ๊ฐ์์ ์คํ์ ์์ ํด์๋ ๋ฐ์ดํธ์ฝ๋๊ฐ ์ค์ ๋ก ํ์ํ์ง ์๊ณ TB์ ํจ์์์ ๊ฐ๋จํ ์์ฑํ ์ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. .
๊ทธ๋ค์ด ์์ ๋ฐ๋ก ์ฐผ๋ค
XNUMX์์ ์ฝ๋๋ฅผ ๋ค์ ์์ฑํ๊ธฐ ์์ํ์ง๋ง ๋์ ๋์ง ์๊ฒ ๋ง๋ฒ ๊ฐ์ ์ผ์ด ์ผ์ด๋ฌ์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก GitHub์ ํธ์ง๋ ์ด์ ๋ฐ ํ ์์ฒญ์ ๋ํ ์๋ต์ ๋ํ ์๋ฆผ์ผ๋ก ๋์ฐฉํ์ง๋ง ์ฌ๊ธฐ์๋ ๊ฐ์๊ธฐ ์ค๋ ๋์์ ์ธ๊ธ
๊ทธ ๋ค์์๋ ๋ ๋ง์ ๊ฒ์ด์์์ต๋๋ค
- ์ ํ ์ค์นํ์ง ์๊ณ ๊ต์ก์ ์ธ ๊ฒ์ ์์ํ๊ธฐ
- ์๋ฌธ์ ๋ฐ๋ฅด๋ฉด ์ฆ์์์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ ์ ์ผํ ์ ํ๋ฆฌ์ผ์ด์ ์ JS ์์ง๋ฟ์ด๋ผ๋ ์๋ฌธ์ด ์๋ iOS์ ๊ฐ์ํ(์ฌ์ค์ธ๊ฐ์?)
- ๋ฏธ๋ OS ์์ฐ - ๋จ์ผ ํ๋กํผ, ๋ด์ฅ, ๋ชจ๋ ์ข ๋ฅ์ ํ์จ์ด ๋ฑ...
๋ธ๋ผ์ฐ์ ๋ฐํ์ ๊ธฐ๋ฅ
์ด๋ฏธ ๋งํ๋ฏ์ด QEMU๋ ๋ฉํฐ์ค๋ ๋ฉ๊ณผ ์ฐ๊ฒฐ๋์ด ์์ง๋ง ๋ธ๋ผ์ฐ์ ์๋ ๋ฉํฐ์ค๋ ๋ฉ์ด ์์ต๋๋ค. ๊ธ์์, ์๋์... ์ฒ์์๋ ์ ํ ์กด์ฌํ์ง ์์์ผ๋ ๋์ค์ WebWorkers๊ฐ ๋ํ๋ฌ์ต๋๋ค. ์ ๊ฐ ์๋ ํ ์ด๊ฒ์ ๋ฉ์์ง ์ ๋ฌ์ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ฉํฐ์ค๋ ๋ฉ์
๋๋ค. ๊ณต์ ๋ณ์ ์์ด. ๋น์ฐํ ์ด๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ๊ธฐ์กด ์ฝ๋๋ฅผ ์ด์ํ ๋ ์ฌ๊ฐํ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํฉ๋๋ค. ๊ทธ๋ฌ๋ค๊ฐ ๋์ค์ ์๋ ฅ์ ๋ฐ์ ์ด ์ด๋ฆ์ผ๋ก๋ ์ํ๋์์ต๋๋ค. SharedArrayBuffers
. ์ ์ฐจ์ ์ผ๋ก ๋์
๋์ด ๋ค์ํ ๋ธ๋ผ์ฐ์ ์์ ์ถ์๋ฅผ ์ถํํ ๋ค์ ์ํด๋ฅผ ์ถํํ๊ณ ๋ฉํธ๋ค์ด... ๊ทธ ํ ๊ทธ๋ค์ ์๊ฐ ์ธก์ ์ด ๋๋ต์ ์ด๊ฑฐ๋ ๋๋ต์ ์ด๋ผ๋ ๊ฒฐ๋ก ์ ๋๋ฌํ์ง๋ง ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ์ค๋ ๋๊ฐ ์นด์ดํฐ๋ฅผ ์ฆ๊ฐ์ํค๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋์ผํฉ๋๋ค.
๋ ๋ฒ์งธ ๊ธฐ๋ฅ์ ์คํ์ ์ฌ์ฉํ์ฌ ๋ฎ์ ์์ค์ ์กฐ์์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์
๋๋ค. ๋จ์ํ ํ์ฌ ์ปจํ
์คํธ๋ฅผ ๊ฐ์ ธ์์ ์ ์ฅํ๊ณ ์ ์คํ์ด ์๋ ์ ์ปจํ
์คํธ๋ก ์ ํํ ์๋ ์์ต๋๋ค. ํธ์ถ ์คํ์ JS ๊ฐ์ ๋จธ์ ์ ์ํด ๊ด๋ฆฌ๋ฉ๋๋ค. ์ด์ ํ๋ฆ์ ์์ ํ ์๋์ผ๋ก ๊ด๋ฆฌํ๊ธฐ๋ก ๊ฒฐ์ ํ๋๋ฐ ๋ฌธ์ ๊ฐ ๋ฌด์์ธ ๊ฒ ๊ฐ์ต๋๊น? ์ฌ์ค QEMU์ ๋ธ๋ก I/O๋ ์ฝ๋ฃจํด์ ํตํด ๊ตฌํ๋๋ฉฐ, ์ฌ๊ธฐ์ ๋ฎ์ ์์ค์ ์คํ ์กฐ์์ด ์ ์ฉํฉ๋๋ค. ๋คํ์ค๋ฝ๊ฒ๋ Emscipten์๋ ์ด๋ฏธ ๋ ๊ฐ์ง ๋น๋๊ธฐ ์์
๋ฉ์ปค๋์ฆ์ด ํฌํจ๋์ด ์์ต๋๋ค.
ํ์ฌ๋ก์๋ ์ฝ๋๋ฅผ WASM์ผ๋ก ์ปดํ์ผํ๊ณ Emterpreter๋ฅผ ์ฌ์ฉํ์ฌ ํด์ํ ์ฝ๋๋ก ๋ถํ ํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋ธ๋ก ์ฅ์น๋ ์์ง ์๋ํ์ง ์์ต๋๋ค(๋ค์ ์๋ฆฌ์ฆ์์ ๋งํ๋ ๊ฒ์ฒ๋ผ...). ์ฆ, ๊ฒฐ๊ตญ์๋ ๋ค์๊ณผ ๊ฐ์ ์ฌ๋ฏธ์๋ ๋ ์ด์ด๋ฅผ ์ป๊ฒ ๋ฉ๋๋ค.
- ๋ธ๋ก I/O๋ฅผ ํด์ํฉ๋๋ค. ๊ธ์์, ๊ธฐ๋ณธ ์ฑ๋ฅ์ผ๋ก ์๋ฎฌ๋ ์ดํธ๋ NVMe๋ฅผ ๊ธฐ๋ํ์ จ๋์? ๐
- ์ ์ ์ผ๋ก ์ปดํ์ผ๋ ๊ธฐ๋ณธ QEMU ์ฝ๋(๋ณํ๊ธฐ, ๊ธฐํ ์๋ฎฌ๋ ์ดํธ๋ ์ฅ์น ๋ฑ)
- ๋์ ์ผ๋ก ์ปดํ์ผ๋ ๊ฒ์คํธ ์ฝ๋๋ฅผ WASM์ผ๋ก
QEMU ์์ค์ ํน์ง
์ด๋ฏธ ์ง์ํ์ จ๊ฒ ์ง๋ง, ๊ฒ์คํธ ์ํคํ ์ฒ๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๊ธฐ ์ํ ์ฝ๋์ ํธ์คํธ ๊ธฐ๊ณ ๋ช ๋ น์ด๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ฝ๋๋ QEMU์์ ๋ถ๋ฆฌ๋์ด ์์ต๋๋ค. ์ค์ ๋ก๋ ์กฐ๊ธ ๋ ๊น๋ค๋กญ์ต๋๋ค.
- ๊ฒ์คํธ ์ํคํ ์ฒ๊ฐ ์์ต๋๋ค
- ์ด ๊ฐ์๊ธฐ์ฆ, Linux์ ํ๋์จ์ด ๊ฐ์ํ๋ฅผ ์ํ KVM(์๋ก ํธํ๋๋ ๊ฒ์คํธ ๋ฐ ํธ์คํธ ์์คํ
์ฉ), ์ด๋์๋ JIT ์ฝ๋ ์์ฑ์ ์ํ TCG์
๋๋ค. QEMU 2.9๋ถํฐ Windows์์ HAXM ํ๋์จ์ด ๊ฐ์ํ ํ์ค์ ๋ํ ์ง์์ด ๋ํ๋ฌ์ต๋๋ค(
์ธ๋ถ ์ฌํญ ) - TCG๋ฅผ ์ฌ์ฉํ๊ณ ํ๋์จ์ด ๊ฐ์ํ๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ ๊ฐ ํธ์คํธ ์ํคํ ์ฒ์ ๋ฒ์ฉ ์ธํฐํ๋ฆฌํฐ์ ๋ํด ๋ณ๋์ ์ฝ๋ ์์ฑ์ ์ง์ํฉ๋๋ค.
- ... ๊ทธ๋ฆฌ๊ณ ์ด ๋ชจ๋ ๊ฒ - ์๋ฎฌ๋ ์ดํธ๋ ์ฃผ๋ณ ์ฅ์น, ์ฌ์ฉ์ ์ธํฐํ์ด์ค, ๋ง์ด๊ทธ๋ ์ด์ , ๊ธฐ๋ก ์ฌ์ ๋ฑ
๊ทธ๋ฐ๋ฐ ์๊ณ ๊ณ์ จ๋์? QEMU๋ ์ ์ฒด ์ปดํจํฐ๋ฟ๋ง ์๋๋ผ ๋ฐ์ด๋๋ฆฌ ๊ณ์ธก์ฉ AFL ํผ์ ๋ฑ์์ ์ฌ์ฉ๋๋ ํธ์คํธ ์ปค๋์ ๋ณ๋ ์ฌ์ฉ์ ํ๋ก์ธ์ค์ฉ ํ๋ก์ธ์๋ ์๋ฎฌ๋ ์ด์ ํ ์ ์์ต๋๋ค. ์๋ง๋ ๋๊ตฐ๊ฐ๊ฐ ์ด QEMU ์๋ ๋ชจ๋๋ฅผ JS๋ก ์ด์ํ๊ณ ์ถ์ดํ ๊น์? ๐
๋๋ถ๋ถ์ ์ค๋ ๋ฌด๋ฃ ์ํํธ์จ์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก QEMU๋ ํธ์ถ์ ํตํด ๊ตฌ์ถ๋ฉ๋๋ค. configure
ะธ make
. TCG ๋ฐฑ์๋, ์ค๋ ๋ ๊ตฌํ ๋ฑ์ ์ถ๊ฐํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. Autoconf์ ํต์ ํ ๊ฐ๋ฅ์ฑ์ด ์๋ค๊ณ ์๋๋ฅด์ง ๋ง๊ณ ํ๋ณตํ๊ฑฐ๋ ๊ฒ์ ๋จน๊ฑฐ๋(ํด๋นํ๋ ๊ฒฝ์ฐ ๋ฐ์ค์ ๊ธ์ต๋๋ค) - ์ฌ์ค, configure
QEMU๋ ๋ถ๋ช
ํ ์์ฒด ์์ฑ๋์์ผ๋ฉฐ ์ด๋ค ๊ฒ์์๋ ์์ฑ๋์ง ์์ต๋๋ค.
WebAssembly
๊ทธ๋ ๋ค๋ฉด WebAssembly(์ผ๋ช
WASM)๋ผ๋ ๊ฒ์ ๋ฌด์์ผ๊น์? ์ด๋ Asm.js๋ฅผ ๋์ฒดํ๋ฉฐ ๋ ์ด์ ์ ํจํ JavaScript ์ฝ๋์ธ ์ฒํ์ง ์์ต๋๋ค. ๋ฐ๋๋ก ์์ ํ ๋ฐ์ด๋๋ฆฌ์ด๊ณ ์ต์ ํ๋์ด ์์ผ๋ฉฐ ๋จ์ํ ์ ์๋ฅผ ์ฐ๋ ๊ฒ์กฐ์ฐจ ๊ทธ๋ฆฌ ๊ฐ๋จํ์ง ์์ต๋๋ค. ์์ถ์ ์ํด ๋ค์ ํ์์ผ๋ก ์ ์ฅ๋ฉ๋๋ค.
Asm.js์ ์ฌ๋ฃจํ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ๋ค์ด๋ณด์ จ์ ๊ฒ์ ๋๋ค. ์ด๋ JS ์์ง์ด ์ค๊ณ๋ "๊ณ ์์ค" ํ๋ฆ ์ ์ด ๋ช ๋ น(์ฆ, if-then-else, ๋ฃจํ ๋ฑ)์ ๋ณต์ํ ๊ฒ์ ๋๋ค. ํ๋ก์ธ์์ ์ํด ์คํ๋๋ ๊ธฐ๊ณ์ด ์ฝ๋์ ๋ ๊ฐ๊น์ด ๋ฎ์ ์์ค์ LLVM IR. ๋น์ฐํ QEMU์ ์ค๊ฐ ํํ์ ๋ ๋ฒ์งธ์ ๊ฐ๊น์ต๋๋ค. ์ฌ๊ธฐ ๋ฐ์ดํธ์ฝ๋, ๊ณ ํต์ ๋์ธ ๊ฒ ๊ฐ์ต๋๋ค... ๊ทธ๋ฆฌ๊ณ ๋ธ๋ก, if-then-else ๋ฐ ๋ฃจํ๊ฐ ์์ต๋๋ค!..
์ด๊ฒ์ด Binaryen์ด ์ ์ฉํ ๋ ๋ค๋ฅธ ์ด์ ์ ๋๋ค. WASM์ ์ ์ฅ๋๋ ๊ฒ๊ณผ ์ ์ฌํ ์์ ์์ค ๋ธ๋ก์ ์์ฐ์ค๋ฝ๊ฒ ์์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ๋ณธ ๋ธ๋ก๊ณผ ๊ทธ ์ฌ์ด์ ์ ํ ๊ทธ๋ํ์์ ์ฝ๋๋ฅผ ์์ฑํ ์๋ ์์ต๋๋ค. ๊ธ์์, ์ ๋ ์ด๋ฏธ ํธ๋ฆฌํ C/C++ API ๋ค์ WebAssembly ์ ์ฅ ํ์์ด ์จ๊ฒจ์ ธ ์๋ค๊ณ ๋งํ์ต๋๋ค.
TCG(์์ ์ฝ๋ ์์ฑ๊ธฐ)
TCG tcg_qemu_tb_exec
, ๊ทธ๊ฒ์ ๋์๊ฒ ๋งค์ฐ ์ ์ฉํ ๊ฒ์ผ๋ก ํ๋ช
๋์์ต๋๋ค.
QEMU์ ์๋ก์ด TCG ๋ฐฑ์๋๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ํ์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. tcg/<ะธะผั ะฐัั
ะธัะตะบัััั>
(์ด ๊ฒฝ์ฐ, tcg/binaryen
), ์ฌ๊ธฐ์๋ ๋ ๊ฐ์ ํ์ผ์ด ํฌํจ๋์ด ์์ต๋๋ค. tcg-target.h
ะธ tcg-target.inc.c
ะธ configure
. ๊ฑฐ๊ธฐ์ ๋ค๋ฅธ ํ์ผ์ ๋ฃ์ ์๋ ์์ง๋ง, ์ด ๋ ํ์ผ์ ์ด๋ฆ์์ ์ง์ํ ์ ์๋ฏ์ด ๋ ๋ค ์ด๋๊ฐ์ ํฌํจ๋ ๊ฒ์
๋๋ค. ํ๋๋ ์ผ๋ฐ ํค๋ ํ์ผ๋ก(๋ค์์ ํฌํจ๋์ด ์์ต๋๋ค) tcg/tcg.h
, ํด๋น ํ์ผ์ ์ด๋ฏธ ๋๋ ํ ๋ฆฌ์ ๋ค๋ฅธ ํ์ผ์ ์์ต๋๋ค. tcg
, accel
๋ฟ๋ง ์๋๋ผ), ๋ค๋ฅธ ํ๋๋ ์ฝ๋ ์กฐ๊ฐ์ผ๋ก๋ง tcg/tcg.c
, ๊ทธ๋ฌ๋ ์ ์ ๊ธฐ๋ฅ์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์์ธํ ์กฐ์ฌํ๋ ๋ฐ ๋๋ฌด ๋ง์ ์๊ฐ์ ์๋นํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ณ ๋ค๋ฅธ ๋ฐฑ์๋ ๊ตฌํ์์ ์ด ๋ ํ์ผ์ "๊ณจ๊ฒฉ"์ ๋ณต์ฌํ์ฌ ์ด๋ฅผ ๋ผ์ด์ผ์ค ํค๋์ ์์งํ๊ฒ ํ์ํ์ต๋๋ค.
ํ์ผ tcg-target.h
์ฃผ๋ก ํ์์ ์ค์ ์ด ํฌํจ๋์ด ์์ต๋๋ค. #define
-์์ค:
- ๋์ ์ํคํ ์ฒ์ ๋ ์ง์คํฐ ์์ ๋๋น๊ฐ ์ผ๋ง๋ ๋ฉ๋๊น?(์ฐ๋ฆฌ๋ ์ํ๋ ๋งํผ ๋ง์ด ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋ฌธ์ ๋ "์์ ํ ๋์" ์ํคํ ์ฒ์์ ๋ธ๋ผ์ฐ์ ์ ์ํด ๋ ํจ์จ์ ์ธ ์ฝ๋๋ก ์์ฑ๋๋ ๊ฒ์ด ๋ฌด์์ธ์ง์ ๊ดํ ๊ฒ์ ๋๋ค. ...)
- ํธ์คํธ ๋ช ๋ น์ด ์ ๋ ฌ: x86 ๋ฐ TCI์์๋ ๋ช ๋ น์ด๋ ์ ํ ์ ๋ ฌ๋์ง ์์ง๋ง ์ฝ๋ ๋ฒํผ์ ๋ช ๋ น์ด๊ฐ ์๋ Binaryen ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌ์กฐ์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฃ์ ๊ฒ์ด๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ๋งํ ๊ฒ์ ๋๋ค. 4 ๋ฐ์ดํธ
- ๋ฐฑ์๋๊ฐ ์์ฑํ ์ ์๋ ์ ํ์ ๋ช ๋ น - Binaryen์์ ์ฐพ์ ๋ชจ๋ ๊ฒ์ ํฌํจํ๊ณ ๊ฐ์๊ธฐ๊ฐ ๋๋จธ์ง๋ฅผ ๋ ๊ฐ๋จํ ๋ช ๋ น์ผ๋ก ๋๋๋๋ก ํฉ๋๋ค.
- ๋ฐฑ์๋์์ ์์ฒญํ TLB ์บ์์ ๋๋ต์ ์ธ ํฌ๊ธฐ๋ ์ผ๋ง์ ๋๊น? ์ฌ์ค QEMU์์๋ ๋ชจ๋ ๊ฒ์ด ์ฌ๊ฐํฉ๋๋ค. ๊ฒ์คํธ MMU๋ฅผ ๊ณ ๋ คํ์ฌ ๋ก๋/์ ์ฅ์ ์ํํ๋ ๋์ฐ๋ฏธ ๊ธฐ๋ฅ์ด ์์ง๋ง(์ง๊ธ ์ด๊ฒ์ด ์์ผ๋ฉด ์ด๋์ ์์๊น์?) ๋ฒ์ญ ์บ์๋ฅผ ๊ตฌ์กฐ ํํ๋ก ์ ์ฅํฉ๋๋ค. ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ฐฉ์ก ๋ธ๋ก์ ์ง์ ์ฝ์ ํ๋ ๊ฒ์ด ํธ๋ฆฌํฉ๋๋ค. ๋ฌธ์ ๋ ์ด ๊ตฌ์กฐ์ ์ด๋ค ์คํ์ ์ด ์๊ณ ๋น ๋ฅธ ๋ช ๋ น ์ํ์ค์ ์ํด ๊ฐ์ฅ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋์ง์ ๋๋ค.
- ์ฌ๊ธฐ์๋ ํ๋ ๋๋ ๋ ๊ฐ์ ์์ฝ๋ ๋ ์ง์คํฐ์ ๋ชฉ์ ์ ์กฐ์ ํ ์ ์๊ณ , ํจ์๋ฅผ ํตํด TB ํธ์ถ์ ํ์ฑํํ๊ณ ์ ํ์ ์ผ๋ก ๋ ๊ฐ์ ์์ ๋ ์ง์คํฐ๋ฅผ ์ค๋ช
ํ ์ ์์ต๋๋ค.
inline
-๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅflush_icache_range
(๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ๊ฐ ์๋๋ค)
ํ์ผ tcg-target.inc.c
๋ฌผ๋ก , ์ผ๋ฐ์ ์ผ๋ก ํฌ๊ธฐ๊ฐ ํจ์ฌ ํฌ๋ฉฐ ๋ช ๊ฐ์ง ํ์ ๊ธฐ๋ฅ์ ํฌํจํฉ๋๋ค.
- ์ด๋ค ๋ช ๋ น์ด๊ฐ ์ด๋ค ํผ์ฐ์ฐ์์์ ์๋ํ ์ ์๋์ง์ ๋ํ ์ ํ์ ํฌํจํ ์ด๊ธฐํ. ๋ค๋ฅธ ๋ฐฑ์๋์์ ๋ด๊ฐ ๋ ธ๊ณจ์ ์ผ๋ก ๋ณต์ฌํ์ต๋๋ค.
- ํ๋์ ๋ด๋ถ ๋ฐ์ดํธ์ฝ๋ ๋ช ๋ น์ด๋ฅผ ์ทจํ๋ ํจ์
- ์ฌ๊ธฐ์ ๋ณด์กฐ ๊ธฐ๋ฅ์ ๋ฃ์ ์๋ ์๊ณ , ๋ค์์ ์ ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
tcg/tcg.c
๋ ์์ ์ ์ํด ๋ค์ ์ ๋ต์ ์ ํํ์ต๋๋ค. ๋ค์ ๋ฒ์ญ ๋ธ๋ก์ ์ฒซ ๋ฒ์งธ ๋จ์ด์ XNUMX๊ฐ์ ํฌ์ธํฐ๋ฅผ ์ ์์ต๋๋ค. ์์ ํ์(๊ทผ์ฒ์ ํน์ ๊ฐ) 0xFFFFFFFF
TB์ ํ์ฌ ์ํ), ์ปจํ
์คํธ, ์์ฑ๋ ๋ชจ๋, ๋๋ฒ๊น
์ ์ํ ๋งค์ง ๋๋ฒ๋ฅผ ๊ฒฐ์ ํ์ต๋๋ค. ์ฒ์์๋ ๋งํฌ๊ฐ ๋ค์ ์์น์ ๋ฐฐ์น๋์์ต๋๋ค. 0xFFFFFFFF - n
์ด๋์์ n
- ์์ ์์์ด๋ฉฐ, ์ธํฐํ๋ฆฌํฐ๋ฅผ ํตํด ์คํ๋ ๋๋ง๋ค 1์ฉ ์ฆ๊ฐํฉ๋๋ค. 0xFFFFFFFE
, ์ปดํ์ผ์ด ์ด๋ฃจ์ด์ง๊ณ ๋ชจ๋์ด ํจ์ ํ
์ด๋ธ์ ์ ์ฅ๋๊ณ ์์ "์คํ๊ธฐ"๋ก ๊ฐ์ ธ์์ ์คํ์ด ์์๋์์ต๋๋ค. tcg_qemu_tb_exec
, ๋ชจ๋์ด QEMU ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐ๋์์ต๋๋ค.
๊ณ ์ ์ ์์ญํ๋ฉด "Crutch, ํ๋ก๊ฑฐ์ ์ฌ์ฅ์ ์ํ ์ด ์๋ฆฌ์ ์ผ๋ง๋ ๋ง์ ๊ฒ์ด ์ฝํ ์๋์ง..."์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋๊ฐ์์ ๊ธฐ์ต์ด ์๊ณ ์์๋ค. ๊ฒ๋ค๊ฐ QEMU๊ฐ ๊ด๋ฆฌํ๋ ๋ฉ๋ชจ๋ฆฌ์์ต๋๋ค! ๋ค์ ๋ช ๋ น(์ฆ, ํฌ์ธํฐ)์ ์์ฑํ ๋ ์ด์ ์ ์ด ์์น์ ๋งํฌ๊ฐ ์๋ ๋ช ๋ น์ ์ญ์ ํ๋ ์ฝ๋๊ฐ ์์์ง๋ง ์ด๋ ๋์์ด ๋์ง ์์์ต๋๋ค. ์ค์ ๋ก ๊ฐ์ฅ ๊ฐ๋จํ ๊ฒฝ์ฐ QEMU๋ ์์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ ๊ฑฐ๊ธฐ์ ์์ฑ๋ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ๋ฒํผ๊ฐ ๋ถ์กฑํด์ง๋ฉด ์ฝ๋๊ฐ ์ญ์ ๋๊ณ ๊ทธ ์๋ฆฌ์ ๋ค์ ์ฝ๋๊ฐ ์์ฑ๋๊ธฐ ์์ํฉ๋๋ค.
์ฝ๋๋ฅผ ์ฐ๊ตฌํ ํ ๋งค์ง ๋๋ฒ๋ฅผ ์ฌ์ฉํ ํธ๋ฆญ์ ์ฌ์ฉํ๋ฉด ์ฒซ ๋ฒ์งธ ๋จ๊ณ์์ ์ด๊ธฐํ๋์ง ์์ ๋ฒํผ์์ ์๋ชป๋ ๊ฒ์ ํด์ ํ์ฌ ํ ํ๊ดด์ ์คํจํ์ง ์๋๋ก ํ ์ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ํ์ง๋ง ๋์ค์ ๋ด ๊ธฐ๋ฅ์ ์ฐํํ๊ธฐ ์ํด ๋ฒํผ๋ฅผ ๋ค์ ์์ฑํ๋ ์ฌ๋์ ๋๊ตฌ์
๋๊น? Emscripten ๊ฐ๋ฐ์์ ์กฐ์ธ์ ๋ฐ๋ฅด๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ๊ฒฐ๊ณผ ์ฝ๋๋ฅผ ๊ธฐ๋ณธ ์ ํ๋ฆฌ์ผ์ด์
์ผ๋ก ๋ค์ ํฌํ
ํ๊ณ ๊ฑฐ๊ธฐ์ Mozilla Record-Replay๋ฅผ ์ค์ ํ์ต๋๋ค... ์ผ๋ฐ์ ์ผ๋ก ๊ฒฐ๊ตญ ์ ๋ ๊ฐ๋จํ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ๊ฐ ๋ธ๋ก์ ๋ํด ใ
struct TranslationBlock
์ค๋ช
๊ณผ ํจ๊ป. ์ด๋์ธ์ง ์ถ์ธกํด ๋ณด์ธ์... ๋ง์ต๋๋ค. ๋ฒํผ์ ๋ธ๋ก ๋ฐ๋ก ์์
๋๋ค. ์ด๊ฒ์ ๊นจ๋ฌ์ ๋๋ ๋ชฉ๋ฐ ์ฌ์ฉ์ (์ ์ด๋ ์ผ๋ถ) ๊ทธ๋ง๋๊ธฐ๋ก ๊ฒฐ์ ํ๊ณ ๋งค์ง ๋๋ฒ๋ฅผ ๋ฒ๋ฆฌ๊ณ ๋จ์ ๋จ์ด๋ฅผ struct TranslationBlock
, ๋ฒ์ญ ์บ์๊ฐ ์ฌ์ค์ ๋ ๋ ๋น ๋ฅด๊ฒ ํ์ํ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํ ์ ์๋ ๋จ์ผ ์ฐ๊ฒฐ ๋ชฉ๋ก์ ์์ฑํฉ๋๋ค.
์ผ๋ถ ๋ชฉ๋ฐ์ ๋จ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฝ๋ ๋ฒํผ์ ํ์๋ ํฌ์ธํฐ - ๊ทธ ์ค ์ผ๋ถ๋ ๋จ์ํ BinaryenExpressionRef
์ฆ, ์์ฑ๋ ๊ธฐ๋ณธ ๋ธ๋ก์ ์ ํ์ ์ผ๋ก ๋ฃ์ด์ผ ํ ํํ์์ ๋ณด๋ฉด, ์ผ๋ถ๋ BB ๊ฐ ์ ํ ์กฐ๊ฑด, ์ผ๋ถ๋ ์ด๋๋ก ๊ฐ์ผ ํ ์ง์ ๋ํ ๋ถ๋ถ์
๋๋ค. ์, ์กฐ๊ฑด์ ๋ฐ๋ผ ์ฐ๊ฒฐํด์ผ ํ๋ ๋ฆฌ๋ฃจํผ์ฉ ๋ธ๋ก์ ์ด๋ฏธ ์ค๋น๋์ด ์์ต๋๋ค. ์ด๋ฅผ ๊ตฌ๋ณํ๊ธฐ ์ํด ๋ชจ๋ ์ต์ XNUMX๋ฐ์ดํธ๋ก ์ ๋ ฌ๋์ด ์๋ค๋ ๊ฐ์ ์ด ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ ์ด๋ธ์ ์ตํ์ XNUMX๋นํธ๋ฅผ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ํ์ํ ๊ฒฝ์ฐ ์ ๊ฑฐํ๋ ๊ฒ๋ง ๊ธฐ์ตํ๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ฌํ ๋ ์ด๋ธ์ ์ด๋ฏธ QEMU์์ ์ฌ์ฉ๋์ด TCG ๋ฃจํ๋ฅผ ์ข
๋ฃํ๋ ์ด์ ๋ฅผ ๋ํ๋
๋๋ค.
๋ฐ์ด๋๋ฆฌ ์ฌ์ฉํ๊ธฐ
WebAssembly์ ๋ชจ๋์๋ ํจ์๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ ๊ฐ ํจ์์๋ ํํ์์ธ ๋ณธ๋ฌธ์ด ํฌํจ๋์ด ์์ต๋๋ค. ํํ์์ ๋จํญ ๋ฐ ์ด์ง ์ฐ์ฐ, ๋ค๋ฅธ ํํ์ ๋ชฉ๋ก์ผ๋ก ๊ตฌ์ฑ๋ ๋ธ๋ก, ์ ์ด ํ๋ฆ ๋ฑ์ ๋๋ค. ์ด๋ฏธ ๋งํ๋ฏ์ด ์ฌ๊ธฐ์ ์ ์ด ํ๋ฆ์ ์์ ์์ค ๋ถ๊ธฐ, ๋ฃจํ, ํจ์ ํธ์ถ ๋ฑ์ผ๋ก ์ ํํ๊ฒ ๊ตฌ์ฑ๋ฉ๋๋ค. ํจ์์ ๋ํ ์ธ์๋ ์คํ์ ์ ๋ฌ๋์ง ์์ง๋ง JS์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ช ์์ ์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค. ์ ์ญ ๋ณ์๋ ์์ง๋ง ์ฌ์ฉํด๋ณธ ์ ์ด ์์ด์ ์ค๋ช ํ์ง ์๊ฒ ์ต๋๋ค.
ํจ์์๋ int32 / int64 / float / double ์ ํ์ XNUMX๋ถํฐ ๋ฒํธ๊ฐ ๋งค๊ฒจ์ง ์ง์ญ ๋ณ์๋ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์ฒ์ n๊ฐ์ ์ง์ญ ๋ณ์๋ ํจ์์ ์ ๋ฌ๋ ์ธ์์ ๋๋ค. ์ ์ด ํ๋ฆ ์ธก๋ฉด์์ ์ฌ๊ธฐ์ ์๋ ๋ชจ๋ ๊ฒ์ด ์์ ํ ๋ฎ์ ์์ค์ ์๋์ง๋ง ์ ์์๋ ์ฌ์ ํ "๋ถํธ ์๋/๋ถํธ ์๋" ์์ฑ์ด ์์ต๋๋ค. ์ซ์์ ๋์ ๋ฐฉ์์ ์ฐ์ฐ ์ฝ๋์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก Binaryen์ ๋ค์์ ์ ๊ณตํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ธํฐํ๋ฆฌํฐ ์ธ์คํด์ค๋ฅผ ๋ถํ์ํ๊ฒ ์์ฑ ๋ฐ ์ญ์ ํ์ง ์๊ณ ์ฆ์ ์ฝ๋๋ฅผ ํด์ํ๋ ค๋ฉด ์ด ๋ก์ง์ C++ ํ์ผ์ ๋ฃ์ ๋ค์ ๊ฑฐ๊ธฐ์์ ์ค๋น ์์ ์ ์ฐํํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ฒด C++ API๋ฅผ ์ง์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ์ ์์ต๋๋ค. ํฌ์ฅ์ง๋ฅผ ๋ง๋ค์์ต๋๋ค.
๋ฐ๋ผ์ ํ์ํ ์ฝ๋๋ฅผ ์์ฑํ๋ ค๋ฉด
// ะฝะฐัััะพะธัั ะณะปะพะฑะฐะปัะฝัะต ะฟะฐัะฐะผะตััั (ะผะพะถะฝะพ ะฟะพะผะตะฝััั ะฟะพัะพะผ)
BinaryenSetAPITracing(0);
BinaryenSetOptimizeLevel(3);
BinaryenSetShrinkLevel(2);
// ัะพะทะดะฐัั ะผะพะดัะปั
BinaryenModuleRef MODULE = BinaryenModuleCreate();
// ะพะฟะธัะฐัั ัะธะฟั ััะฝะบัะธะน (ะบะฐะบ ัะพะทะดะฐะฒะฐะตะผัั
, ัะฐะบ ะธ ะฒัะทัะฒะฐะตะผัั
)
helper_type BinaryenAddFunctionType(MODULE, "helper-func", BinaryenTypeInt32(), int32_helper_args, ARRAY_SIZE(int32_helper_args));
// (int23_helper_args ะฟัะธะพะฑ^Wัะพะทะดะฐัััั ะพัะดะตะปัะฝะพ)
// ัะบะพะฝััััะธัะพะฒะฐัั ััะฟะตั-ะผะตะณะฐ ะฒััะฐะถะตะฝะธะต
// ... ะฝั ััั ัะถ ะฒั ะบะฐะบ-ะฝะธะฑัะดั ัะฐะผะธ :)
// ะฟะพัะพะผ ัะพะทะดะฐัั ััะฝะบัะธั
BinaryenAddFunction(MODULE, "tb_fun", tb_func_type, func_locals, FUNC_LOCALS_COUNT, expr);
BinaryenAddFunctionExport(MODULE, "tb_fun", "tb_fun");
...
BinaryenSetMemory(MODULE, (1 << 15) - 1, -1, NULL, NULL, NULL, NULL, NULL, 0, 0);
BinaryenAddMemoryImport(MODULE, NULL, "env", "memory", 0);
BinaryenAddTableImport(MODULE, NULL, "env", "tb_funcs");
// ะทะฐะฟัะพัะธัั ะฒะฐะปะธะดะฐัะธั ะธ ะพะฟัะธะผะธะทะฐัะธั ะฟัะธ ะถะตะปะฐะฝะธะธ
assert (BinaryenModuleValidate(MODULE));
BinaryenModuleOptimize(MODULE);
... ์์ด๋ฒ๋ฆฐ ๊ฒ์ด ์๋ค๋ฉด ์ฃ์กํฉ๋๋ค. ์ด๋ ๋จ์ง ๊ท๋ชจ๋ฅผ ํํํ๊ธฐ ์ํ ๊ฒ์ด๋ฉฐ ์์ธํ ๋ด์ฉ์ ๋ฌธ์์ ๋์ ์์ต๋๋ค.
์ด์ ๋ค์๊ณผ ๊ฐ์ด crack-fex-pex๊ฐ ์์๋ฉ๋๋ค.
static char buf[1 << 20];
BinaryenModuleOptimize(MODULE);
BinaryenSetMemory(MODULE, 0, -1, NULL, NULL, NULL, NULL, NULL, 0, 0);
int sz = BinaryenModuleWrite(MODULE, buf, sizeof(buf));
BinaryenModuleDispose(MODULE);
EM_ASM({
var module = new WebAssembly.Module(new Uint8Array(wasmMemory.buffer, $0, $1));
var fptr = $2;
var instance = new WebAssembly.Instance(module, {
'env': {
'memory': wasmMemory,
// ...
}
);
// ะธ ะฒะพั ัะถะต ั ะฒะฐั ะตััั instance!
}, buf, sz);
์ด๋ป๊ฒ๋ QEMU์ JS์ ์ธ๊ณ๋ฅผ ์ฐ๊ฒฐํ๊ณ ๋์์ ์ปดํ์ผ๋ ํจ์์ ๋น ๋ฅด๊ฒ ์ก์ธ์คํ๊ธฐ ์ํด ๋ฐฐ์ด(๋ฐ์ฒ๋ก ๊ฐ์ ธ์ฌ ์ ์๋ ํจ์ ํ
์ด๋ธ)์ด ์์ฑ๋๊ณ ์์ฑ๋ ํจ์๊ฐ ์ฌ๊ธฐ์ ๋ฐฐ์น๋์์ต๋๋ค. ์ธ๋ฑ์ค๋ฅผ ๋น ๋ฅด๊ฒ ๊ณ์ฐํ๊ธฐ ์ํด ์ฒ์์๋ XNUMX ๋จ์ด ๋ฒ์ญ ๋ธ๋ก์ ์ธ๋ฑ์ค๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ์ง๋ง, ์ดํ ์ด ๊ณต์์ ์ฌ์ฉํ์ฌ ๊ณ์ฐ๋ ์ธ๋ฑ์ค๊ฐ XNUMX๋
์ ํ๋์ ๊ฐ๋จํ ๋ค์ด๋ง๊ธฐ ์์ํ์ต๋๋ค. struct TranslationBlock
.
๋ํ,
์ง๊ธ์ ์ฌ๊ธฐ๊น์ง์ ๋๋ค. ์๋ง๋ ๋๊ตฐ๊ฐ ๊ด์ฌ์ด ์๋ค๋ฉด ๋ ๋ค๋ฅธ ๊ธฐ์ฌ๊ฐ ๋์ฌ ๊ฒ์ ๋๋ค. ์ฆ, ์ต์ํ ๋จ์ ์์ต๋๋ค. ๊ทธ๋ฅ ๋ธ๋ก ์ฅ์น๋ฅผ ์๋์ํค์ธ์. ๋ค์ดํฐ๋ธ ๋ชจ๋์ด ์ค๋น๋ ๋๊น์ง ์ด ๋ชจ๋ ์์ ์ ์ํํ ์ ์๋ ์ธํฐํ๋ฆฌํฐ๊ฐ ์ฌ์ ํ ์๊ธฐ ๋๋ฌธ์ JS ์ธ๊ณ์ ๊ด๋ก๋๋ก WebAssembly ๋ชจ๋์ ์ปดํ์ผ์ ๋น๋๊ธฐ์์ผ๋ก ๋ง๋๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ์๋ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ์์๊ป๋ผ: 32๋นํธ ์ํคํ ์ฒ์์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ปดํ์ผํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ ์์ ์ ํตํด ์ฝ๋๊ฐ Binaryen, ์คํ์ ์ด๋๊ฐ ๋๋ 2๋นํธ ์ฃผ์ ๊ณต๊ฐ์ ์์ 32GB์ ์๋ ๋ค๋ฅธ ๊ณณ์์ ์ฌ๋ผ๊ฐ๋๋ค. ๋ฌธ์ ๋ Binaryen์ ๊ด์ ์์ ๋ณผ ๋ ์ด๊ฒ์ด ๋๋ฌด ํฐ ๊ฒฐ๊ณผ ์ฃผ์์ ์ก์ธ์คํ๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
๊ด๋ฆฌ์์ ๋ฐฉ์์ผ๋ก
ํ ์คํธ๋ฅผ ๋๋ด์ง๋ ๋ชปํ์ง๋ง, ์ฒ์ ๋ ์๊ฐ์ "32๋นํธ ๋ฆฌ๋ ์ค๋ฅผ ์ค์นํ๋ฉด ์ด๋จ๊น?"์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์ฃผ์ ๊ณต๊ฐ์ ์๋ถ๋ถ์ ์ปค๋์ด ์ฐจ์งํ๊ฒ ๋ฉ๋๋ค. ์ ์ผํ ์ง๋ฌธ์ 1Gb ๋๋ 2Gb ์ค ์ผ๋ง๋ ๋ง์ ์์ ์ฐจ์งํ ๊ฒ์ธ๊ฐ์ ๋๋ค.
ํ๋ก๊ทธ๋๋จธ์ ๋ฐฉ์์ผ๋ก (์ค๋ฌด์์ฉ ์ต์ )
์ฃผ์ ๊ณต๊ฐ ์๋จ์ ๋ฒ๋ธ์ ๋ถ์ด๋ด ์๋ค. ๋ ์์ ๋ ๊ทธ๊ฒ์ด ์ ์๋ํ๋์ง ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ด๋ฏธ ์คํ์ด ์์ด์ผ ํฉ๋๋ค. ํ์ง๋ง "์ฐ๋ฆฌ๋ ์ค๋ฌด์์ ๋๋ค. ๋ชจ๋ ๊ฒ์ด ์ฐ๋ฆฌ์๊ฒ ๋์์ด ๋์ง๋ง, ๊ทธ ์ด์ ๋ฅผ ์๋ ์ฌ๋์ ์๋ฌด๋ ์์ต๋๋ค..."
// 2gbubble.c
// Usage: LD_PRELOAD=2gbubble.so <program>
#include <sys/mman.h>
#include <assert.h>
void __attribute__((constructor)) constr(void)
{
assert(MAP_FAILED != mmap(1u >> 31, (1u >> 31) - (1u >> 20), PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0));
}
... Valgrind์ ํธํ๋์ง ์๋ ๊ฒ์ ์ฌ์ค์ด์ง๋ง, ๋คํ์ค๋ฝ๊ฒ๋ Valgrind ์์ฒด๋ ๋งค์ฐ ํจ๊ณผ์ ์ผ๋ก ๋ชจ๋ ์ฌ๋์ ๋ฐ์ด๋ ๋๋ค :)
์๋ง๋ ๋๊ตฐ๊ฐ ๋ด ์ฝ๋๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ ์ ์ค๋ช ํด์ค ๊ฒ์ ๋๋ค.
์ถ์ฒ : habr.com