๋ช ๋
์ Fabrice Bellard
- ์คํ ์์ค
- ์ปค๋ ๋๋ผ์ด๋ฒ ์์ด ์์ ํ๋ ๋ฅ๋ ฅ
- ํต์ญ์ฌ ๋ชจ๋์์ ์์ ํ๋ ๋ฅ๋ ฅ
- ๋ค์์ ํธ์คํธ ๋ฐ ๊ฒ์คํธ ์ํคํ ์ฒ ์ง์
์ธ ๋ฒ์งธ ์์ ๊ณผ ๊ด๋ จํ์ฌ ์ด์ ์ค์ ๋ก TCI ๋ชจ๋์์๋ ๊ฒ์คํธ ๊ธฐ๊ณ ๋ช ๋ น์ด ์์ฒด๊ฐ ํด์๋๋ ๊ฒ์ด ์๋๋ผ ์ฌ๊ธฐ์์ ์ป์ ๋ฐ์ดํธ์ฝ๋๊ฐ ํด์๋์ง๋ง ์ด๊ฒ์ด ๋น๋ํ๊ณ ์คํํ๊ธฐ ์ํด ๋ณธ์ง์ ๋ฐ๊พธ์ง๋ ์๋๋ค๋ ์ ์ ์ค๋ช ํ ์ ์์ต๋๋ค. ์๋ก์ด ์ํคํ ์ฒ์ Qemu, ์ด์ด ์ข๋ค๋ฉด C ์ปดํ์ผ๋ฌ๋ก ์ถฉ๋ถํฉ๋๋ค. ์ฝ๋ ์์ฑ๊ธฐ ์์ฑ์ ์ฐ๊ธฐํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด์ XNUMX๋ ๋์ ์ฌ๊ฐ ์๊ฐ์ Qemu ์์ค ์ฝ๋๋ฅผ ์ฌ์ ๋กญ๊ฒ ๋ง์ง์๊ฑฐ๋ฆฐ ๋์ Kolibri OS์ ๊ฐ์ด ์ด๋ฏธ ์คํํ ์ ์๋ ์์ ํ๋กํ ํ์ ์ด ๋ํ๋ฌ์ต๋๋ค.
์ ์คํฌ๋ฆฝํธ๋ ๋ฌด์์ธ๊ฐ์?
์์ฆ์๋ ๋ง์ ์ปดํ์ผ๋ฌ๊ฐ ๋ฑ์ฅํ์ผ๋ฉฐ ๊ทธ ์ต์ข
๊ฒฐ๊ณผ๋ JavaScript์
๋๋ค. Type Script์ ๊ฐ์ ์ผ๋ถ๋ ์๋ ์น์ฉ์ผ๋ก ์์ฑํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ผ๋ก ๊ณ ์๋์์ต๋๋ค. ๋์์ Emscripten์ ๊ธฐ์กด C ๋๋ C++ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ ๋ธ๋ผ์ฐ์ ์์ ์ฝ์ ์ ์๋ ํ์์ผ๋ก ์ปดํ์ผํ๋ ๋ฐฉ๋ฒ์
๋๋ค. ~์
๋จผ์ ์๋ํด๋ณด์ญ์์ค.
์ผ๋ฐ์ ์ผ๋ก Qemu๋ฅผ JavaScript๋ก ํฌํ
ํ๋ค๋ ์์ด๋์ด๋ฅผ ์ฒ์์ผ๋ก ์๊ฐํด๋ธ ์ฌ๋์ ์ ๊ฐ ์๋๋๋ค. Emscripten์ ์ฌ์ฉํ์ฌ ์ด๊ฒ์ด ๊ฐ๋ฅํ์ง ReactOS ํฌ๋ผ์ ์ง๋ฌธ์ด ์์์ต๋๋ค. ์ด์ ์๋ Fabrice Bellard๊ฐ ์ด ์์
์ ์ง์ ์ํํ๋ค๋ ์๋ฌธ์ด ์์์ง๋ง ์ฐ๋ฆฌ๋ jslinux์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์์ต๋๋ค. ์ ๊ฐ ์๋ ํ JS์์ ์๋์ผ๋ก ์ถฉ๋ถํ ์ฑ๋ฅ์ ์ป์ผ๋ ค๋ ์๋์ผ ๋ฟ์ด๋ฉฐ ์ฒ์๋ถํฐ ์์ฑ๋์์ต๋๋ค. ๋์ค์ Virtual x86์ด ์์ฑ๋์์ต๋๋ค. ์ด์ ๋ํ ๋๋
ํ๋์ง ์์ ์์ค๊ฐ ๊ฒ์๋์์ผ๋ฉฐ, ์ธ๊ธํ ๋๋ก ์๋ฎฌ๋ ์ด์
์ ๋ ํฐ "ํ์ค์ฑ"์ผ๋ก ์ธํด SeaBIOS๋ฅผ ํ์จ์ด๋ก ์ฌ์ฉํ ์ ์๊ฒ ๋์์ต๋๋ค. ๋ํ Emscripten์ ์ฌ์ฉํ์ฌ Qemu๋ฅผ ํฌํ
ํ๋ ค๋ ์๋๊ฐ ์ ์ด๋ ํ ๋ฒ ์์์ต๋๋ค.
๋ฐ๋ผ์ ์ฌ๊ธฐ์ ์์ค๊ฐ ์๊ณ ์ฌ๊ธฐ์ Emscripten์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ฐ์ ธ์์ ์ปดํ์ผํ์ธ์. ๊ทธ๋ฌ๋ Qemu๊ฐ ์์กดํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์กดํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ๋ ์์ผ๋ฉฐ ๊ทธ ์ค ํ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฒ์์๋ ๋จ์ํ 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 ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ ์ฌ๋ฌ ๊ฐ์ง ์ฌ๋ก์ ํฌ์ธํฐ ํธ์ถ ๋ฐ ์ด์ ๋ ์ฌ๋ก ์ค ํ๋๊ฐ ์คํ ์๋์์ ๋ฐ์ํ ์ ์๋ ํจ์์ ๋ํ ํธ์ถ์ ํฌํจํฉ๋๋ค. ์ด์ ์์ฌ์ค๋ฌ์ด ํธ์ถ์ด ๋ฐ์ํ๊ธฐ ์ ์ ๋น๋๊ธฐ ์ปจํ
์คํธ๋ฅผ ์ ํํ๊ณ , ํธ์ถ ์งํ ๋น๋๊ธฐ ํธ์ถ์ด ๋ฐ์ํ๋์ง ํ์ธํ๊ณ , ๋ฐ์ํ ๊ฒฝ์ฐ ๋ชจ๋ ๋ก์ปฌ ๋ณ์๋ฅผ ์ด ๋น๋๊ธฐ ์ปจํ
์คํธ์ ์ ์ฅํ์ฌ ์ด๋ค ํจ์๋ฅผ ํ์ํ๋์ง ๋ํ๋
๋๋ค. ์คํ์ ๊ณ์ํด์ผ ํ ๋ ์ ์ด๊ถ์ ๋๊ธฐ๊ณ ํ์ฌ ๊ธฐ๋ฅ์ ์ข
๋ฃํฉ๋๋ค. ํจ๊ณผ๋ฅผ ์ฐ๊ตฌํ ์ ์๋ ์ฌ์ง๊ฐ ์๋ ๊ณณ์
๋๋ค. -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