JIT๋ฅผ ์ง€์›ํ•˜๋Š” Qemu.js: ์—ฌ์ „ํžˆ ๋ง์„ ๋’ค๋กœ ๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช‡ ๋…„ ์ „ Fabrice Bellard jslinux๊ฐ€ ์ž‘์„ฑํ•จ JavaScript๋กœ ์ž‘์„ฑ๋œ PC ์—๋ฎฌ๋ ˆ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ดํ›„์—๋Š” ์ตœ์†Œํ•œ ๋” ๋งŽ์€ ์ผ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์ƒ x86. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ๊ทธ๋“ค ๋ชจ๋‘๋Š” ํ†ต์—ญ์‚ฌ ์˜€๊ณ  ๋™์ผํ•œ Fabrice Bellard์™€ ์•„๋งˆ๋„ ์ž์กด์‹ฌ์ด ๊ฐ•ํ•œ ํ˜„๋Œ€ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ํ›จ์”ฌ ์ผ์ฐ ์ž‘์„ฑํ•œ Qemu๋Š” ๊ฒŒ์ŠคํŠธ ์ฝ”๋“œ์˜ JIT ์ปดํŒŒ์ผ์„ ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ ์ฝ”๋“œ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•ด๊ฒฐํ•˜๋Š” ์ž‘์—…๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋ฐ˜๋Œ€ ์ž‘์—…์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๋•Œ์ธ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๋ฅผ JavaScript๋กœ JIT ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ์ด ๊ฒฝ์šฐ Qemu๋ฅผ ํฌํŒ…ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ์™œ Qemu์—๋Š” ๋” ๊ฐ„๋‹จํ•˜๊ณ  ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ ์—๋ฎฌ๋ ˆ์ดํ„ฐ(์˜ˆ๋ฅผ ๋“ค์–ด ๋™์ผํ•œ VirtualBox)๊ฐ€ ์„ค์น˜๋˜์–ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Qemu์—๋Š” ๋ช‡ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์˜คํ”ˆ ์†Œ์Šค
  • ์ปค๋„ ๋“œ๋ผ์ด๋ฒ„ ์—†์ด ์ž‘์—…ํ•˜๋Š” ๋Šฅ๋ ฅ
  • ํ†ต์—ญ์‚ฌ ๋ชจ๋“œ์—์„œ ์ž‘์—…ํ•˜๋Š” ๋Šฅ๋ ฅ
  • ๋‹ค์ˆ˜์˜ ํ˜ธ์ŠคํŠธ ๋ฐ ๊ฒŒ์ŠคํŠธ ์•„ํ‚คํ…์ฒ˜ ์ง€์›

์„ธ ๋ฒˆ์งธ ์š”์ ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ด์ œ ์‹ค์ œ๋กœ TCI ๋ชจ๋“œ์—์„œ๋Š” ๊ฒŒ์ŠคํŠธ ๊ธฐ๊ณ„ ๋ช…๋ น์–ด ์ž์ฒด๊ฐ€ ํ•ด์„๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์—ฌ๊ธฐ์—์„œ ์–ป์€ ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ ํ•ด์„๋˜์ง€๋งŒ ์ด๊ฒƒ์ด ๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ณธ์งˆ์„ ๋ฐ”๊พธ์ง€๋Š” ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜์˜ Qemu, ์šด์ด ์ข‹๋‹ค๋ฉด C ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ ์ž‘์„ฑ์„ ์—ฐ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด์ œ XNUMX๋…„ ๋™์•ˆ ์—ฌ๊ฐ€ ์‹œ๊ฐ„์— Qemu ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์—ฌ์œ ๋กญ๊ฒŒ ๋งŒ์ง€์ž‘๊ฑฐ๋ฆฐ ๋์— Kolibri OS์™€ ๊ฐ™์ด ์ด๋ฏธ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—… ํ”„๋กœํ† ํƒ€์ž…์ด ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

์— ์Šคํฌ๋ฆฝํŠธ๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

์š”์ฆ˜์—๋Š” ๋งŽ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋“ฑ์žฅํ–ˆ์œผ๋ฉฐ ๊ทธ ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” JavaScript์ž…๋‹ˆ๋‹ค. Type Script์™€ ๊ฐ™์€ ์ผ๋ถ€๋Š” ์›๋ž˜ ์›น์šฉ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ณ ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์— Emscripten์€ ๊ธฐ์กด C ๋˜๋Š” C++ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํ˜•์‹์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ~์— ์ด ํŽ˜์ด์ง€ ์šฐ๋ฆฌ๋Š” ์ž˜ ์•Œ๋ ค์ง„ ํ”„๋กœ๊ทธ๋žจ์˜ ๋งŽ์€ ํฌํŠธ๋ฅผ ์ˆ˜์ง‘ํ–ˆ์Šต๋‹ˆ๋‹ค: ์—ฌ๊ธฐ์—์˜ˆ๋ฅผ ๋“ค์–ด PyPy๋ฅผ ๋ณด๋ฉด ์ด๋ฏธ JIT๊ฐ€ ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ปดํŒŒ์ผ๋˜๊ณ  ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํŠน์ง•, ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ™์€ ํŽ˜์ด์ง€์— "Emscripten์€ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์„ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ฐธ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํœด๋Œ€์šฉ C/C++ ์ฝ”๋“œ๋ฅผ JavaScript๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ‘œ์ค€์— ๋”ฐ๋ผ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์ด์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ x86์—์„œ ์ž‘๋™ํ•˜๋Š” ์—ฌ๋Ÿฌ ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ผ๋ถ€ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ธˆ์ง€๋˜๋Š” ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์•ก์„ธ์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ , Qemu๋Š” ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํ”„๋กœ๊ทธ๋žจ์ด๊ณ , ์ €๋Š” ์ด๊ฒƒ์ด ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์„ ๋งŽ์ด ํฌํ•จํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๊ณ  ๋ฏฟ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐ›์•„ ์ปดํŒŒ์ผํ•œ ๋‹ค์Œ JIT๋ฅผ ์•ฝ๊ฐ„ ์ˆ˜์ •ํ•˜๋ฉด ๋์ž…๋‹ˆ๋‹ค! ์‚ฌ๋ก€...

๋จผ์ € ์‹œ๋„ํ•ด๋ณด์‹ญ์‹œ์˜ค.

์ผ๋ฐ˜์ ์œผ๋กœ Qemu๋ฅผ JavaScript๋กœ ํฌํŒ…ํ•œ๋‹ค๋Š” ์•„์ด๋””์–ด๋ฅผ ์ฒ˜์Œ์œผ๋กœ ์ƒ๊ฐํ•ด๋‚ธ ์‚ฌ๋žŒ์€ ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. Emscripten์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ์ง€ ReactOS ํฌ๋Ÿผ์— ์งˆ๋ฌธ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋„ Fabrice Bellard๊ฐ€ ์ด ์ž‘์—…์„ ์ง์ ‘ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๋Š” ์†Œ๋ฌธ์ด ์žˆ์—ˆ์ง€๋งŒ ์šฐ๋ฆฌ๋Š” jslinux์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์•„๋Š” ํ•œ JS์—์„œ ์ˆ˜๋™์œผ๋กœ ์ถฉ๋ถ„ํ•œ ์„ฑ๋Šฅ์„ ์–ป์œผ๋ ค๋Š” ์‹œ๋„์ผ ๋ฟ์ด๋ฉฐ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— Virtual x86์ด ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๋‚œ๋…ํ™”๋˜์ง€ ์•Š์€ ์†Œ์Šค๊ฐ€ ๊ฒŒ์‹œ๋˜์—ˆ์œผ๋ฉฐ, ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ ์—๋ฎฌ๋ ˆ์ด์…˜์˜ ๋” ํฐ "ํ˜„์‹ค์„ฑ"์œผ๋กœ ์ธํ•ด SeaBIOS๋ฅผ ํŽŒ์›จ์–ด๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Emscripten์„ ์‚ฌ์šฉํ•˜์—ฌ Qemu๋ฅผ ํฌํŒ…ํ•˜๋ ค๋Š” ์‹œ๋„๊ฐ€ ์ ์–ด๋„ ํ•œ ๋ฒˆ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์†Œ์ผ“ ํŽ˜์–ด, ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ๊ฐœ๋ฐœ์€ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์— ์†Œ์Šค๊ฐ€ ์žˆ๊ณ  ์—ฌ๊ธฐ์— Emscripten์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ€์ ธ์™€์„œ ์ปดํŒŒ์ผํ•˜์„ธ์š”. ๊ทธ๋Ÿฌ๋‚˜ Qemu๊ฐ€ ์˜์กดํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์˜์กดํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ๋„ ์žˆ์œผ๋ฉฐ ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์–ด๋–ค glib์ด ์˜์กดํ•˜๋Š”์ง€. Emscripten์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํฌํŠธ์˜ ๋Œ€๊ทœ๋ชจ ์ปฌ๋ ‰์…˜์— ํ•˜๋‚˜๊ฐ€ ์žˆ๋‹ค๋Š” ์†Œ๋ฌธ์ด ์ธํ„ฐ๋„ท์— ์žˆ์—ˆ์ง€๋งŒ ์–ด์ฉ์ง€ ๋ฏฟ๊ธฐ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค. ์ฒซ์งธ, ์ƒˆ๋กœ์šด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋  ์˜๋„๊ฐ€ ์—†์—ˆ๊ณ  ๋‘˜์งธ, ๋„ˆ๋ฌด ๋‚ฎ์€ ์ˆ˜์ค€์˜ ์ปดํŒŒ์ผ๋Ÿฌ์˜€์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜์—ฌ JS๋กœ ์ปดํŒŒ์ผํ•˜์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ๋‹จ์ง€ ์–ด์…ˆ๋ธ”๋ฆฌ ์‚ฝ์ž…์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋น„ํ‹€๋ฉด ์ผ๋ถ€ ํ˜ธ์ถœ ๊ทœ์น™์˜ ๊ฒฝ์šฐ ์Šคํƒ์—์„œ ํ•„์š”ํ•œ ์ธ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ธ์ˆ˜ ์—†์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Emscripten์€ ๊นŒ๋‹ค๋กœ์šด ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๋ธŒ๋ผ์šฐ์ € JS ์—”์ง„ ์ตœ์ ํ™” ํ”„๋กœ๊ทธ๋žจ์— ์นœ์ˆ™ํ•˜๊ฒŒ ๋ณด์ด๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ํŠธ๋ฆญ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, ์ผ๋ถ€ ์ถ”์ƒ ์ „ํ™˜ ๋ช…๋ น๊ณผ ํ•จ๊ป˜ ์ˆ˜์‹ ๋œ LLVM IR์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ์ธ ์žฌ๋ฃจํ•‘(relooping)์€ ๊ทธ๋Ÿด๋“ฏํ•œ ifs, ๋ฃจํ”„ ๋“ฑ์„ ๋‹ค์‹œ ์ƒ์„ฑํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ธ์ˆ˜๋Š” ์–ด๋–ป๊ฒŒ ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๋‚˜์š”? ๋‹น์—ฐํžˆ JS ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ธ์ˆ˜๋กœ, ์ฆ‰ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์Šคํƒ์„ ํ†ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ๋‹จ์ˆœํžˆ JS๋กœ libffi์˜ ๋Œ€์ฒด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ํ‘œ์ค€ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์•„์ด๋””์–ด๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ๊ฒฐ๊ตญ ๊ธฐ์กด ์ฝ”๋“œ์™€ ์ž‘๋™ํ•˜๋„๋ก ํ—ค๋” ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์กŒ์Šต๋‹ˆ๋‹ค. "๊ณผ์ œ๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•œ๊ฐ€์š”? "์šฐ๋ฆฌ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋ฉ์ฒญํ•œ๊ฐ€์š”?" ๋งํ•˜์ž๋ฉด libffi๋ฅผ ๋‹ค๋ฅธ ์•„ํ‚คํ…์ฒ˜๋กœ ํฌํŒ…ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ Emscripten์—๋Š” ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ์šฉ ๋งคํฌ๋กœ(Javascript์—์„œ๋Š” ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๋ฌด์—‡์ด๋“  ์–ด์…ˆ๋ธ”๋Ÿฌ)์™€ ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์ฆ‰์‹œ ์‹คํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋ชจ๋‘ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ”Œ๋žซํผ ์ข…์† libffi ์กฐ๊ฐ์„ ํ•œ๋™์•ˆ ๋งŒ์ง€์ž‘๊ฑฐ๋ฆฐ ํ›„ ์ปดํŒŒ์ผ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์–ป์—ˆ๊ณ  ์ฒ˜์Œ ์ ‘ํ•œ ํ…Œ์ŠคํŠธ์—์„œ ์ด๋ฅผ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋†€๋ž๊ฒŒ๋„ ํ…Œ์ŠคํŠธ๋Š” ์„ฑ๊ณต์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ฒœ์žฌ์„ฑ์— ๋†€๋ž์Šต๋‹ˆ๋‹ค. ๋†๋‹ด์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ถœ์‹œ๋ถ€ํ„ฐ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋‚ด ๋ˆˆ์„ ๋ฏฟ์ง€ ์•Š๊ณ  ๊ฒฐ๊ณผ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์‚ดํŽด๋ณด๊ณ  ๋‹ค์Œ์— ๋ฐœ๊ตดํ•  ์œ„์น˜๋ฅผ ํ‰๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‚˜๋Š” ๋‘ ๋ฒˆ์งธ๋กœ ๋ฏธ์ณ๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ธฐ๋Šฅ์ด ํ•œ ์œ ์ผํ•œ ์ผ์€ ffi_call - ์„ฑ๊ณต์ ์ธ ํ†ตํ™”๊ฐ€ ๋ณด๊ณ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ „ํ™” ์ž์ฒด๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ์˜ฌ๋ฆผํ”ผ์•„๋“œ ํ•™์ƒ์ด๋ผ๋ฉด ๋ˆ„๊ตฌ๋‚˜ ์•Œ ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ์˜ค๋ฅ˜๋ฅผ โ€‹โ€‹์ˆ˜์ •ํ•œ ์ฒซ ๋ฒˆ์งธ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋น„๊ตํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. a == b ๊ทธ๋ฆฌ๊ณ  ์‹ฌ์ง€์–ด ์–ด๋–ป๊ฒŒ a - b < EPS - ๋ชจ๋“ˆ๋„ ๊ธฐ์–ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0์€ 1/3๊ณผ ๊ฑฐ์˜ ๊ฐ™์Šต๋‹ˆ๋‹ค... ์ผ๋ฐ˜์ ์œผ๋กœ ๋‚˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๊ณ  glib๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ํŠน์ • libffi ํฌํŠธ๋กœ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋จ - ํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ๋‚˜์ค‘์— ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ตœ์ข… ์ฝ”๋“œ์— libffi ํ•จ์ˆ˜๋„ ํฌํ•จํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฏธ ๋งํ–ˆ๋“ฏ์ด ๋ช‡ ๊ฐ€์ง€ ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉฐ ์ •์˜๋˜์ง€ ์•Š์€ ๋‹ค์–‘ํ•œ ๋™์ž‘์„ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ์ค‘์—์„œ ๋” ๋ถˆ์พŒํ•œ ๊ธฐ๋Šฅ์ด ์ˆจ๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. JavaScript๋Š” ์„ค๊ณ„์ƒ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›์น™์ ์œผ๋กœ ์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ข‹์€ ์•„์ด๋””์–ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์•„ํ‚คํ…์ฒ˜๊ฐ€ C ์Šค๋ ˆ๋“œ์— ์—ฐ๊ฒฐ๋œ ์ฝ”๋“œ๋ฅผ ์ด์‹ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ Firefox๋Š” ๊ณต์œ  ์ž‘์—…์ž ์ง€์›์„ ์‹คํ—˜ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ Emscripten์—๋Š” ์ด๋ฅผ ์œ„ํ•œ pthread ๊ตฌํ˜„์ด ์žˆ์ง€๋งŒ ์ €๋Š” ๊ทธ๊ฒƒ์— ์˜์กดํ•˜๊ณ  ์‹ถ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. Qemu ์ฝ”๋“œ์—์„œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์„ ์ฒœ์ฒœํžˆ ๊ทผ์ ˆํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์Šค๋ ˆ๋“œ๊ฐ€ ์–ด๋””์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ์•„๋‚ด๊ณ , ์ด ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ๋ฃจํ”„์˜ ๋ณธ๋ฌธ์„ ๋ณ„๋„์˜ ํ•จ์ˆ˜๋กœ ์ด๋™ํ•˜๊ณ , ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋ฅผ ๋ฉ”์ธ ๋ฃจํ”„์—์„œ ํ•˜๋‚˜์”ฉ ํ˜ธ์ถœํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์‹œ๋„

์–ด๋Š ์‹œ์ ์—์„œ ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๋ฉฐ, ์ฝ”๋“œ ์ฃผ์œ„์— ๋ชฉ๋ฐœ์„ ์•„๋ฌด๋ ‡๊ฒŒ๋‚˜ ๋ฐ€์–ด ๋„ฃ๋Š” ๊ฒƒ์€ ์•„๋ฌด ์†Œ์šฉ์ด ์—†๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๋ก : ๋ชฉ๋ฐœ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ณผ์ •์„ ์–ด๋–ป๊ฒŒ๋“  ์ฒด๊ณ„ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹น์‹œ ์ตœ์‹  ๋ฒ„์ „์ด์—ˆ๋˜ 2.4.1 ๋ฒ„์ „์„ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค(2.5.0์ด ์•„๋‹™๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ƒˆ ๋ฒ„์ „์—๋Š” ์•„์ง ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์€ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฒ„๊ทธ) ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ๋จผ์ € ํ•œ ์ผ์€ ์•ˆ์ „ํ•˜๊ฒŒ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. thread-posix.c. ์ฆ‰, ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ฐจ๋‹จ์œผ๋กœ ์ด์–ด์ง€๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์ฆ‰์‹œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. abort() -๋ฌผ๋ก  ์ด๊ฒƒ์ด ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ํ•ด๊ฒฐํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ์ ์–ด๋„ ์ผ๊ด€์„ฑ ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์šฉํžˆ ๋ฐ›๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ์™ ์ง€ ๋” ์ฆ๊ฑฐ์› ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ Emscripten ์˜ต์…˜์€ ์ฝ”๋“œ๋ฅผ JS๋กœ ํฌํŒ…ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. -s ASSERTIONS=1 -s SAFE_HEAP=1 - ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ฃผ์†Œ์— ๋Œ€ํ•œ ํ˜ธ์ถœ๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์œ ํ˜•์˜ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์„ ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค(์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹ํ™”๋œ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ฝ”๋“œ์™€ ์ „ํ˜€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค). HEAP32[addr >> 2] = 1) ๋˜๋Š” ์ž˜๋ชป๋œ ๊ฐœ์ˆ˜์˜ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ •๋ ฌ ์˜ค๋ฅ˜๋Š” ๋ณ„๋„์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ๋งํ–ˆ๋“ฏ์ด Qemu์—๋Š” ์ฝ”๋“œ ์ƒ์„ฑ TCI(์ž‘์€ ์ฝ”๋“œ ํ•ด์„๊ธฐ)๋ฅผ ์œ„ํ•œ "ํ‡ดํ™”๋œ" ํ•ด์„ ๋ฐฑ์—”๋“œ๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜์—์„œ Qemu๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ ค๋ฉด ์šด์ด ์ข‹๋‹ค๋ฉด C ์ปดํŒŒ์ผ๋Ÿฌ๋กœ๋„ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. "์šด์ด ์ข‹๋‹ค๋ฉด". ๋‚˜๋Š” ์šด์ด ์ข‹์ง€ ์•Š์•˜๊ณ  TCI๊ฐ€ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ๋•Œ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์•ก์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋“  ์ข…๋ฅ˜์˜ ARM ๋ฐ ๋ฐ˜๋“œ์‹œ ๋ ˆ๋ฒจํ™”๋œ ์•ก์„ธ์Šค๊ฐ€ ํ•„์š”ํ•œ ๊ธฐํƒ€ ์•„ํ‚คํ…์ฒ˜์—์„œ Qemu๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ TCG ๋ฐฑ์—”๋“œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผํ•˜์ง€๋งŒ TCI๊ฐ€ ์ž‘๋™ํ• ์ง€ ์—ฌ๋ถ€๋Š” ๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•Œ๊ณ  ๋ณด๋‹ˆ TCI ๋ฌธ์„œ์—๋„ ๋น„์Šทํ•œ ๋‚ด์šฉ์ด ๋ถ„๋ช…ํžˆ ๋‚˜์™€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ Qemu์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์—์„œ ๋ฐœ๊ฒฌ๋œ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ฝ๊ธฐ์— ๋Œ€ํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์ฝ”๋“œ์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํž™ ํŒŒ๊ดด

๊ฒฐ๊ณผ์ ์œผ๋กœ TCI์— ๋Œ€ํ•œ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์•ก์„ธ์Šค๊ฐ€ ์ˆ˜์ •๋˜์—ˆ๊ณ  ํ”„๋กœ์„ธ์„œ, RCU ๋ฐ ๊ธฐํƒ€ ์ž‘์€ ๊ฒƒ๋“ค์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๋ฉ”์ธ ๋ฃจํ”„๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ Qemu๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. -d exec,in_asm,out_asm, ์ฆ‰ ์–ด๋–ค ์ฝ”๋“œ ๋ธ”๋ก์ด ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ๋งํ•ด์•ผ ํ•˜๊ณ , ๋ฐฉ์†ก ์‹œ ๊ฒŒ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ๋ฌด์—‡์ธ์ง€, ํ˜ธ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ๋ฌด์—‡์ธ์ง€(์ด ๊ฒฝ์šฐ ๋ฐ”์ดํŠธ์ฝ”๋“œ) ์ž‘์„ฑํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์‹œ์ž‘๋˜๊ณ , ์—ฌ๋Ÿฌ ๋ณ€ํ™˜ ๋ธ”๋ก์„ ์‹คํ–‰ํ•˜๊ณ , RCU๊ฐ€ ์ด์ œ ์‹œ์ž‘๋  ๊ฒƒ์ด๋ผ๋Š” ๋””๋ฒ„๊น… ๋ฉ”์‹œ์ง€๋ฅผ ์“ฐ๊ณ ... ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. abort() ํ•จ์ˆ˜ ๋‚ด๋ถ€ free(). ๊ธฐ๋Šฅ์„ ์กฐ์ž‘ํ•˜์—ฌ free() ์šฐ๋ฆฌ๋Š” ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ์•ž์˜ XNUMX๋ฐ”์ดํŠธ์— ์žˆ๋Š” ํž™ ๋ธ”๋ก์˜ ํ—ค๋”์—์„œ ๋ธ”๋ก ํฌ๊ธฐ๋‚˜ ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ ๋Œ€์‹ ์— ๊ฐ€๋น„์ง€๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค.

ํž™ ํŒŒ๊ดด - ์ •๋ง ๊ท€์—ฝ๋„ค์š”... ์ด๋Ÿฐ ๊ฒฝ์šฐ ์œ ์šฉํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. (๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด) ๋™์ผํ•œ ์†Œ์Šค์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ชจ์•„์„œ Valgrind์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ผ๋งˆ ํ›„ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ์˜ต์…˜์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์‹คํ–‰์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์— ์ดˆ๊ธฐํ™” ์ค‘์—๋„ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋ถˆ์พŒํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ์†Œ์Šค๊ฐ€ ์ •ํ™•ํžˆ ๋™์ผํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์ด๋Š” ๋†€๋ผ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ตฌ์„ฑ์ด ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ์˜ต์…˜์„ ์Šค์นด์šฐํŠธํ–ˆ์ง€๋งŒ Valgrind๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋จผ์ € ์ด ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•œ ๋‹ค์Œ ์šด์ด ์ข‹๋‹ค๋ฉด , ์›๋ณธ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์ €๋Š” Valgrind์—์„œ ๊ฐ™์€ ๊ฒƒ์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค... Y-y-y, y-y-y, uh-uh, ์‹œ์ž‘๋˜์—ˆ๊ณ  ์ •์ƒ์ ์œผ๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ๊ฑฐ์ณ ์˜ค๋ฅ˜๋Š” ๋งํ•  ๊ฒƒ๋„ ์—†๊ณ  ์ž˜๋ชป๋œ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค์— ๋Œ€ํ•œ ๋‹จ์ผ ๊ฒฝ๊ณ ๋„ ์—†์ด ์›๋ž˜ ๋ฒ„๊ทธ๋ฅผ ์ง€๋‚˜๊ฐ”์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ๋งํ–ˆ๋“ฏ์ด ์ธ์ƒ์€ ์ด์— ๋Œ€๋น„ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. Walgrind์—์„œ ์‹œ์ž‘ํ•˜๋ฉด ์ถฉ๋Œํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ถฉ๋Œ์„ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ด์—ˆ๋Š”์ง€๋Š” ๋ฏธ์Šคํ„ฐ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๋‚ด ๊ฐ€์„ค์€ ์ดˆ๊ธฐํ™” ์ค‘ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ ํ›„ ํ˜„์žฌ ๋ช…๋ น ๊ทผ์ฒ˜์—์„œ gdb๊ฐ€ ์ž‘์—…์„ ํ‘œ์‹œํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. memset-a ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํšจํ•œ ํฌ์ธํ„ฐ๊ฐ€ ์žˆ์Œ mmx, ์—ฌ๋ถ€ xmm ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ์ผ์ข…์˜ ์ •๋ ฌ ์˜ค๋ฅ˜์˜€์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฏฟ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ข‹์Šต๋‹ˆ๋‹ค. Valgrind๋Š” ์—ฌ๊ธฐ์„œ๋Š” ๋„์›€์ด ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์—์„œ ๊ฐ€์žฅ ์—ญ๊ฒจ์šด ์ผ์ด ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์‹œ์ž‘๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์ˆ˜๋ฐฑ๋งŒ ๋ช…๋ น ์ „์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋ฒคํŠธ๋กœ ์ธํ•ด ์ „ํ˜€ ์•Œ ์ˆ˜ ์—†๋Š” ์ด์œ ๋กœ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋žซ๋™์•ˆ ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•ด์•ผ ํ• ์ง€์กฐ์ฐจ ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์•‰์•„์„œ ๋””๋ฒ„๊น…์„ ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ—ค๋”๊ฐ€ ๋‹ค์‹œ ์ž‘์„ฑ๋œ ๋‚ด์šฉ์„ ์ธ์‡„ํ•˜๋ฉด ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ผ ์ผ์ข…์˜ ์ด์ง„ ๋ฐ์ดํ„ฐ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณด๋ผ, ์ด ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฌธ์ž์—ด์€ BIOS ํŒŒ์ผ์—์„œ ๋ฐœ๊ฒฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ด์ œ ๊ทธ๊ฒƒ์ด ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ๋ผ๊ณ  ํ•ฉ๋ฆฌ์ ์ธ ํ™•์‹ ์„ ๊ฐ€์ง€๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ  ๊ทธ๊ฒƒ์ด ์ด ๋ฒ„ํผ์— ๊ธฐ๋ก๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Emscripten์—๋Š” ๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ ์ฃผ์†Œ ๊ณต๊ฐ„์ด ๋ฌด์ž‘์œ„๋กœ ์ง€์ •๋˜์ง€ ์•Š๊ณ  ๊ตฌ๋ฉ๋„ ์—†์œผ๋ฏ€๋กœ ๋งˆ์ง€๋ง‰ ์‹คํ–‰์—์„œ ํฌ์ธํ„ฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ ์ค‘๊ฐ„ ์–ด๋”˜๊ฐ€์— ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ณ , ํฌ์ธํ„ฐ๋ฅผ ๋ณด๊ณ , ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ƒ๊ฐํ•  ๊ฑฐ๋ฆฌ๋ฅผ ์–ป์œผ์„ธ์š”. ์‚ฌ์‹ค, ๋ณ€๊ฒฝ ํ›„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ๋ช‡ ๋ถ„ ์ •๋„ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฒฐ๊ณผ์ ์œผ๋กœ BIOS๋ฅผ ์ž„์‹œ ๋ฒ„ํผ์—์„œ ๊ฒŒ์ŠคํŠธ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋ณต์‚ฌํ•˜๋Š” ํŠน์ • ๋ผ์ธ์ด ๋ฐœ๊ฒฌ๋˜์—ˆ์œผ๋ฉฐ ์‹ค์ œ๋กœ ๋ฒ„ํผ ๊ณต๊ฐ„์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด์ƒํ•œ ๋ฒ„ํผ ์ฃผ์†Œ์˜ ์†Œ์Šค๋ฅผ ์ฐพ์œผ๋ฉด ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. qemu_anon_ram_alloc ํŒŒ์ผ์— oslib-posix.c - ๊ฑฐ๊ธฐ์— ์žˆ๋Š” ๋…ผ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ํฌ๊ธฐ๊ฐ€ 2MB์ธ ๊ฑฐ๋Œ€ํ•œ ํŽ˜์ด์ง€์— ์ฃผ์†Œ๋ฅผ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด ์šฐ๋ฆฌ๋Š” ๋ฌผ์–ด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. mmap ๋จผ์ € ์กฐ๊ธˆ ๋” ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋„์›€์„ ๋ฐ›์•„ ์ดˆ๊ณผ๋ถ„์„ ๋ฐ˜ํ™˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. munmap. ์ด๋Ÿฌํ•œ ์ •๋ ฌ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ 2MB ๋Œ€์‹  ๊ฒฐ๊ณผ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. getpagesize() - mmap ์—ฌ์ „ํžˆ ์ •๋ ฌ๋œ ์ฃผ์†Œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค... ๋”ฐ๋ผ์„œ Emscripten์—์„œ๋Š” mmap ๊ทธ๋ƒฅ ์ „ํ™”ํ•ด malloc, ๊ทธ๋Ÿฌ๋‚˜ ๋ฌผ๋ก  ํŽ˜์ด์ง€์— ์ •๋ ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ช‡ ๋‹ฌ๊ฐ„ ์ €๋ฅผ ๋‹ต๋‹ตํ•˜๊ฒŒ ํ–ˆ๋˜ ๋ฒ„๊ทธ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ณ€๊ฒฝ์œผ๋กœ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ะดะฒัƒั… ์œค๊ณฝ.

ํ˜ธ์ถœ ๊ธฐ๋Šฅ์˜ ํŠน์ง•

์ด์ œ ํ”„๋กœ์„ธ์„œ๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์žˆ์œผ๋ฉฐ Qemu๋Š” ์ถฉ๋Œํ•˜์ง€ ์•Š์ง€๋งŒ ํ™”๋ฉด์€ ์ผœ์ง€์ง€ ์•Š์œผ๋ฉฐ ์ถœ๋ ฅ์œผ๋กœ ํŒ๋‹จํ•˜๋ฉด ํ”„๋กœ์„ธ์„œ๊ฐ€ ๋น ๋ฅด๊ฒŒ ๋ฃจํ”„์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. -d exec,in_asm,out_asm. ํƒ€์ด๋จธ ์ธํ„ฐ๋ŸฝํŠธ(๋˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋“  ์ธํ„ฐ๋ŸฝํŠธ)๊ฐ€ ๋„์ฐฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฐ€์„ค์ด ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์–ด๋–ค ์ด์œ ๋กœ๋“  ์ž‘๋™ํ–ˆ๋˜ ๋„ค์ดํ‹ฐ๋ธŒ ์–ด์…ˆ๋ธ”๋ฆฌ์˜ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ํ’€๋ฉด ๋น„์Šทํ•œ ๊ทธ๋ฆผ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ „ํ˜€ ๋‹ต์ด ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์œ„ ์˜ต์…˜์œผ๋กœ ๋ฐœํ–‰๋œ ์ถ”์ ์„ ๋น„๊ตํ•˜๋ฉด ์‹คํ–‰ ๊ถค์ ์ด ๋งค์šฐ ์ผ์ฐ ๋ถ„๊ธฐ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋Ÿฐ์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…น์Œ๋œ ๋‚ด์šฉ์„ ๋น„๊ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. emrun ๋„ค์ดํ‹ฐ๋ธŒ ์–ด์…ˆ๋ธ”๋ฆฌ์˜ ์ถœ๋ ฅ์œผ๋กœ ์ถœ๋ ฅ์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ๊ฒƒ์€ ์™„์ „ํžˆ ๊ธฐ๊ณ„์ ์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š”์ง€ ์ •ํ™•ํžˆ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. emrun, ๊ทธ๋Ÿฌ๋‚˜ ์ถœ๋ ฅ์˜ ์ผ๋ถ€ ๋ผ์ธ์ด ์žฌ๋ฐฐ์—ด๋œ ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋˜์—ˆ์œผ๋ฏ€๋กœ diff์˜ ์ฐจ์ด๋Š” ์•„์ง ๊ถค๋„๊ฐ€ ๋ถ„๊ธฐ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ์ด์œ ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ง€์นจ์— ๋”ฐ๋ฅด๋ฉด ljmpl ๋‹ค๋ฅธ ์ฃผ์†Œ๋กœ์˜ ์ „ํ™˜์ด ์žˆ์œผ๋ฉฐ ์ƒ์„ฑ๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋Š” ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋„์šฐ๋ฏธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ช…๋ น์„ ํฌํ•จํ•˜๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€์นจ์„ ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ด๋Ÿฌํ•œ ์ง€์นจ์„ ๋ฒˆ์—ญํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์—ฐ๊ตฌํ•œ ํ›„, ๋จผ์ € ๋ ˆ์ง€์Šคํ„ฐ์—์„œ ํ•ด๋‹น ์ง€์นจ ๋ฐ”๋กœ ์•ž์— ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. cr0 ํ”„๋กœ์„ธ์„œ๋ฅผ ๋ณดํ˜ธ ๋ชจ๋“œ๋กœ ์ „ํ™˜ํ•˜๋Š” ๋„์šฐ๋ฏธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…น์Œ์ด ์ด๋ฃจ์–ด์กŒ๊ณ  ๋‘ ๋ฒˆ์งธ๋กœ js ๋ฒ„์ „์ด ๋ณดํ˜ธ ๋ชจ๋“œ๋กœ ์ „ํ™˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์‹ค Emscripten์˜ ๋˜ ๋‹ค๋ฅธ ํŠน์ง•์€ ๋ช…๋ น ๊ตฌํ˜„๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊บผ๋ฆฐ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. call TCI์—์„œ๋Š” ๋ชจ๋“  ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๊ฐ€ ์œ ํ˜•์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. long long f(int arg0, .. int arg9) - ํ•จ์ˆ˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ์ˆ˜์˜ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•˜๋ฉด ๋””๋ฒ„๊น… ์„ค์ •์— ๋”ฐ๋ผ ํ”„๋กœ๊ทธ๋žจ์ด ์ถฉ๋Œํ•˜๊ฑฐ๋‚˜(์ข‹์€ ๊ฒฐ๊ณผ์ž„) ์ž˜๋ชป๋œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค(๋””๋ฒ„๊น…ํ•˜๊ธฐ์—๋Š” ์•ˆํƒ€๊น์Šต๋‹ˆ๋‹ค). ์„ธ ๋ฒˆ์งธ ์˜ต์…˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€/์ œ๊ฑฐํ•˜๋Š” ๋ž˜ํผ ์ƒ์„ฑ์„ ํ™œ์„ฑํ™”ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” XNUMX๊ฐœ๊ฐ€ ์กฐ๊ธˆ ๋„˜๋Š” ๋ž˜ํผ๋งŒ ํ•„์š”ํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ „์ฒด์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ๋ž˜ํผ๋Š” ๋งŽ์€ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ๋งŒ์œผ๋กœ๋„ ๋งค์šฐ ์Šฌํ”„์ง€๋งŒ ๋” ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ๋ž˜ํผ ํ•จ์ˆ˜์˜ ์ƒ์„ฑ๋œ ์ฝ”๋“œ์—์„œ ์ธ์ˆ˜๊ฐ€ ๋ณ€ํ™˜๋˜๊ณ  ๋ณ€ํ™˜๋˜์—ˆ์ง€๋งŒ ๋•Œ๋กœ๋Š” ์ƒ์„ฑ๋œ ์ธ์ˆ˜๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด libffi ๊ตฌํ˜„. ์ฆ‰, ์ผ๋ถ€ ๋„์šฐ๋ฏธ๋Š” ๋‹จ์ˆœํžˆ ์ฒ˜ํ˜•๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‹คํ–‰ํžˆ Qemu์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ—ค๋” ํŒŒ์ผ ํ˜•ํƒœ๋กœ ๊ธฐ๊ณ„๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋„์šฐ๋ฏธ ๋ชฉ๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค.

DEF_HELPER_0(lock, void)
DEF_HELPER_0(unlock, void)
DEF_HELPER_3(write_eflags, void, env, tl, i32)

๊ทธ๋“ค์€ ๊ฝค ์žฌ๋ฏธ์žˆ๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฒซ์งธ, ๋งคํฌ๋กœ๋Š” ๊ฐ€์žฅ ๊ธฐ๊ดดํ•œ ๋ฐฉ์‹์œผ๋กœ ์žฌ์ •์˜๋ฉ๋‹ˆ๋‹ค. DEF_HELPER_n์„ ๋ˆ„๋ฅธ ๋‹ค์Œ ์ผœ์ง‘๋‹ˆ๋‹ค. helper.h. ๋งคํฌ๋กœ๊ฐ€ ๊ตฌ์กฐ ์ด๋‹ˆ์…œ๋ผ์ด์ €์™€ ์‰ผํ‘œ๋กœ ํ™•์žฅ๋œ ๋‹ค์Œ ๋ฐฐ์—ด์ด ์ •์˜๋˜๊ณ  ์š”์†Œ ๋Œ€์‹  - #include <helper.h> ๊ทธ ๊ฒฐ๊ณผ, ๋“œ๋””์–ด ์ง์žฅ์—์„œ ๋„์„œ๊ด€์„ ์‹œํ—˜ํ•ด ๋ณผ ๊ธฐํšŒ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ํŒŒ์ด ํŒŒ์‹ฑ, ๊ทธ๋ฆฌ๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ํ•ด๋‹น ๋ž˜ํผ์™€ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ƒ์„ฑํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ทธ ์ดํ›„์—๋Š” ํ”„๋กœ์„ธ์„œ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. memtest86+๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ์–ด์…ˆ๋ธ”๋ฆฌ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ™”๋ฉด์ด ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ Qemu ๋ธ”๋ก I/O ์ฝ”๋“œ๊ฐ€ ์ฝ”๋ฃจํ‹ด์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Œ์„ ๋ช…ํ™•ํžˆ ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Emscripten์—๋Š” ๋งค์šฐ ๊นŒ๋‹ค๋กœ์šด ๊ตฌํ˜„์ด ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ Qemu ์ฝ”๋“œ์—์„œ ์ง€์›๋˜์–ด์•ผ ํ•˜๋ฉฐ ์ด์ œ ํ”„๋กœ์„ธ์„œ๋ฅผ ๋””๋ฒ„๊ทธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Qemu๋Š” ์˜ต์…˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. -kernel, -initrd, -append, ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ธ”๋ก ์žฅ์น˜๋ฅผ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  Linux ๋˜๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด memtest86+๋ฅผ ๋ถ€ํŒ…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ์–ด์…ˆ๋ธ”๋ฆฌ์—์„œ๋Š” ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ˜์†”์— ๋Œ€ํ•œ Linux ์ปค๋„ ์ถœ๋ ฅ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -nographic, ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋œ ํ„ฐ๋ฏธ๋„๋กœ์˜ ์ถœ๋ ฅ์€ ์—†์Šต๋‹ˆ๋‹ค. emrun, ์•ˆ ์™”์–ด. ์ฆ‰, ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์„œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ทธ๋ž˜ํ”ฝ ์ถœ๋ ฅ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์กฐ๊ธˆ ๊ธฐ๋‹ค๋ฆฌ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. "ํ”„๋กœ์„ธ์„œ๊ฐ€ ์ž ์ž๊ธฐ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹จ์ˆœํžˆ ์ฒœ์ฒœํžˆ ๊นœ๋ฐ•์ด๋Š” ๊ฒƒ"์ด๋ผ๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ๊ณ  ์•ฝ 2๋ถ„ ํ›„์— ์ปค๋„์€ ์ฝ˜์†”์— ๋งŽ์€ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ๊ณ„์† ์ •์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ์„ธ์„œ๊ฐ€ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด์กŒ์œผ๋ฉฐ SDL0๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ฝ”๋“œ๋ฅผ ์ž์„ธํžˆ ์กฐ์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•ˆํƒ€๊น๊ฒŒ๋„ ์ €๋Š” ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ๊ณณ์—์„œ๋Š” ๋ฌด์ž‘์œ„๋กœ ํ–‰๋™ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋Š ์‹œ์ ์—์„œ ํŒŒ๋ž€์ƒ‰ ๋ฐฐ๊ฒฝ ํ™”๋ฉด์— ํ‰ํ–‰ XNUMX ์„ ์ด ๊นœ๋ฐ•์ด๋ฉด์„œ ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์„ ์•”์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋ฌธ์ œ๋Š” Qemu๊ฐ€ ํ•˜๋‚˜์˜ ๋ฌผ๋ฆฌ์  ์ฐฝ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ€์ƒ ์ฐฝ์„ ์—ด๋ฉฐ Ctrl-Alt-n์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ๋นŒ๋“œ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ Emscripten์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ต์…˜์„ ์ด์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์ฐฝ์„ ์ œ๊ฑฐํ•œ ํ›„ -monitor none -parallel none -serial none ๊ฐ ํ”„๋ ˆ์ž„์—์„œ ์ „์ฒด ํ™”๋ฉด์„ ๊ฐ•์ œ๋กœ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋ผ๋Š” ์ง€์‹œ๊ฐ€ ๊ฐ‘์ž๊ธฐ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋ฃจํ‹ด

๋”ฐ๋ผ์„œ ๋ธŒ๋ผ์šฐ์ €์—์„œ์˜ ์—๋ฎฌ๋ ˆ์ด์…˜์€ ์ž‘๋™ํ•˜์ง€๋งŒ ๋ธ”๋ก I/O๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํฅ๋ฏธ๋กœ์šด ๋‹จ์ผ ํ”Œ๋กœํ”ผ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฝ”๋ฃจํ‹ด์— ๋Œ€ํ•œ ์ง€์›์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Qemu์—๋Š” ์ด๋ฏธ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฝ”๋ฃจํ‹ด ๋ฐฑ์—”๋“œ๊ฐ€ ์žˆ์ง€๋งŒ JavaScript์™€ Emscripten ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ์˜ ํŠน์„ฑ์œผ๋กœ ์ธํ•ด ์Šคํƒ ์ €๊ธ€๋ง์„ ์‹œ์ž‘ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. "๋ชจ๋“  ๊ฒƒ์ด ์‚ฌ๋ผ์ง€๊ณ  ์„๊ณ ๊ฐ€ ์ œ๊ฑฐ๋˜๋Š”" ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ Emscripten ๊ฐœ๋ฐœ์ž๋Š” ์ด๋ฏธ ๋ชจ๋“  ๊ฒƒ์„ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฝค ์žฌ๋ฏธ์žˆ๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜์‹ฌ์Šค๋Ÿฌ์šด ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ˜ธ์ถœํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. emscripten_sleep Asyncify ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์‚ฌ๋ก€์™€ ํฌ์ธํ„ฐ ํ˜ธ์ถœ ๋ฐ ์ด์ „ ๋‘ ์‚ฌ๋ก€ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์Šคํƒ ์•„๋ž˜์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์˜์‹ฌ์Šค๋Ÿฌ์šด ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•˜๊ธฐ ์ „์— ๋น„๋™๊ธฐ ์ปจํ…์ŠคํŠธ๋ฅผ ์„ ํƒํ•˜๊ณ , ํ˜ธ์ถœ ์งํ›„ ๋น„๋™๊ธฐ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ ๋ชจ๋“  ๋กœ์ปฌ ๋ณ€์ˆ˜๋ฅผ ์ด ๋น„๋™๊ธฐ ์ปจํ…์ŠคํŠธ์— ์ €์žฅํ•˜์—ฌ ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ํ‘œ์‹œํ•˜๋Š”์ง€ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์‹คํ–‰์„ ๊ณ„์†ํ•ด์•ผ ํ•  ๋•Œ ์ œ์–ด๊ถŒ์„ ๋„˜๊ธฐ๊ณ  ํ˜„์žฌ ๊ธฐ๋Šฅ์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ํšจ๊ณผ๋ฅผ ์—ฐ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ์ง€๊ฐ€ ์žˆ๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. ๋ง๊ณ  โ€” ๋น„๋™๊ธฐ ํ˜ธ์ถœ์—์„œ ๋ฐ˜ํ™˜๋œ ํ›„ ์ฝ”๋“œ ์‹คํ–‰์„ ๊ณ„์†ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์˜์‹ฌ์Šค๋Ÿฌ์šด ํ˜ธ์ถœ ์ดํ›„์— ์‹œ์ž‘ํ•˜๋Š” ํ•จ์ˆ˜์˜ "์Šคํ…"์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. โ€” ๋‹ค์Œ๊ณผ ๊ฐ™์ด: n ๊ฐœ์˜ ์˜์‹ฌ์Šค๋Ÿฌ์šด ํ˜ธ์ถœ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ•จ์ˆ˜๋Š” n/2 ์–ด๋”˜๊ฐ€์—์„œ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. times โ€” ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ž ์žฌ์ ์œผ๋กœ ๋น„๋™๊ธฐ ํ˜ธ์ถœ์„ ํ•  ๋•Œ๋งˆ๋‹ค ์ผ๋ถ€ ์ง€์—ญ ๋ณ€์ˆ˜ ์ €์žฅ์„ ์›๋ž˜ ํ•จ์ˆ˜์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๋ช…์‹ฌํ•˜์„ธ์š”. ๊ทธ ํ›„, ์ €๋Š” Python์œผ๋กœ ๊ฐ„๋‹จํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” "๋น„๋™๊ธฐ๊ฐ€ ์Šค์Šค๋กœ ํ†ต๊ณผํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”" ๊ฒƒ์œผ๋กœ ์ถ”์ •๋˜๋Š” ํŠนํžˆ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ํŠน์ • ํ•จ์ˆ˜ ์„ธํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค(์ฆ‰, ์Šคํƒ ์Šน๊ฒฉ ๋ฐ ๋ฐฉ๊ธˆ ์„ค๋ช…ํ•œ ๋ชจ๋“  ๊ฒƒ์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ์ž‘์—…)์€ ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๊ฐ€ ๋น„๋™๊ธฐ๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š๋„๋ก ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ํ•จ์ˆ˜๋ฅผ ๋ฌด์‹œํ•ด์•ผ ํ•˜๋Š” ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•œ ํ˜ธ์ถœ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  60MB ๋ฏธ๋งŒ์˜ JS ํŒŒ์ผ์€ ๋ถ„๋ช…ํžˆ ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค. ์ตœ์†Œ 30๊ฐœ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ผ๋‹จ ์–ด์…ˆ๋ธ”๋ฆฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์„ค์ •ํ•˜๊ณ  ์‹ค์ˆ˜๋กœ ๋ง์ปค ์˜ต์…˜์„ ๋ฒ„๋ ธ๋Š”๋ฐ ๊ทธ์ค‘์—๋Š” -O3. ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด Chromium์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋ชจํ•˜๊ณ  ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ์šฐ์—ฐํžˆ ๊ทธ๊ฐ€ ๋‹ค์šด๋กœ๋“œํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜๋Š”๋ฐ... ๊ธ€์Ž„์š”, ์ œ๊ฐ€ 500MB๊ฐ€ ๋„˜๋Š” Javascript๋ฅผ ์‹ ์ค‘ํ•˜๊ฒŒ ์—ฐ๊ตฌํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜๋ผ๋Š” ์š”์ฒญ์„ ๋ฐ›์•˜๋‹ค๋ฉด ์ €๋„ ์–ผ์–ด๋ถ™์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ถˆํ–‰ํ•˜๊ฒŒ๋„ Asyncify ์ง€์› ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ์˜ ๊ฒ€์‚ฌ๋Š” ์™„์ „ํžˆ ์นœ์ˆ™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. longjmp-s๋Š” ๊ฐ€์ƒ ํ”„๋กœ์„ธ์„œ ์ฝ”๋“œ์— ์‚ฌ์šฉ๋˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๊ฒ€์‚ฌ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ๊ดœ์ฐฎ์€ ๊ฒƒ์ฒ˜๋Ÿผ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ•์ œ๋กœ ๋ณต์›ํ•˜๋Š” ์ž‘์€ ํŒจ์น˜ ํ›„์— ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด์ƒํ•œ ์ผ์ด ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ๋™๊ธฐํ™” ์ฝ”๋“œ ๊ฒ€์‚ฌ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‹คํ–‰ ๋…ผ๋ฆฌ์— ๋”ฐ๋ผ ์ฝ”๋“œ๋ฅผ ์ฐจ๋‹จํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ฝ”๋“œ๋ฅผ ์ถฉ๋Œ์‹œํ‚ค๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ฒ€์‚ฌ๊ฐ€ ๋ˆ„๊ตฐ๊ฐ€ ์ด๋ฏธ ์บก์ฒ˜๋œ ๋ฎคํ…์Šค๋ฅผ ์žก์œผ๋ ค๊ณ  ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ ์ด๊ฒƒ์€ ์ง๋ ฌํ™”๋œ ์ฝ”๋“œ์—์„œ ๋…ผ๋ฆฌ์ ์ธ ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋‹จ์ˆœํžˆ Emscripten์—์„œ ์ œ๊ณตํ•˜๋Š” ํ‘œ์ค€ ๋ฉ”์ธ ๋ฃจํ”„ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๋•Œ๋กœ๋Š” ๋น„๋™๊ธฐ ํ˜ธ์ถœ์ด ์Šคํƒ์„ ์™„์ „ํžˆ ํ’€๊ณ  ๊ทธ ์ˆœ๊ฐ„ ์‹คํŒจํ•˜๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค. setTimeout ๋ฉ”์ธ ๋ฃจํ”„์—์„œ - ๋”ฐ๋ผ์„œ ์ฝ”๋“œ๋Š” ์ด์ „ ๋ฐ˜๋ณต์„ ๋– ๋‚˜์ง€ ์•Š๊ณ  ๋ฉ”์ธ ๋ฃจํ”„ ๋ฐ˜๋ณต์— ๋“ค์–ด๊ฐ”์Šต๋‹ˆ๋‹ค. ๋ฌดํ•œ ๋ฃจํ”„์—์„œ ๋‹ค์‹œ ์ž‘์„ฑํ–ˆ์œผ๋ฉฐ emscripten_sleep, ๋ฎคํ…์Šค ๋ฌธ์ œ๊ฐ€ ์ค‘์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ํ›จ์”ฌ ๋” ๋…ผ๋ฆฌ์ ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๋‹ค์Œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ”„๋ ˆ์ž„์„ ์ค€๋น„ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์„œ๋Š” ๋‹จ์ง€ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ํ™”๋ฉด์€ ์ฃผ๊ธฐ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ๋Š” ์—ฌ๊ธฐ์„œ ๋๋‚˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” Qemu ์‹คํ–‰์ด ์˜ˆ์™ธ๋‚˜ ์˜ค๋ฅ˜ ์—†์ด ์ž๋™์œผ๋กœ ์ข…๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ˆœ๊ฐ„ ํฌ๊ธฐํ–ˆ์ง€๋งŒ ์•ž์œผ๋กœ ๋ฌธ์ œ๋Š” ์ด๊ฒƒ์ด์—ˆ๋‹ค๊ณ  ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฝ” ๋ฃจํ‹ด ์ฝ”๋“œ๋Š” ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค setTimeout (๋˜๋Š” ์ ์–ด๋„ ์ƒ๊ฐ๋งŒํผ ์ž์ฃผ๋Š” ์•„๋‹˜): ๊ธฐ๋Šฅ emscripten_yield ๋‹จ์ˆœํžˆ ๋น„๋™๊ธฐ ํ˜ธ์ถœ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์š”์ ์€ emscripten_coroutine_next ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ™•์ธํ•˜๊ณ  ์žฌ์„ค์ •ํ•œ ๋‹ค์Œ ํ•„์š”ํ•œ ๊ณณ์œผ๋กœ ์ œ์–ด๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์Šคํƒ ์Šน๊ฒฉ์ด ๊ฑฐ๊ธฐ์„œ ๋๋‚ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๊ธฐ์กด ์ฝ”๋ฃจํ‹ด ๋ฐฑ์—”๋“œ์—์„œ ์ค‘์š”ํ•œ ์ฝ”๋“œ ๋ผ์ธ์„ ๋ณต์‚ฌํ•˜์ง€ ์•Š์•„ ์ฝ”๋ฃจํ‹ด ํ’€์ด ๋น„ํ™œ์„ฑํ™”๋˜์—ˆ์„ ๋•Œ ๋‚˜ํƒ€๋‚˜๋Š” use-after-free๋กœ ์ธํ•ด ํ•จ์ˆ˜๊ฐ€ qemu_in_coroutine ์‹ค์ œ๋กœ๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์–ด์•ผ ํ•˜๋Š”๋ฐ true๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์ „ํ™”๊ฐ€ ์™”์Šต๋‹ˆ๋‹ค emscripten_yield, ๊ทธ ์œ„์—๋Š” ์Šคํƒ์— ์•„๋ฌด๋„ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. emscripten_coroutine_next, ์Šคํƒ์ด ๋งจ ์œ„๋กœ ํŽผ์ณ์กŒ์ง€๋งŒ setTimeout, ์ด๋ฏธ ๋งํ–ˆ๋“ฏ์ด ์ „์‹œ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

JavaScript ์ฝ”๋“œ ์ƒ์„ฑ

๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ์—ฌ๊ธฐ์—๋Š” "๋‹ค์ง„ ๊ณ ๊ธฐ๋ฅผ ๋˜๋Œ๋ฆฐ๋‹ค"๋Š” ์•ฝ์†์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค๋งˆ. ๋ฌผ๋ก  ๋ธŒ๋ผ์šฐ์ €์—์„œ Qemu๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ทธ ์•ˆ์—์„œ Node.js๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹น์—ฐํžˆ Qemu์—์„œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ์™„์ „ํžˆ ์ž˜๋ชป๋œ JavaScript๋ฅผ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ์ผ์ข…์˜ ์—ญ๋ณ€ํ™˜์ž…๋‹ˆ๋‹ค.

๋จผ์ € Qemu์˜ ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰์‹œ ์–‘ํ•ดํ•ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ €๋Š” ์ „๋ฌธ์ ์ธ Qemu ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์–ด๋–ค ๊ณณ์—์„œ๋Š” ์ œ ๊ฒฐ๋ก ์ด ํ‹€๋ฆด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. โ€œํ•™์ƒ์˜ ์˜๊ฒฌ์ด ๋ฐ˜๋“œ์‹œ ์„ ์ƒ๋‹˜์˜ ์˜๊ฒฌ, ํŽ˜์•„๋…ธ์˜ ๊ณต๋ฆฌ, ์ƒ์‹๊ณผ ์ผ์น˜ํ•  ํ•„์š”๋Š” ์—†๋‹คโ€๋Š” ๋ง์ด ์žˆ๋‹ค. Qemu์—๋Š” ์ง€์›๋˜๋Š” ํŠน์ • ์ˆ˜์˜ ๊ฒŒ์ŠคํŠธ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ฐ ์•„ํ‚คํ…์ฒ˜๋งˆ๋‹ค ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. target-i386. ๋นŒ๋“œํ•  ๋•Œ ์—ฌ๋Ÿฌ ๊ฒŒ์ŠคํŠธ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ์ง€์›์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” ์—ฌ๋Ÿฌ ๋ฐ”์ด๋„ˆ๋ฆฌ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ฒŒ์ŠคํŠธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ง€์›ํ•˜๋Š” ์ฝ”๋“œ๋Š” ์ฐจ๋ก€๋กœ ์ผ๋ถ€ ๋‚ด๋ถ€ Qemu ์ž‘์—…์„ ์ƒ์„ฑํ•˜๋ฉฐ, TCG(Tiny Code Generator)๋Š” ์ด๋ฏธ ํ˜ธ์ŠคํŠธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์œ„ํ•œ ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. tcg ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” readme ํŒŒ์ผ์— ๋ช…์‹œ๋œ ๋Œ€๋กœ ์ด๋Š” ์›๋ž˜ ์ผ๋ฐ˜ C ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ผ๋ถ€์˜€์œผ๋ฉฐ ๋‚˜์ค‘์— JIT์— ๋งž๊ฒŒ ์กฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ˆ๋ฅผ ๋“ค์–ด ์ด ๋ฌธ์„œ์˜ ๋Œ€์ƒ ์•„ํ‚คํ…์ฒ˜๋Š” ๋” ์ด์ƒ ๊ฒŒ์ŠคํŠธ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์•„๋‹ˆ๋ผ ํ˜ธ์ŠคํŠธ ์•„ํ‚คํ…์ฒ˜์ž…๋‹ˆ๋‹ค. ์–ด๋Š ์‹œ์ ์—์„œ ํŠน์ • ํ˜ธ์ŠคํŠธ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๊ฐ€ ์—†์„ ๋•Œ ์ฝ”๋“œ(๊ฑฐ์˜ ๋™์ผํ•œ ๋‚ด๋ถ€ ์ž‘์—…)๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” TCI(Tiny Code Interpreter)๋ผ๋Š” ๋˜ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋ฌธ์„œ์— ๋ช…์‹œ๋˜์–ด ์žˆ๋“ฏ์ด ์ด ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” ์†๋„ ์ธก๋ฉด์—์„œ ์ •๋Ÿ‰์ ์œผ๋กœ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์งˆ์ ์œผ๋กœ๋„ ํ•ญ์ƒ JIT ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๋งŒํผ ์„ฑ๋Šฅ์„ โ€‹โ€‹๋ฐœํœ˜ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ์˜ ์„ค๋ช…์ด ์™„์ „ํžˆ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ์™„์ „ํ•œ TCG ๋ฐฑ์—”๋“œ๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ์†Œ์Šค ์ฝ”๋“œ์™€ ๋ฐ”์ดํŠธ์ฝ”๋“œ ๋ช…๋ น์— ๋Œ€ํ•œ ์™„์ „ํžˆ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ์„ค๋ช…์—์„œ ๊ธˆ๋ฐฉ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์ ธ์„œ TCI ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ๋ž˜ํ•‘ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ์ด์ ์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋ช…๋ น์–ด ์„ค๋ช…์ด ์•„๋‹Œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์ฝ”๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐœ์ƒํ•œ ๋ชจ๋“  ๋ฒˆ์—ญ ๋ธ”๋ก์— ๋Œ€ํ•ด ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ, ์˜ˆ๋ฅผ ๋“ค์–ด XNUMX๋ฒˆ์งธ ์‹คํ–‰ ํ›„์—๋งŒ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒ์„ฑ๋œ ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด(๊ทธ๋ฆฌ๊ณ  ์ด๋ฆ„์— patch๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ํฌํ•จ๋œ ํ•จ์ˆ˜๋กœ ํŒ๋‹จํ•˜๋ฉด ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค) ์ƒ์„ฑ๋œ JS ์ฝ”๋“œ๋ฅผ ๋ฌดํšจํ™”ํ•ด์•ผ ํ•˜์ง€๋งŒ ์ ์–ด๋„ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌด์–ธ๊ฐ€๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์„ธ ๋ฒˆ์งธ ์‚ฌํ•ญ์— ๋Œ€ํ•ด์„œ๋Š” ์ฝ”๋“œ๋ฅผ ์ฒ˜์Œ ์‹คํ–‰ํ•œ ํ›„์— ํŒจ์น˜๊ฐ€ ๊ฐ€๋Šฅํ•œ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ฒ˜์Œ ๋‘ ๊ฐ€์ง€ ์‚ฌํ•ญ์ด๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ์›๋ž˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ์— ํฐ ์Šค์œ„์น˜ ํ˜•ํƒœ๋กœ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์ง€๋งŒ, ์ดํ›„ Emscripten, ์ƒ์„ฑ๋œ JS์˜ ์ตœ์ ํ™” ๋ฐ ์žฌ๋ฃจํ•‘์— ๋Œ€ํ•œ ๊ธฐ์‚ฌ๋ฅผ ๊ธฐ์–ตํ•˜๋ฉด์„œ ํŠนํžˆ ๊ฒฝํ—˜์ ์œผ๋กœ๋Š” ๋” ๋งŽ์€ ํœด๋จผ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฒˆ์—ญ ๋ธ”๋ก์˜ ์œ ์ผํ•œ ์ง„์ž…์ ์€ ์‹œ์ž‘์ ์ด๋ผ๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ๋งํ•˜์ž๋งˆ์ž ์‹คํ–‰๋œ ๊ฒƒ์€ ์–ผ๋งˆ ํ›„ ์šฐ๋ฆฌ๋Š” ifs๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๋ฅผ ๊ฐ–๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(๋ฃจํ”„๋Š” ์—†์—ˆ์ง€๋งŒ). ๊ทธ๋Ÿฌ๋‚˜ ๋ถˆ์šดํ•˜๊ฒŒ๋„ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜์—ฌ ์ง€์นจ์˜ ๊ธธ์ด๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์ด ์žฌ๊ท€ ์ˆ˜์ค€์˜ ๋งˆ์ง€๋ง‰ ๋ช…๋ น์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. brcond. ์ข‹์•„, ์žฌ๊ท€ ํ˜ธ์ถœ ์ „ํ›„์— ์ด ๋ช…๋ น์–ด ์ƒ์„ฑ์— ๋™์ผํ•œ ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ํ•˜๋‚˜๋„ ์‹คํ–‰๋˜์ง€ ์•Š์•˜์ง€๋งŒ ์–ด์„ค์…˜ ์Šค์œ„์น˜ ํ›„์—๋„ ์—ฌ์ „ํžˆ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์—ฐ๊ตฌํ•œ ํ›„ ์ „ํ™˜ ํ›„ ํ˜„์žฌ ๋ช…๋ น์–ด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๊ฐ€ ์Šคํƒ์—์„œ ๋‹ค์‹œ ๋กœ๋“œ๋˜๊ณ  ์ƒ์„ฑ๋œ JavaScript ์ฝ”๋“œ๊ฐ€ ๋ฎ์–ด์“ฐ๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์€ ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํผ๋ฅผ XNUMXMB์—์„œ XNUMXMB๋กœ ๋Š˜๋ ค๋„ ์•„๋ฌด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๊ฐ€ ์›ํ˜•์œผ๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ์Œ์ด ๋ถ„๋ช…ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ TB์˜ ๊ฒฝ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ–ˆ๊ณ , ๊ทธ๋ ‡๋‹ค๋ฉด ์‹คํ–‰์„ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์Œ TB์˜ ์ฃผ์†Œ์— ๋นผ๊ธฐ ๊ธฐํ˜ธ๋ฅผ ๋ถ™์—ฌ ๋ฐœ๊ธ‰ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋Š” "์ด ๋ฐ”์ดํŠธ์ฝ”๋“œ ์กฐ๊ฐ์ด ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ ์ƒ์„ฑ๋œ ํ•จ์ˆ˜๊ฐ€ ๋ฌดํšจํ™”๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€?"๋ผ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. โ€” ์ด ๋ฒˆ์—ญ ๋ธ”๋ก์— ํ•ด๋‹นํ•˜๋Š” ๊ธฐ๋Šฅ๋งŒ ๋ฌดํšจํ™”ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , Chromium์—์„œ ๋ชจ๋“  ๊ฒƒ์„ ๋””๋ฒ„๊น…ํ–ˆ์ง€๋งŒ(์ €๋Š” Firefox๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹คํ—˜์„ ์œ„ํ•ด ๋ณ„๋„์˜ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์—) Firefox๋Š” asm.js ํ‘œ์ค€๊ณผ์˜ ๋น„ํ˜ธํ™˜์„ฑ์„ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํฌ๋กฌ.

์ƒ์„ฑ๋œ ์ฝ”๋“œ์˜ ์˜ˆ

Compiling 0x15b46d0:
CompiledTB[0x015b46d0] = function(stdlib, ffi, heap) {
"use asm";
var HEAP8 = new stdlib.Int8Array(heap);
var HEAP16 = new stdlib.Int16Array(heap);
var HEAP32 = new stdlib.Int32Array(heap);
var HEAPU8 = new stdlib.Uint8Array(heap);
var HEAPU16 = new stdlib.Uint16Array(heap);
var HEAPU32 = new stdlib.Uint32Array(heap);

var dynCall_iiiiiiiiiii = ffi.dynCall_iiiiiiiiiii;
var getTempRet0 = ffi.getTempRet0;
var badAlignment = ffi.badAlignment;
var _i64Add = ffi._i64Add;
var _i64Subtract = ffi._i64Subtract;
var Math_imul = ffi.Math_imul;
var _mul_unsigned_long_long = ffi._mul_unsigned_long_long;
var execute_if_compiled = ffi.execute_if_compiled;
var getThrew = ffi.getThrew;
var abort = ffi.abort;
var qemu_ld_ub = ffi.qemu_ld_ub;
var qemu_ld_leuw = ffi.qemu_ld_leuw;
var qemu_ld_leul = ffi.qemu_ld_leul;
var qemu_ld_beuw = ffi.qemu_ld_beuw;
var qemu_ld_beul = ffi.qemu_ld_beul;
var qemu_ld_beq = ffi.qemu_ld_beq;
var qemu_ld_leq = ffi.qemu_ld_leq;
var qemu_st_b = ffi.qemu_st_b;
var qemu_st_lew = ffi.qemu_st_lew;
var qemu_st_lel = ffi.qemu_st_lel;
var qemu_st_bew = ffi.qemu_st_bew;
var qemu_st_bel = ffi.qemu_st_bel;
var qemu_st_leq = ffi.qemu_st_leq;
var qemu_st_beq = ffi.qemu_st_beq;

function tb_fun(tb_ptr, env, sp_value, depth) {
  tb_ptr = tb_ptr|0;
  env = env|0;
  sp_value = sp_value|0;
  depth = depth|0;
  var u0 = 0, u1 = 0, u2 = 0, u3 = 0, result = 0;
  var r0 = 0, r1 = 0, r2 = 0, r3 = 0, r4 = 0, r5 = 0, r6 = 0, r7 = 0, r8 = 0, r9 = 0;
  var r10 = 0, r11 = 0, r12 = 0, r13 = 0, r14 = 0, r15 = 0, r16 = 0, r17 = 0, r18 = 0, r19 = 0;
  var r20 = 0, r21 = 0, r22 = 0, r23 = 0, r24 = 0, r25 = 0, r26 = 0, r27 = 0, r28 = 0, r29 = 0;
  var r30 = 0, r31 = 0, r41 = 0, r42 = 0, r43 = 0, r44 = 0;
    r14 = env|0;
    r15 = sp_value|0;
  START: do {
    r0 = HEAPU32[((r14 + (-4))|0) >> 2] | 0;
    r42 = 0;
    result = ((r0|0) != (r42|0))|0;
    HEAPU32[1445307] = r0;
    HEAPU32[1445321] = r14;
    if(result|0) {
    HEAPU32[1445322] = r15;
    return 0x0345bf93|0;
    }
    r0 = HEAPU32[((r14 + (16))|0) >> 2] | 0;
    r42 = 8;
    r0 = ((r0|0) - (r42|0))|0;
    HEAPU32[(r14 + (16)) >> 2] = r0;
    r1 = 8;
    HEAPU32[(r14 + (44)) >> 2] = r1;
    r1 = r0|0;
    HEAPU32[(r14 + (40)) >> 2] = r1;
    r42 = 4;
    r0 = ((r0|0) + (r42|0))|0;
    r2 = HEAPU32[((r14 + (24))|0) >> 2] | 0;
    HEAPU32[1445307] = r0;
    HEAPU32[1445308] = r1;
    HEAPU32[1445309] = r2;
    HEAPU32[1445321] = r14;
    HEAPU32[1445322] = r15;
    qemu_st_lel(env|0, r0|0, r2|0, 34, 22759218);
if(getThrew() | 0) abort();
    r0 = 3241038392;
    HEAPU32[1445307] = r0;
    r0 = qemu_ld_leul(env|0, r0|0, 34, 22759233)|0;
if(getThrew() | 0) abort();
    HEAPU32[(r14 + (24)) >> 2] = r0;
    r1 = HEAPU32[((r14 + (12))|0) >> 2] | 0;
    r2 = HEAPU32[((r14 + (40))|0) >> 2] | 0;
    HEAPU32[1445307] = r0;
    HEAPU32[1445308] = r1;
    HEAPU32[1445309] = r2;
    qemu_st_lel(env|0, r2|0, r1|0, 34, 22759265);
if(getThrew() | 0) abort();
    r0 = HEAPU32[((r14 + (24))|0) >> 2] | 0;
    HEAPU32[(r14 + (40)) >> 2] = r0;
    r1 = 24;
    HEAPU32[(r14 + (52)) >> 2] = r1;
    r42 = 0;
    result = ((r0|0) == (r42|0))|0;
    if(result|0) {
    HEAPU32[1445307] = r0;
    HEAPU32[1445308] = r1;
    }
    HEAPU32[1445307] = r0;
    HEAPU32[1445308] = r1;
    return execute_if_compiled(22759392|0, env|0, sp_value|0, depth|0) | 0;
    return execute_if_compiled(23164080|0, env|0, sp_value|0, depth|0) | 0;
    break;
  } while(1); abort(); return 0|0;
}
return {tb_fun: tb_fun};
}(window, CompilerFFI, Module.buffer)["tb_fun"]

๊ฒฐ๋ก 

๊ทธ๋ž˜์„œ ์•„์ง ๊ณต์‚ฌ๊ฐ€ ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํƒœ์ธ๋ฐ, ์ด ์žฅ๊ธฐ ๊ณต์‚ฌ๋ฅผ ๋น„๋ฐ€๋ฆฌ์— ์™„๋ฒฝํ•˜๊ฒŒ ๋งˆ๋ฌด๋ฆฌํ•˜๋Š” ๋ฐ ์ง€์ณค์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์ง€๊ธˆ ๋‚ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์ถœํŒํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ์‹คํ—˜์ด๊ณ  ๋ฌด์—‡์„ ํ•ด์•ผ ํ• ์ง€ ๋ฏธ๋ฆฌ ๋ช…ํ™•ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„ ๋ฌด์„œ์šด ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ตœ์‹  ๋ฒ„์ „์˜ Qemu ์œ„์— ์ผ๋ฐ˜์ ์ธ ์›์ž ์ปค๋ฐ‹์„ ๋ฐœํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋™์•ˆ Gita์—๋Š” ๋ธ”๋กœ๊ทธ ํ˜•์‹์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ์–ด๋Š ์ •๋„ ํ†ต๊ณผํ•œ ๊ฐ "๋ ˆ๋ฒจ"์— ๋Œ€ํ•ด ๋Ÿฌ์‹œ์•„์–ด๋กœ ๋œ ์ž์„ธํ•œ ์„ค๋ช…์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ด ๊ธ€์€ ๊ฒฐ๋ก ์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋งํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. git log.

๋ชจ๋‘ ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— (๊ตํ†ต์— ์ฃผ์˜ํ•˜์„ธ์š”).

์ด๋ฏธ ์ž‘๋™ ์ค‘์ธ ๊ฒƒ:

  • x86 ๊ฐ€์ƒ ํ”„๋กœ์„ธ์„œ ์‹คํ–‰ ์ค‘
  • ๊ธฐ๊ณ„ ์ฝ”๋“œ์—์„œ JavaScript๊นŒ์ง€ JIT ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ์˜ ์ž‘์—… ํ”„๋กœํ† ํƒ€์ž…์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ 32๋น„ํŠธ ๊ฒŒ์ŠคํŠธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์กฐํ•ฉํ•˜๊ธฐ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋‹น์žฅ ๋กœ๋”ฉ ๋‹จ๊ณ„์—์„œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ •์ง€๋˜๋Š” MIPS ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•ด Linux๋ฅผ ๊ฐ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ˆ๋Š” ์–ด๋–ค ๋‹ค๋ฅธ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋‹ˆ

  • ์—๋ฎฌ๋ ˆ์ด์…˜ ์†๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค. JIT ๋ชจ๋“œ์—์„œ๋„ Virtual x86๋ณด๋‹ค ๋Š๋ฆฌ๊ฒŒ ์‹คํ–‰๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ์—๋ฎฌ๋ ˆ์ดํŠธ๋œ ํ•˜๋“œ์›จ์–ด์™€ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๋งŽ์€ ์ „์ฒด Qemu๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).
  • ์ผ๋ฐ˜์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด - ์†”์งํžˆ ์ €๋Š” ํ›Œ๋ฅญํ•œ ์›น ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ์€ ์ตœ์„ ์„ ๋‹คํ•ด ํ‘œ์ค€ Emscripten ์‰˜์„ ๋‹ค์‹œ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋„คํŠธ์›Œํ‚น, VM ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋“ฑ ๋” ๋ณต์žกํ•œ Qemu ๊ธฐ๋Šฅ์„ ์‹œ์ž‘ํ•ด ๋ณด์„ธ์š”.
  • UPD : Qemu ๋ฐ ๊ธฐํƒ€ ํ”„๋กœ์ ํŠธ์˜ ์ด์ „ ํฌํ„ฐ๋“ค์ด ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ๋ช‡ ๊ฐ€์ง€ ๊ฐœ๋ฐœ ๋ฐ ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ๋ฅผ Emscripten ์—…์ŠคํŠธ๋ฆผ์— ์ œ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ž‘์—…์˜ ์ผ๋ถ€๋กœ Emscripten์— ๋Œ€ํ•œ ๊ทธ๋“ค์˜ ๊ธฐ์—ฌ๋ฅผ ์•”์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€ ๊ทธ๋“ค์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

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