QEMU.js: ์ด์ œ WASM์œผ๋กœ ์‹ฌ๊ฐํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

์˜›๋‚  ์˜›์ ์— ๋‚˜๋Š” ์žฌ๋ฏธ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค ๊ณผ์ •์˜ ๊ฐ€์—ญ์„ฑ์„ ์ฆ๋ช…ํ•˜๋‹ค ๊ธฐ๊ณ„ ์ฝ”๋“œ์—์„œ JavaScript(๋ณด๋‹ค ์ •ํ™•ํ•˜๊ฒŒ๋Š” Asm.js)๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์„ธ์š”. ์‹คํ—˜์„ ์œ„ํ•ด QEMU๊ฐ€ ์„ ํƒ๋˜์—ˆ๊ณ  ์–ผ๋งˆ ํ›„ Habr์— ๋Œ€ํ•œ ๊ธฐ์‚ฌ๊ฐ€ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋Œ“๊ธ€์—์„œ ๋‚˜๋Š” WebAssembly์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค๊ณ  ์‹ฌ์ง€์–ด ์Šค์Šค๋กœ ๊ทธ๋งŒ๋‘๋ผ๋Š” ์กฐ์–ธ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋๋‚ฌ๋‹ค ์™ ์ง€ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค ... ์ž‘์—…์ด ์ง„ํ–‰ ์ค‘์ด์—ˆ์ง€๋งŒ ๋งค์šฐ ๋Š๋ฆฌ๊ฒŒ ์ง„ํ–‰๋˜์—ˆ์œผ๋ฉฐ ์ตœ๊ทผ์— ํ•ด๋‹น ๊ธฐ์‚ฌ๊ฐ€ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋…ผํ‰ "๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ๋๋‚ฌ๋‚˜์š”?"๋ผ๋Š” ์ฃผ์ œ์— ๋Œ€ํ•ด ๋‚ด ์ž์„ธํ•œ ๋‹ต๋ณ€์— โ€œ์ด๊ฑด ๊ธฐ์‚ฌ ๊ฐ™๋‹คโ€๋Š” ๋ง์„ ๋“ค์—ˆ๋‹ค. ๊ธ€์Ž„, ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๊ธฐ์‚ฌ๊ฐ€์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋…์ž๋Š” QEMU ์ฝ”๋“œ ์ƒ์„ฑ ๋ฐฑ์—”๋“œ ์„ค๊ณ„์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์‹ค๊ณผ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ Just-in-Time ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ž‘์—…

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์˜ ํŽธ์ง€๋Š” ์ด์Šˆ ๋ฐ ํ’€ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์— ๋Œ€ํ•œ ์•Œ๋ฆผ์œผ๋กœ ๋„์ฐฉํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ‘์ž๊ธฐ ์Šค๋ ˆ๋“œ์—์„œ ์–ธ๊ธ‰ Qemu ๋ฐฑ์—”๋“œ๋กœ์„œ์˜ Binaryen ๋งฅ๋ฝ์—์„œ "๊ทธ ์‚ฌ๋žŒ์ด ๊ทธ๋Ÿฐ ์ง“์„ ํ–ˆ์œผ๋‹ˆ ๋ญ๋ผ๊ณ  ๋งํ• ์ง€๋„ ๋ชฐ๋ผ์š”." ์šฐ๋ฆฌ๋Š” Emscripten์˜ ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ์—” WASM JIT๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ธ€์Ž„์š”, ๊ฑฐ๊ธฐ์—๋Š” Apache 2.0 ๋ผ์ด์„ผ์Šค๊ฐ€ ์žˆ๊ณ  QEMU๋Š” ์ „์ฒด์ ์œผ๋กœ GPLv2์— ๋”ฐ๋ผ ๋ฐฐํฌ๋˜๋ฉฐ ํ˜ธํ™˜์„ฑ์ด ์ข‹์ง€ ์•Š๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ‘์ž๊ธฐ ๋ผ์ด์„ผ์Šค๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ๋“  ๊ณ ์ณ (๋ชจ๋ฅด๊ฒ ์–ด์š”: ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ด์ค‘ ๋ผ์ด์„ผ์Šค์ผ ์ˆ˜๋„ ์žˆ๊ณ , ๋‹ค๋ฅธ ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค...). ๋ฌผ๋ก  ์ด๊ฒƒ์€ ๋‚˜๋ฅผ ํ–‰๋ณตํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๋•Œ๊นŒ์ง€ ๋‚˜๋Š” ์ด๋ฏธ ์ž์„ธํžˆ ์‚ดํŽด ๋ดค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•์‹ WebAssembly์™€ ์ €๋Š” ์™ ์ง€ ์Šฌํ”„๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ „ํ™˜ ๊ทธ๋ž˜ํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ๋ธ”๋ก์„ ์ง‘์–ด์‚ผํ‚ค๊ณ , ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์ž์ฒด์—์„œ ์‹คํ–‰ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ๋‹ค์Œ์—๋Š” ๋” ๋งŽ์€ ๊ฒƒ์ด์žˆ์—ˆ์Šต๋‹ˆ๋‹ค ํŽธ์ง€ QEMU ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ์— ์žˆ์ง€๋งŒ ์ด๋Š” "์–ด์จŒ๋“  ๋ˆ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?"๋ผ๋Š” ์งˆ๋ฌธ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฑด ๊ฐ‘์ž๊ธฐ, ๊ทธ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ ์–ด๋Š ์ •๋„ ๋น ๋ฅด๊ฒŒ ์ž‘๋™ํ•œ๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ์„ฑ์„ ํ•จ๊ป˜ ๊ธ์–ด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ „ํ˜€ ์„ค์น˜ํ•˜์ง€ ์•Š๊ณ  ๊ต์œก์ ์ธ ๊ฒƒ์„ ์‹œ์ž‘ํ•˜๊ธฐ
  • ์†Œ๋ฌธ์— ๋”ฐ๋ฅด๋ฉด ์ฆ‰์„์—์„œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ JS ์—”์ง„๋ฟ์ด๋ผ๋Š” ์†Œ๋ฌธ์ด ์žˆ๋Š” iOS์˜ ๊ฐ€์ƒํ™”(์‚ฌ์‹ค์ธ๊ฐ€์š”?)
  • ๋ฏธ๋‹ˆ OS ์‹œ์—ฐ - ๋‹จ์ผ ํ”Œ๋กœํ”ผ, ๋‚ด์žฅ, ๋ชจ๋“  ์ข…๋ฅ˜์˜ ํŽŒ์›จ์–ด ๋“ฑ...

๋ธŒ๋ผ์šฐ์ € ๋Ÿฐํƒ€์ž„ ๊ธฐ๋Šฅ

์ด๋ฏธ ๋งํ–ˆ๋“ฏ์ด QEMU๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €์—๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ธ€์Ž„์š”, ์•„๋‹ˆ์š”... ์ฒ˜์Œ์—๋Š” ์ „ํ˜€ ์กด์žฌํ•˜์ง€ ์•Š์•˜์œผ๋‚˜ ๋‚˜์ค‘์— WebWorkers๊ฐ€ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์•„๋Š” ํ•œ ์ด๊ฒƒ์€ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์ž…๋‹ˆ๋‹ค. ๊ณต์œ ๋ณ€์ˆ˜ ์—†์ด. ๋‹น์—ฐํžˆ ์ด๋Š” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ด์‹ํ•  ๋•Œ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ๋Œ€์ค‘์˜ ์••๋ ฅ์„ ๋ฐ›์•„ ์ด ์ด๋ฆ„์œผ๋กœ๋„ ์‹œํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. SharedArrayBuffers. ์ ์ฐจ์ ์œผ๋กœ ๋„์ž…๋˜์–ด ๋‹ค์–‘ํ•œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ถœ์‹œ๋ฅผ ์ถ•ํ•˜ํ•œ ๋‹ค์Œ ์ƒˆํ•ด๋ฅผ ์ถ•ํ•˜ํ•˜๊ณ  ๋ฉœํŠธ๋‹ค์šด... ๊ทธ ํ›„ ๊ทธ๋“ค์€ ์‹œ๊ฐ„ ์ธก์ •์ด ๋Œ€๋žต์ ์ด๊ฑฐ๋‚˜ ๋Œ€๋žต์ ์ด๋ผ๋Š” ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์ง€๋งŒ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์™€ ์Šค๋ ˆ๋“œ๊ฐ€ ์นด์šดํ„ฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๊ฒฝ์šฐ ๋ชจ๋‘ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ฝค ์ •ํ™•ํ•˜๊ฒŒ ์ž‘๋™ํ•  ๊ฑฐ์•ผ. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์„ ๋น„ํ™œ์„ฑํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋‹ค์‹œ ์ผ  ๊ฒƒ ๊ฐ™์ง€๋งŒ, ์ฒซ ๋ฒˆ์งธ ์‹คํ—˜์—์„œ ๋ถ„๋ช…ํ•ด์กŒ๋“ฏ์ด, ๊ทธ๊ฒƒ ์—†์ด๋„ ์ƒ๋ช…์ด ์žˆ๊ณ , ๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๊ธฐ๋Šฅ์€ ์Šคํƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ์กฐ์ž‘์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ํ˜„์žฌ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ €์žฅํ•˜๊ณ  ์ƒˆ ์Šคํƒ์ด ์žˆ๋Š” ์ƒˆ ์ปจํ…์ŠคํŠธ๋กœ ์ „ํ™˜ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ ์Šคํƒ์€ JS ๊ฐ€์ƒ ๋จธ์‹ ์— ์˜ํ•ด ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ด์ „ ํ๋ฆ„์„ ์™„์ „ํžˆ ์ˆ˜๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? ์‚ฌ์‹ค QEMU์˜ ๋ธ”๋ก I/O๋Š” ์ฝ”๋ฃจํ‹ด์„ ํ†ตํ•ด ๊ตฌํ˜„๋˜๋ฉฐ, ์—ฌ๊ธฐ์„œ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ์Šคํƒ ์กฐ์ž‘์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ Emscipten์—๋Š” ์ด๋ฏธ ๋‘ ๊ฐ€์ง€ ๋น„๋™๊ธฐ ์ž‘์—… ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐํ™” ะธ ํ†ต์—ญ์‚ฌ. ์ฒซ ๋ฒˆ์งธ๋Š” ์ƒ์„ฑ๋œ JavaScript ์ฝ”๋“œ์˜ ์ƒ๋‹นํ•œ ๋ถ€ํ’€๋ฆผ์„ ํ†ตํ•ด ์ž‘๋™ํ•˜๋ฉฐ ๋” ์ด์ƒ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” ํ˜„์žฌ์˜ "์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•"์ด๋ฉฐ ๊ธฐ๋ณธ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ ์ƒ์„ฑ์„ ํ†ตํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ฒœ์ฒœํžˆ ์ž‘๋™ํ•˜์ง€๋งŒ ์ฝ”๋“œ๊ฐ€ ๋ถ€ํ’€์–ด์˜ค๋ฅด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋Œ€ํ•œ ์ฝ”๋ฃจํ‹ด ์ง€์›์€ ๋…๋ฆฝ์ ์œผ๋กœ ์ œ๊ณต๋˜์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค(Asyncify์šฉ์œผ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋ฃจํ‹ด์ด ์ด๋ฏธ ์žˆ์—ˆ๊ณ  Emterpreter์šฉ์œผ๋กœ ๊ฑฐ์˜ ๋™์ผํ•œ API ๊ตฌํ˜„์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ๊ฒฐํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค).

ํ˜„์žฌ๋กœ์„œ๋Š” ์ฝ”๋“œ๋ฅผ 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 ์ฝ”๋“œ์ธ ์ฒ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์ˆœ์ „ํžˆ ๋ฐ”์ด๋„ˆ๋ฆฌ์ด๊ณ  ์ตœ์ ํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ ๋‹จ์ˆœํžˆ ์ •์ˆ˜๋ฅผ ์“ฐ๋Š” ๊ฒƒ์กฐ์ฐจ ๊ทธ๋ฆฌ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์••์ถ•์„ ์œ„ํ•ด ๋‹ค์Œ ํ˜•์‹์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. LEB128.

Asm.js์˜ ์žฌ๋ฃจํ•‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ๋“ค์–ด๋ณด์…จ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” JS ์—”์ง„์ด ์„ค๊ณ„๋œ "๊ณ ์ˆ˜์ค€" ํ๋ฆ„ ์ œ์–ด ๋ช…๋ น(์ฆ‰, if-then-else, ๋ฃจํ”„ ๋“ฑ)์„ ๋ณต์›ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์„œ์— ์˜ํ•ด ์‹คํ–‰๋˜๋Š” ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ์— ๋” ๊ฐ€๊นŒ์šด ๋‚ฎ์€ ์ˆ˜์ค€์˜ LLVM IR. ๋‹น์—ฐํžˆ QEMU์˜ ์ค‘๊ฐ„ ํ‘œํ˜„์€ ๋‘ ๋ฒˆ์งธ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ๋ฐ”์ดํŠธ์ฝ”๋“œ, ๊ณ ํ†ต์˜ ๋์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค... ๊ทธ๋ฆฌ๊ณ  ๋ธ”๋ก, if-then-else ๋ฐ ๋ฃจํ”„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!..

์ด๊ฒƒ์ด Binaryen์ด ์œ ์šฉํ•œ ๋˜ ๋‹ค๋ฅธ ์ด์œ ์ž…๋‹ˆ๋‹ค. WASM์— ์ €์žฅ๋˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ์ƒ์œ„ ์ˆ˜์ค€ ๋ธ”๋ก์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ณธ ๋ธ”๋ก๊ณผ ๊ทธ ์‚ฌ์ด์˜ ์ „ํ™˜ ๊ทธ๋ž˜ํ”„์—์„œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธ€์Ž„์š”, ์ €๋Š” ์ด๋ฏธ ํŽธ๋ฆฌํ•œ C/C++ API ๋’ค์— WebAssembly ์ €์žฅ ํ˜•์‹์ด ์ˆจ๊ฒจ์ ธ ์žˆ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

TCG(์ž‘์€ ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ)

TCG ์›๋ž˜๋Š” C ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋ฐฑ์—”๋“œ ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ถ„๋ช…ํžˆ GCC์™€์˜ ๊ฒฝ์Ÿ์„ ๊ฒฌ๋”œ ์ˆ˜ ์—†์—ˆ์ง€๋งŒ ๊ฒฐ๊ตญ QEMU์—์„œ ํ˜ธ์ŠคํŠธ ํ”Œ๋žซํผ์˜ ์ฝ”๋“œ ์ƒ์„ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์ž๋ฆฌ๋ฅผ ์žก์•˜์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํ”„๋ฆฌํ„ฐ์— ์˜ํ•ด ์ฆ‰์‹œ ์‹คํ–‰๋˜๋Š” ์ผ๋ถ€ ์ถ”์ƒ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” TCG ๋ฐฑ์—”๋“œ๋„ ์žˆ์ง€๋งŒ ์ด๋ฒˆ์—๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ QEMU์—์„œ๋Š” ์ด๋ฏธ ๋‹ค์Œ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ƒ์„ฑ๋œ TB๋กœ์˜ ์ „ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. 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๊ฐœ์˜ ํฌ์ธํ„ฐ๋ฅผ ์ ์—ˆ์Šต๋‹ˆ๋‹ค. ์‹œ์ž‘ ํ‘œ์‹œ(๊ทผ์ฒ˜์˜ ํŠน์ • ๊ฐ’) 0xFFFFFFFFTB์˜ ํ˜„์žฌ ์ƒํƒœ), ์ปจํ…์ŠคํŠธ, ์ƒ์„ฑ๋œ ๋ชจ๋“ˆ, ๋””๋ฒ„๊น…์„ ์œ„ํ•œ ๋งค์ง ๋„˜๋ฒ„๋ฅผ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๋งˆํฌ๊ฐ€ ๋‹ค์Œ ์œ„์น˜์— ๋ฐฐ์น˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 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-API: ๋ชจ๋“ˆ์„ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ ์•ˆ์— ํ‘œํ˜„์‹ ์ƒ์„ฑ - ๋‹จํ•ญ, ๋ฐ”์ด๋„ˆ๋ฆฌ, ๋‹ค๋ฅธ ํ‘œํ˜„์‹์˜ ๋ธ”๋ก, ์ œ์–ด ํ๋ฆ„ ๋“ฑ ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ‘œํ˜„์‹์„ ๋ณธ๋ฌธ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋‚˜์ฒ˜๋Ÿผ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ์ „ํ™˜ ๊ทธ๋ž˜ํ”„๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ relooper ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ, ๋ธ”๋ก ๊ฒฝ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋Š” ํ•œ ๋ธ”๋ก ๋‚ด ์‹คํ–‰ ํ๋ฆ„์— ๋Œ€ํ•œ ๋†’์€ ์ˆ˜์ค€์˜ ์ œ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋‚ด๋ถ€ ๋น ๋ฅธ ๊ฒฝ๋กœ/๋Š๋ฆฐ ๊ฒฝ๋กœ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‚ด์žฅ๋œ TLB ์บ์‹œ ์ฒ˜๋ฆฌ ์ฝ”๋“œ ๋‚ด์—์„œ ๊ฒฝ๋กœ ๋ถ„๊ธฐ๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€๋งŒ "์™ธ๋ถ€" ์ œ์–ด ํ๋ฆ„์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋ฃจํผ๋ฅผ ํ•ด์ œํ•˜๋ฉด ํ•ด๋‹น ๋ธ”๋ก๋„ ํ•ด์ œ๋˜๊ณ , ๋ชจ๋“ˆ์„ ํ•ด์ œํ•˜๋ฉด ํ•ด๋‹น ๋ชจ๋“ˆ์— ํ• ๋‹น๋œ ํ‘œํ˜„์‹, ํ•จ์ˆ˜ ๋“ฑ์ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ํˆฌ๊ธฐ์žฅ.

๊ทธ๋Ÿฌ๋‚˜ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ƒ์„ฑ ๋ฐ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜๋ ค๋ฉด ์ด ๋กœ์ง์„ 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.

๋˜ํ•œ, ๋ฐ๋ชจ (ํ˜„์žฌ๋Š” ์–ด๋‘์šด ๋ผ์ด์„ผ์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ) Firefox์—์„œ๋งŒ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. Chrome ๊ฐœ๋ฐœ์ž๋Š” ์™ ์ง€ ์ค€๋น„๊ฐ€ ์•ˆ ๋์–ด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ฒœ ๊ฐœ๊ฐ€ ๋„˜๋Š” WebAssembly ๋ชจ๋“ˆ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์–ดํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์— ๊ทธ๋“ค์€ ๋‹จ์ˆœํžˆ ๊ฐ ๋ชจ๋“ˆ์— ๊ธฐ๊ฐ€๋ฐ”์ดํŠธ์˜ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ํ• ๋‹นํ–ˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ์—ฌ๊ธฐ๊นŒ์ง€์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋ˆ„๊ตฐ๊ฐ€ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋˜ ๋‹ค๋ฅธ ๊ธฐ์‚ฌ๊ฐ€ ๋‚˜์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ตœ์†Œํ•œ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋ธ”๋ก ์žฅ์น˜๋ฅผ ์ž‘๋™์‹œํ‚ค์„ธ์š”. ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์ด ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ์ด ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์—ฌ์ „ํžˆ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 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

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€