์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

 

As a devoted reader of Journalist GGUMTEUL, in order to change the system into Linux operating system, I just followed instruction that he wrote in his blog.

Actually, I've recently been learning "System programming" , hoping to get rid of windows system, however, it really sucks to surf on the internet without Internet explore. Thus I just set up Linux through Virtual box which enable for two Operating system to be on one computer by virtualizing.

For more information, I suggest you refer http://noneway.tistory.com which contains the detail of how to set up UBUNTU on a computer.

 

 

๊ฟˆํ‹€๊ฟˆํ‹€๋‹˜์˜ ์• ๋…์ž๋กœ์„œ, ๊ทธ๋ถ„๊ป˜์„œ ์ฃผ์ฐฝํ•˜์‹œ๋Š” "๋ฆฌ๋ˆ…์Šค๋กœ์˜ ์ „ํ™˜"์„ ๋ชธ์†Œ ์‹ค์ฒœํ•˜๊ณ ์ž, ์ฐจ๋งˆ ์œˆ๋„์šฐ์ฆˆ๋ฅผ ์ง€์šฐ์ง„ ๋ชปํ•˜๊ณ  ํฌ์ŠคํŒ…๋Œ€๋กœ ์ฐจ๊ทผ์ฐจ๊ทผ ๋”ฐ๋ผ ์„ค์น˜ํ•˜์—ฌ

'๋ฐ˜์ชฝ' ๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์—ˆ๋‹ค.

์‚ฌ์‹ค ํ•™๊ต์—์„œ ์‹œ์Šคํ…œํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ฐฐ์šฐ๊ณ  ์žˆ๋Š”์ง€๋ผ, ์ปดํ“จํ„ฐ๋ฅผ ๋‚ ๋ ค๋ฒ„๋ฆฌ๊ณ  ๋ฆฌ๋ˆ…์Šค๋ฅผ ์„ค์น˜ํ• ๋ ค๊ณ  ํ–ˆ์œผ๋‚˜, ์ •๋ง์ด์ง€ ํ•œ๊ตญ์ธํ„ฐ๋„ท ์‚ฌ์ดํŠธ๋Š” ์ธํ„ฐ๋„ท์ต์Šคํ”Œ๋กœ์–ด์˜ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€ํ”ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— VirtualBox๋ฅผ ์„ค์น˜ํ•˜์—ฌ ๊ทธ ์œ„์— ์„ค์น˜ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์ž์„ธํ•œ ์„ค๋ช…์€ http://noneway.tistory.com/์— ์žˆ๋Š” ์šฐ๋ถ„ํˆฌ์„ค์น˜ ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹œ๊ธฐ ๋ฐ”๋ž€๋‹ค.

 

๋ฐ˜์‘ํ˜•

์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

์ถœ์ฒ˜ : http://july.tistory.com

ใ€ƒ์• ๋“œ์„ผ์Šค ํ‹ฐ์Šคํ† ๋ฆฌ ๋ณธ๋ฌธ์— ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ• (์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ˜•์‹) ๋””์ŸŒ_๋””์ž์ธTip 2008/01/18 15:59

์‚ฌ์šฉ์ž ์‚ฝ์ž… ์ด๋ฏธ์ง€

์œ„์™€ ๊ฐ™์ด -
์• ๋“œ์„ผ์Šค ํด๋ฆญ์œจ์„ ๋†’์ด๋Š” ์ฃผ์š”ํ•œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๊ฐ€ ์• ๋“œ์„ผ์Šค๋ฅผ ๋ณธ๋ฌธ ์ƒ๋‹จ์˜ค๋ฅธ์ชฝ์— ์‚ฝ์ž…(300x250 ์ค‘๊ฐ„ ์ง์‚ฌ๊ฐํ˜• ๋ฐ•์Šค๋ฅผ ๋ณธ๋ฌธ์— ์‚ฝ์ž…)ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค
์ด ์• ๋“œ์„ผ์Šค๊ฐ€ ๋ณธ๋ฌธ์ด๋‚˜ ๋ธ”๋กœ๊ทธ์˜ ์ „์ฒด ๋””์ž์ธ๊ณผ ํ†ต์ผ์„ฑ ์žˆ๊ฒŒ ๊ฐ€์ค€๋‹ค๋ฉด
๋”์šฑ ๋ถ€๋‹ด ์—†๋Š” ๊ด‘๊ณ ํ˜•ํƒœ๋กœ์จ์˜ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ์„ ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค - ^^
ํ‹ฐ์Šคํ† ๋ฆฌ ๋ณธ๋ฌธ์— ๋„ฃ๋Š” ๋ฐฉ๋ฒ•์ค‘ํ•˜๋‚˜๊ฐ€ ๋ ˆ์ด์–ด๋ฅผ ์ด์šฉํ•˜๋Š”๊ฒƒ์ž…๋‹ˆ๋‹ค .
์•„๋ž˜์˜ ์†Œ์Šค๋ฅผ ๋ณต์‚ฌํ•˜์…”์„œ ๋ณธ์ธ์˜ ๋ธ”๋กœ๊ทธ์— ๋งž๊ฒŒ ์ƒ‰์ƒ ์ˆ˜์ •ํ•˜์…”์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์„ธ์š” ~
1. - ๋ ˆ์ด์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ํ‹ฐ์Šคํ† ๋ฆฌ ๋ณธ๋ฌธ์— ์• ๋“œ์„ผ์Šค ์‚ฝ์ž…ํ•˜๊ธฐ
<div style="width:250px;float:right;border:1px soild; background:#FFFFFF;margin-bottom:10px;"> ์ด๋ถ€๋ถ„์— ๊ตฌ๊ธ€์• ๋“œ์„ผ์Šค ๊ด‘๊ณ  ์ฝ”๋“œ ๋„ฃ์–ด์ฃผ์„ธ์š”</div>

์ด์†Œ์Šค๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ํ‹ฐ์Šคํ† ๋ฆฌ ์Šคํ‚จํŽธ์ง‘์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.
skin.html ์†Œ์Šค์ค‘์— <##_article_rep_desc_##> ์ด๋ถ€๋ถ„์„ ์ฐพ์•„
์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค
<div class="article"> ์ด ๋ถ€๋ถ„์— ์ฝ”๋“œ๋ฅผ ๋ถ™ํ˜€๋„ฃ์–ด์ฃผ์„ธ์š” - <p><##_article_rep_desc_##></p>
2. - ํ…Œ์ด๋ธ”์„ ์ด์šฉํ•˜์—ฌ ํ‹ฐ์Šคํ† ๋ฆฌ ๋ณธ๋ฌธ์— ์• ๋“œ์„ผ์Šค ์‚ฝ์ž…ํ•˜๊ธฐ

ex 01> ์• ๋“œ์„ผ์Šค๋ฅผ ๋ฐ•์Šค์•ˆ์— ๋„ฃ๋Š” ์ฝ”๋“œ

์‚ฌ์šฉ์ž ์‚ฝ์ž… ์ด๋ฏธ์ง€

<table width="300" height="250" border="3" align="right" cellpadding="10" cellspacing="0" bordercolor="#DBDBDB"> <tr> <td valign="top" style='padding-top:0px; padding-left:2px;'> ์ด๋ถ€๋ถ„์— ๊ตฌ๊ธ€์• ๋“œ์„ผ์Šค ๊ด‘๊ณ  ์ฝ”๋“œ ๋„ฃ์–ด์ฃผ์„ธ์š” </td> </tr> </table>
ex02> ๋‘์ค„ ํ…Œ์ด๋ธ” ์•ˆ์— ๋„ฃ๋Š” ์ฝ”๋“œ

์‚ฌ์šฉ์ž ์‚ฝ์ž… ์ด๋ฏธ์ง€


<table width="300" height="250" border="3" align="right" cellpadding="10" cellspacing="3" bordercolor="#DBDBDB"> <tr> <td valign="top" style='padding-top:0px; padding-left:2px;'> ์ด๋ถ€๋ถ„์— ๊ตฌ๊ธ€์• ๋“œ์„ผ์Šค ๊ด‘๊ณ  ์ฝ”๋“œ ๋„ฃ์–ด์ฃผ์„ธ์š” </td> </tr> </table>
ex03> ํ…Œ์ด๋ธ” ์œ„์•„๋ž˜๋งŒ ์ƒ‰์ƒ ๋„ฃ๋Š” ์ฝ”๋“œ

์‚ฌ์šฉ์ž ์‚ฝ์ž… ์ด๋ฏธ์ง€

<table width="300" height="250" border="0" align="right" cellpadding="0" cellspacing="0" style="border-top:2px solid #df8aa8;border-bottom:1px solid #df8aa8;"> <tr> <td valign="top" style='padding-top:0px; padding-left:2px;'> ์ด๋ถ€๋ถ„์— ๊ตฌ๊ธ€์• ๋“œ์„ผ์Šค ๊ด‘๊ณ  ์ฝ”๋“œ ๋„ฃ์–ด์ฃผ์„ธ์š” </td> </tr> </table>
์œ„์—์„ ์€  2px ์•„๋ž˜์„ ์€ 1px  ์„ ์คฌ์–ด์š”
ex04> ํ…Œ์ด๋ธ” ์–‘์˜†์— ๋งŒ ์ƒ‰์ƒ ๋„ฃ๋Š” ์ฝ”๋“œ

์‚ฌ์šฉ์ž ์‚ฝ์ž… ์ด๋ฏธ์ง€

<table width="300" height="250" border="0" align="right" cellpadding="0" cellspacing="0" style="border-left:1px solid #df8aa8;border-right:1px solid #df8aa8;"> <tr> <td valign="top" style='padding-top:0px; padding-left:2px;'> ์ด๋ถ€๋ถ„์— ๊ตฌ๊ธ€์• ๋“œ์„ผ์Šค ๊ด‘๊ณ  ์ฝ”๋“œ ๋„ฃ์–ด์ฃผ์„ธ์š” </td> </tr> </table>
๋‘๊ป˜์™€ ์ƒ‰์ƒ๋„ ์ˆ˜์ • ๊ฐ€๋Šฅํ•˜๊ณ  ์„ ์„ ํ•œ์ชฝ์—๋งŒ ๋‚˜์˜ค๊ฒŒ ํ• ์ˆ˜๋„ ์žˆ์–ด์š” -
๊ด‘๊ณ  ์ž์ฒด ํ…์ŠคํŠธ ์ƒ‰๋„ ๋ฐ”๊ฟ€์ˆ˜์žˆ๋‹ค๋Š”๊ฑฐ ์•„์‹œ์ฃ ?!~
์ƒ‰์ƒ๊ณผ ๊ฐ„๋‹จํ•œ ์Šคํƒ€์ผ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด‘๊ณ ๋„ ์˜ˆ์˜๊ฒŒ ๋„ฃ์–ด๋ณด์„ธ์š” ~!

๋ฐ˜์‘ํ˜•

์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

a remote or indirect consequence(result) of some action.(โ‰’ reverberation)
ex) His declaration had unforeseen repercussion

a movement back from an impact.(โ‰’ rebound)

๋ฐ˜์‘ํ˜•

์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

 

The woman being scared is possibly the prey of the lion whose mouse is wide open.

๋ฐ˜์‘ํ˜•

์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•
์ด ๋ฌธ์„œ ๋‚ด์šฉ:
  • 64 ๋น„ํŠธ ์œˆ๋„์šฐ์˜ ๊ธฐ์ดˆ
  • X64 ์•„ํ‚คํ…ํŠธ์˜ ๊ฐ„๋žตํ•œ ๋‚ด์šฉ
  • Visual C++ 2005๋กœ x64์šฉ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ
  • X64์šฉ ๋นŒ๋“œ๋ฅผ ์œ„ํ•œ ๋””๋ฒ„๊น… ๊ธฐ์ˆ 
์ด ๋ฌธ์„œ์—๋Š” ๋‹ค์Œ ๊ธฐ์ˆ ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค:
Windows, Win64, Visual Studio 2005




Matt Pietrek (์˜๋ฌธ)

๋ชฉ์ฐจ
x64 ์šด์˜์ฒด์ œ
x64์˜ ๊ฐ„๋žตํ•œ ๋‚ด๋ถ€ ๊ตฌ์กฐ
Visual C++๋กœ x64์šฉ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ
Win64 ํ˜ธํ™˜๋˜๋Š” ์ฝ”๋“œ ๋งŒ๋“ค๊ธฐ
๋””๋ฒ„๊น…
๋งค๋‹ˆ์ง€๋“œ ์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?
์ตœ์ข… ์ •๋ฆฌ

์ƒˆ๋กœ์šด 64๋น„ํŠธ ์œˆ๋„์šฐ์—์„œ ์ผํ–ˆ๋˜ ๊ฒฝํ—˜์˜ ์ข‹์•˜๋˜ ์  ์ค‘์˜ ํ•˜๋‚˜๋Š”, ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ € ์ž์‹ ์€ ํŠนํžˆ ์–ด๋–ค ์šด์˜์ฒด์ œ ๋ฐ‘๋ฐ”๋‹ฅ์— ๋Œ€ํ•ด์„œ ์กฐ๊ธˆ์ด๋ผ๋„ ์•Œ๊ธฐ ์ „๊นŒ์ง€๋Š”, ๊ทธ ์šด์˜์ฒด์ œ์— ๋Œ€ํ•ด์„œ ๊ทธ๋ ‡๊ฒŒ ํŽธ์•ˆํ•จ์„ ๋Š๋ผ์ง€ ๋ชปํ•˜๋Š” ํŽธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, 64๋น„ํŠธ Windows XP์™€ Windows Serverโ„ข 2003์ด ๋‚˜ํƒ€๋‚ฌ์„ ๋•Œ, ์ €๋Š” ์•„์ฃผ ์—ด์‹ฌํžˆ ๊ทธ ์šด์˜์ฒด์ œ์— ๋Œ€ํ•ด์„œ ์—ฐ๊ตฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

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

์ด ๊ธ€์—์„œ, ์ €๋Š” Win64์™€ x64์˜ ๋‚ด๋ถ€๊ตฌ์กฐ์— ๋Œ€ํ•œ ์ €์˜ ์ง€์‹์„ ์ข…ํ•ฉํ•ด์„œ ์œ ๋Šฅํ•œ Win32ยฎ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ x64๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ผญ ํ•„์š”ํ•œ ์ง€์‹๋“ค ์ œ๊ณตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ์ด๋ฏธ Win32์˜ ๊ฐœ๋…๊ณผ ๊ธฐ๋ณธ x86๊ฐœ๋…, ๊ทธ๋ฆฌ๊ณ  ์™œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ Win64์—์„œ ๋™์ž‘ ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ ์ด๋ฏธ ์•Œ๊ณ  ๊ณ„์‹ ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•ด์•ผ์ง€ ์ œ๊ฐ€ ์ข€ ๋” ํ•ต์‹ฌ์ ์ธ ๊ฒƒ๋“ค์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์„๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ์˜ ์ด ์š”์•ฝ์ด x86 ๋‚ด๋ถ€๊ตฌ์กฐ์™€ Win32์— ๋Œ€ํ•œ ์•Œ๊ณ  ์žˆ๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ ์ง€์‹์— ๊ด€๋ จ๋œ ์ƒ๋Œ€์ ์œผ๋กœ ์ค‘์š”ํ•œ x64์™€์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•œ ๊ณ ์ฐฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

x64 ์‹œ์Šคํ…œ์—์„œ ํ•œ ๊ฐ€์ง€ ์ข‹์€ ์ ์€, ์•„์ดํ…œ๋‹ˆ์œฐ(Itanium)๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์—ฌ๋Ÿฌ ๋ถ„์ด ์‹ฌ๊ฐํ•œ ํšจ์œจ ์ €ํ•˜์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์„ ํ•˜์ง€ ์•Š๊ณ , Win32 ํ˜น์€ Win64๋ฅผ ๋™์ผํ•œ ๊ธฐ๊ณ„์—์„œ ์ด์šฉํ•˜์‹ค ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ธํ…”๊ณผ AMD์˜ x64 ๊ตฌํ˜„์— ์กฐ๊ธˆ ๋ถˆ๋ช…ํ™•ํ•œ ๋ช‡ ๊ฐ€์ง€์˜ ์ฐจ์ด๊ฐ€ ์กด์žฌํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , x64์šฉ ์œˆ๋„์šฐ๋Š” ๋‘˜ ์ค‘ ์–ด๋Š ๊ณณ์—์„œ๋‚˜ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์ด AMD x64์™€ Intel x64 ์‹œ์Šคํ…œ์„ ์œ„ํ•ด์„œ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ฒ„์ ผ์˜ ์œˆ๋„์šฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ €๋Š” ์—ฌ๊ธฐ์„œ ์šด์˜์ฒด์ œ์˜ ๊ตฌํ˜„์˜ ๋ช‡ ๊ฐ€์ง€ ์ž์„ธํ•œ ๋‚ด์šฉ๋“ค, x64 CPU ๋‚ด๋ถ€ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๊ฐœ๊ด„์ ์ธ ์„ค๋ช…, ๊ทธ๋ฆฌ๊ณ  Visual C++๋กœ x64์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ ์˜์—ญ์œผ๋กœ ์ด ๊ธ€์„ ๋‚˜๋ˆ„์–ด์„œ ์ง„ํ–‰ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค:.


ํŽ˜์ด์ง€ ๋งจ ์œ„๋กœํŽ˜์ด์ง€ ๋งจ ์œ„๋กœ


x64 ์šด์˜์ฒด์ œ

์ €๋Š” ์–ด๋–ค ์œˆ๋„์šฐ ๋‚ด๋ถ€๊ตฌ์กฐ๋ฅผ ์„ค๋ช…ํ•˜๋”๋ผ๋„, ์ฒ˜์Œ์—๋Š” ๋ฉ”๋ชจ๋ฆฌ์™€ ์ฃผ์†Œ ๊ณต๊ฐ„์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ก 64๋น„ํŠธ ํ”„๋กœ์„ธ์„œ๊ฐ€ ์ด๋ก ์ ์œผ๋กœ๋Š” 16 ์—‘์‚ฌ ๋ฐ”์ดํŠธ(exabytes) ์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๊ณ , Win64๋Š” ํ˜„์žฌ 16 ํ…Œ๋ผ๋ฐ”์ดํŠธ(terabytes), 44๋น„ํŠธ ๋งŒ์„ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ 64๋น„ํŠธ ์ „๋ถ€๋ฅผ ์‚ฌ์šฉํ•ด์„œ, 16 ์—‘์‚ฌ๋ฐ”์ดํŠธ ์ „๋ถ€๋ฅผ ์“ธ ์ˆ˜ ์—†์—ˆ์„ ๊นŒ์š”? ๊ฑฐ๊ธฐ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๋งจ ์ฒ˜์Œ ์ด์œ ๋กœ๋Š”, ํ˜„์žฌ x64 CPU๋“ค์ด ๋ฌผ๋ฆฌ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์ ‘๊ทผํ•  ๋•Œ, ์˜ค์ง 40๋น„ํŠธ(1ํ…Œ๋ผ๋ฐ”์ดํŠธ)๋งŒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ œํ•œ์ด ์—†์–ด์ง„๋‹ค๊ณ  ํ•˜๋”๋ผ๊ณ , ์ง€๊ธˆ ํ˜„์žฌ์˜ ํ•˜๋“œ์›จ์–ด๊ฐ€ ์•„๋‹Œ, ํ–ฅํ›„์— ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” CPU๋“ค์˜ ๋‚ด๋ถ€๊ตฌ์กฐ๋“ค์ด ์˜ค์ง 52๋น„ํŠธ (4ํŽ˜ํƒ€๋ฐ”์ดํŠธ)๋งŒํผ๋งŒ ํ™•์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๊ทธ ์ •๋„๋งŒ ํ•ด๋„, ๊ทธ ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•œ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์˜ ์‚ฌ์ด์ฆˆ๋Š” ์–ด๋งˆ ์–ด๋งˆ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Win32์—์„œ์™€ ๊ฐ™์ด, ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์†Œ ๊ณต๊ฐ„์€, ์‚ฌ์šฉ์ž์™€ ์ปค๋„์˜ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ง‘๋‹ˆ๋‹ค. ์ปค๋„ ๋ชจ๋“œ์˜ ์ฝ”๋“œ๊ฐ€ 8 ํ…Œ๋ผ๋ฐ”์ดํŠธ ์ƒ์œ„์—์„œ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์— ์˜ํ•ด ์˜์—ญ๋˜๊ณ , ๊ฐ๊ฐ์˜ ํ”„๋กœ์„ธ์„œ๋Š” 8 ํ…Œ๋ผ๋ฐ”์ดํŠธ ์ดํ•˜์— ์ž์‹ ์˜ ๊ณ ์œ  ์˜์—ญ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. 64๋น„ํŠธ ์œˆ๋„์šฐ์˜ ๊ฐ ๋ฒ„์ ผ๋“ค์€ ๊ทธ๋ฆผ 1๊ณผ ๊ทธ๋ฆผ 2์—์„œ ๋ณด์—ฌ์ง€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์„œ๋กœ ๋‹ค๋ฅธ ๋ฌผ๋ฆฌ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ํ•œ๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Win32์—์„œ์™€ ๊ฐ™์ด, x64์˜ ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ๋Š” 4KB ์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ์˜ 64KB ๊ณต๊ฐ„์€ ์ ˆ๋Œ€๋กœ ๋งคํ•‘ ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์—ฌ๋Ÿฌ๋ถ„์ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋งตํ•‘ ์ฃผ์†Œ์ค‘ ๊ฐ€์žฅ ๋‚ฎ์€ ๋ฒˆ์ง€๋Š” 0x10000์ž…๋‹ˆ๋‹ค. Win32์—์„œ๋Š” ๋‹ค๋ฅด๊ฒŒ, ์‹œ์Šคํ…œ DLL๋“ค์€ ์‚ฌ์šฉ์ž ๋ชจ๋“œ ์ฃผ์†Œ ๊ณต๊ฐ„์˜ ์ œ์ผ ์œ„ ๋ถ€๋ถ„๊ณผ ๊ทผ์ ‘ํ•ด ์žˆ๋Š”, ๊ธฐ๋ณธ ๋กœ๋“œ ์–ด๋“œ๋ ˆ์Šค๋ผ๋Š” ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ ๋Œ€์‹ , ์‹œ์Šคํ…œ DLL๋“ค์€ 4GB ์œ„์˜ ๊ณต๊ฐ„์— ์ ์žฌ ๋ฉ๋‹ˆ๋‹ค. ํ†ต์ƒ์ ์œผ๋กœ, ๊ทธ ์ฃผ์†Œ๋Š” 0x7FF00000000 (8 ํ…Œ๋ผ๋ฐ”์ดํŠธ) ๊ทผ์ฒ˜์ž…๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด x64 ํ”„๋กœ์„ธ์„œ์˜ ์ข‹์€ ๊ธฐ๋Šฅ ์ค‘์— ํ•˜๋‚˜๋Š”, ์œˆ๋„์šฐ๊ฐ€ ํ•˜๋“œ์›จ์–ด์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ์‹คํ–‰ ๋ณดํ˜ธ(Data Execution Protection, ์ดํ•˜ DEP)๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ง€์›ํ•ด ์ค€๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. x86 ํ”Œ๋žซํผ์—์„œ๋Š”, ๋งŽ์€ ๋ฒ„๊ทธ์™€ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ CPU๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ์ฝ”๋“œ ๋ฐ”์ดํŠธ๋กœ ์ธ์‹ํ•˜๊ณ  ์‹คํ–‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์กด์žฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ˆ˜์ด๋“  ํ˜น์€ ๊ณ ์˜์ ์ธ ๋ฒ„ํผ ์˜ค๋ฒ„๋Ÿฐ(buffer overrun)์ด ์›๋ž˜๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ์„ ๋ชฉ์ ์œผ๋กœ ํ–ˆ๋˜ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ฝ์„ CPU์—์„œ ๋ช…๋ น์–ด๋กœ ์ธ์‹ํ•˜๊ณ  ์‹คํ–‰ํ•ด ๋ฒ„๋ฆฌ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณค ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด DEP์˜ ๋„์›€์œผ๋กœ, ์šด์˜์ฒด์ œ๋Š”, ์˜๋„ํ•œ ์ฝ”๋“œ ์˜์—ญ์˜ ๊ฒฝ๊ณ„๋ฅผ ๋ช…๋ฃŒํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ์ด ์˜๋„๋œ ๊ฒฝ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ์ฝ”๋“œ ์‹คํ–‰์— ๋Œ€ํ•ด์„œ๋Š” CPU๊ฐ€ ์ผ์ข…์˜ ๋ซ์„ ๋†“์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์œˆ๋„์šฐ๋ฅผ ์•…์˜์ ์ธ ๊ณต๊ฒฉ์— ๋œ ์ทจ์•ฝํ•˜๊ฒŒ ๋งŒ๋“œ๋Š”๋ฐ ํฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—๋Ÿฌ๋“ค์„ ์žก๊ธฐ ์œ„ํ•ด์„œ ๊ณ ์•ˆ๋œ ์žฅ์น˜๋“ค ์ค‘์— ํ•˜๋‚˜๊ฐ€, x64 ๋ง์ปค๊ฐ€ ์‹คํ–‰ํŒŒ์ผ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ ์žฌ ์ฃผ์†Œ๋ฅผ 32๋น„ํŠธ (4GB) ์ด์ƒ์œผ๋กœ ์„ค์ •ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฝ”๋“œ๊ฐ€ Win64๋กœ ํฌํŒ…๋œ ํ›„, ๊ธฐ์กด์— ์žˆ๋˜ ์ฝ”๋“œ์—์„œ ์œ„์—์„œ ์ด์•ผ๊ธฐํ•œ ๋ณด์•ˆ์— ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๋ถ€๋ถ„์„ ์ฐพ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. ํŠนํžˆ, ๋งŒ์•ฝ ํฌ์ธํ„ฐ๊ฐ€ 32๋น„ํŠธ ๊ฐ’(์˜ˆ๋ฅผ ๋“ค์–ด, DWORD)๊ฐ’์œผ๋กœ ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฉด, ๊ทธ๋Ÿฌ๋ฉด, ๊ทธ ๊ฐ’์€ Win64 ๋นŒ๋“œ๋ฅผ ๋™์ž‘์‹œํ‚ฌ ๋•Œ, ๊ฐ’์ด ์ผ๋ถ€๋ถ„์ด ์งค๋ฆผ ์œผ๋กœ์„œ, ํฌ์ธํ„ฐ๋ฅผ ๋ฌดํšจํ™” ์‹œํ‚ค๊ณ , ์ ‘๊ทผ์œ„๋ฐ˜(access violation)์„ ์ผ์œผํ‚ต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ž”๊ธฐ์ˆ ์€ ์ง€์ €๋ถ„ํ•œ ํฌ์ธํ„ฐ ๋ฒ„๊ทธ๋ฅผ ์ฐพ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

ํฌ์ธํ„ฐ์™€ DWORD์— ๋Œ€ํ•œ ์ฃผ์ œ๋“ค๋„ Win64์˜ ํƒ€์ž…์„ ์ด์•ผ๊ธฐํ•˜๋Š”๋ฐ ๋น ์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Win64์—์„œ ํฌ์ธํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ ๊นŒ์š”? LONGํ˜•์˜ ๊ธธ์ด๋Š”์š”? ๊ทธ๋ฆฌ๊ณ , ํ•ธ๋“ค๊ณผ HWND์˜ ํฌ๊ธฐ๋Š” ์–ผ๋งˆ๋‚˜ ๋ ๊นŒ์š”? ๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„, ๋งˆ์ดํฌ๋กœ ์†Œํ”„ํŠธ๊ฐ€ Win16์—์„œ Win32๋กœ์˜ ์ข€ ์ง€์ €๋ถ„ํ•œ ๋ณ€ํ™˜์„ ํ•˜๋ฉด์„œ, ์ƒˆ๋กœ์šด ์ž๋ฃŒํ˜•์˜ ๋ชจ๋ธ์— ๋Œ€ํ•ด์„œ๋Š” 64๋น„ํŠธ ๊นŒ์ง€์˜ ํ™•์žฅ์ด ์‰ฝ๊ฒŒ ๋  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด์•ผ๊ธฐ ํ•ด์„œ, ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์™ธ๋ฅผ ์ œ์™ธํ•˜๊ณ , ์ƒˆ๋กœ์šด 64๋น„ํŠธ ์„ธ๊ณ„์—์„œ๋„, ํฌ์ธํ„ฐ์™€ size_t๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋‚˜๋จธ์ง€ ์ž๋ฃŒํ˜• ๋“ค์€ Win32์—์„œ์™€ ๋™์ผํ•œ ๊ธธ์ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, 64๋น„ํŠธ ํฌ์ธํ„ฐ๋Š” 8๋ฐ”์ดํŠธ์ธ ๋ฐ˜๋ฉด์—, int,long, DWORD๋Š” ์•„์ง๋„ 4๋ฐ”์ดํŠธ์ž…๋‹ˆ๋‹ค. ํ›„๋ฐ˜๋ถ€์— Win64 ๊ฐœ๋ฐœ์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐ ํ•˜๋ฉด์„œ, ์ด ์ž๋ฃŒํ˜•์— ๋Œ€ํ•ด์„œ ์ข€ ๋” ์ด์•ผ๊ธฐ ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. [Editor's Update - 5/2/2006: ํ•ธ๋“ค์€ ํฌ์ธํ„ฐ ๊ฐ’์œผ๋กœ ์„ ์–ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, Win64์—์„œ๋Š” 4๋ฐ”์ดํŠธ๊ฐ€ ์•„๋‹Œ 8๋ฐ”์ดํŠธ ๊ฐ’์ž…๋‹ˆ๋‹ค.]

Win64์˜ ํฌ๋งท์€ PE32+๋ผ๊ณ  ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋ชจ๋“  ๊ด€์ ์—์„œ ์ด ํฌ๋งท์€ Win32PE ํŒŒ์ผ๊ณผ ๊ฑฐ์˜ ๊ตฌ์กฐ์ ์œผ๋กœ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ImageBase ๊ฐ™์€ ๋ช‡ ๋ช‡์˜ ํฌ๋งท์€ ๋” ํฌ๊ธฐ๊ฐ€ ์ปค์กŒ๊ณ , ํ•œ ํ•„๋“œ๋Š” ์—†์–ด์กŒ๊ณ , ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜์˜ ํ•„๋“œ๋Š” ๋‹ค๋ฅธ CPU ํƒ€์ž…์„ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆผ 3 ์€ ๋ฐ”๋€ ํ•„๋“œ๋“ค์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.

PE ํ—ค๋”๋ฅผ ๋ง๊ณ ๋Š”, ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ด ๋ฐ”๋€ ๋ถ€๋ถ„์ด ์—†์Šต๋‹ˆ๋‹ค. IMAGE_LOAD_CONFIG, IMAGE_THUNK_DATA๊ฐ™์€ ๋ช‡ ๋ช‡ ๊ตฌ์กฐ์ฒด๋“ค์€ ๋‹จ์ˆœํžˆ ํ•„๋“œ๋“ค์„ 64๋น„ํŠธ๋กœ์˜ ํ™•์žฅ์„ ํ–ˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค. PDATA ์„น์…˜์˜ ์ถ”๊ฐ€๋Š” Win32์™€ Win64 ๊ตฌํ˜„์˜ ์ฃผ๋œ ์ฐจ์ด์ ์ค‘์˜ ํ•˜๋‚˜๋ฅผ ๋‘๋“œ๋Ÿฌ์ง€๊ฒŒ ํ•œ๋‹ค๋Š” ์ ์—์„œ ์•„์ฃผ ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค: ๊ทธ ์ฐจ์ด๋Š” ๋ฐ”๋กœ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ(exception handling) ์ž…๋‹ˆ๋‹ค.

x86 ์„ธ๊ณ„์—์„œ๋Š”, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋Š” ์Šคํƒ์— ๊ธฐ๋ฐ˜ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. Win32 ํ•จ์ˆ˜๊ฐ€ try/catch ํ˜น์€ try/finally ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๋•Œ, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์Šคํƒ์— ์ž‘์€ ๋ฐ์ดํƒ€ ๋ธ”๋ฝ์„ ๋งŒ๋“ค์–ด ๋†“๋Š” ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋กœ, ๊ฐ๊ฐ์˜ ๋ฐ์ดํƒ€ ๋ธ”๋ฝ์€ ์ด์ „ try ๋ฐ์ดํƒ€ ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌ์ผฐ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, ์ตœ๊ทผ์— ์ถ”๊ฐ€๋œ ๊ตฌ์กฐ์ฒด๊ฐ€ ๋ฆฌ์ŠคํŠธ์˜ ํ—ค๋“œ๊ฐ€ ๋˜๋Š” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ๋ถˆ๋ ค์ง€๊ณ , ์ข…๋ฃŒ๋  ๋•Œ, ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ํ—ค๋”๋Š” ๊ณ„์† ๊ฐฑ์‹ ์ด ๋˜์—ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค, ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ, ์šด์˜์ฒด์ œ๊ฐ€ ์Šคํƒ์— ์žˆ๋Š” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ๋ธ”๋ฝ์„ ์‚ดํŽด์„œ, ์ ์ ˆํ•œ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฐพ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ €์˜ 1997๋…„ MSJ article (์˜๋ฌธ) ์—์„œ ์ข€ ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์ฐพ์•„ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Win32 ์˜ˆ์™ธ์ฒ˜๋ฆฌ์™€๋Š” ๋ฐ˜๋Œ€๋กœ, Win64 (x64์™€ ์•„์ดํ…œ๋‹ˆ์›€(Itanium) ๋ฒ„์ ผ ๋‘˜ ๋‹ค ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.)์—์„œ๋Š” ํ…Œ์ด๋ธ” ๊ธฐ๋ฐ˜์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์‚ฌ์˜ํ•ฉ๋‹ˆ๋‹ค. ๋” ์ด์ƒ ์Šคํƒ ์œ„์— ์žˆ๋Š” try ๋ฐ์ดํƒ€ ๋ธ”๋ฝ์˜ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , ๊ฐ๊ฐ์˜ Win64 ์‹คํ–‰ํŒŒ์ผ์€ ๋Ÿฐํƒ€์ž„ ํ•จ์ˆ˜ ํ…Œ์ด๋ธ”์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ํ•จ์ˆ˜ ํ…Œ์ด๋ธ”์€ ํ•จ์ˆ˜์˜ ์‹œ์ž‘ ์ฃผ์†Œ์™€ ๋ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ํ•จ์ˆ˜์˜ ์Šคํƒ ํ”„๋ ˆ์ž„ ๋ ˆ์ด์•„์›ƒ๊ณผ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ฝ”๋“œ์— ๊ด€๋ จ๋œ ๋ฐ์ดํƒ€๋“ค์˜ ์œ„์น˜ ์—ญ์‹œ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌ์กฐ์ฒด๋“ค์˜ ํ•ต์‹ฌ์„ ๋ณด๊ธฐ ์œ„ํ•ด์„œ WINNT.H์•ˆ์— ๋“ค์–ด ์žˆ๋Š” x64 SDK์•ˆ์— WINNT.H ์•ˆ์— ์žˆ๋Š” IMAGE_RUNTIME_FUNCTION_ENTRY ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด ๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์šด์˜์ฒด์ œ๋Š” ์“ฐ๋ ˆ๋“œ ์Šคํƒ์„ ํ•˜๋‚˜์”ฉ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ์„ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ๊ฐ๊ฐ์˜ ํ”„๋ ˆ์ž„์„ ํƒ์ƒ‰ํ•˜๊ณ , ์ €์žฅ๋œ ์ธ์ŠคํŠธ๋Ÿญ์…˜ ํฌ์ธํ„ฐ๋ฅผ ์ฐพ์•„์„œ, ์šด์˜์ฒด์ œ๊ฐ€ ์–ด๋–ค ์‹คํ–‰ ๋ชจ๋“ˆ์•ˆ์— ์ธ์ŠคํŠธ๋Ÿญ์…˜ ํฌ์ธํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ, ์šด์˜์ฒด์ œ๋Š” ๋Ÿฐํƒ€์ž„ ํ•จ์ˆ˜ ํ…Œ์ด๋ธ”์„ ๊ทธ ๋ชจ๋“ˆ์—์„œ ์ฐพ์•„์„œ, ์ ์ ˆํ•œ ๋Ÿฐํƒ€์ž„ ํ•จ์ˆ˜๋ฅผ ์ฐพ์•„์„œ, ๋ฐ์ดํƒ€๋กœ ๋ถ€ํ„ฐ ์ ์ ˆํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ฒฐ์ •์„ ๋‚ด๋ ค ์ค๋‹ˆ๋‹ค.

๋งŒ์•ฝ, ์—ฌ๋Ÿฌ๋ถ„์ด ๋กœ์ผ“ ๊ณผํ•™์ž์ด๊ณ , PE32+ ๋ชจ๋“ˆ ์—†์ด ์ง์ ‘์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ–ˆ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? RtlAddFunctionTable API๋ฅผ ์ด์šฉํ•˜์—ฌ, ์šด์˜์ฒด์ œ์—๊ฒŒ ์—ฌ๋Ÿฌ๋ถ„์ด ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•œ ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ์•Œ๋ ค ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ” ๊ธฐ๋ฐ˜์˜ ์˜ˆ์™ธ ํ•ธ๋“ค๋ง์˜ ๋‹จ์ ์€ (x86 ์Šคํƒ ๊ธฐ๋ฐ˜ ๋ชจ๋ธ์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ) ํ•จ์ˆ˜ ํ…Œ์ด๋ธ”์„ ์ฐพ์•„ ๋ณด๋Š” ๊ฒƒ์ด, ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ’์„ ์ฐพ๋Š” ๊ฒƒ ๋ณด๋‹ค ํ›จ์”ฌ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฐ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์žฅ์ ์€, ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ๋•Œ ๋งˆ๋‹ค ๋งค ๋ฒˆ try ๋ฐ์ดํƒ€ ๋ธ”๋ฝ์„ ์ƒ์„ฑ์‹œํ‚ค๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์—†๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

๊ผญ ๊ธฐ์–ตํ•˜์„ธ์š”! ์ด ๊ธ€์ด ์•„๋ฌด๋ฆฌ ์žฌ๋ฏธ์žˆ๊ณ , ํฅ๋ฏธ๋กœ์›Œ๋„, ์ด ๊ธ€์€ x64 ์˜ˆ์™ธ ํ•ธ๋“ค๋ง์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์ด๋ผ๊ธฐ ๋ณด๋‹ค, ๊ฐ„๋‹จํ•œ ์†Œ๊ฐœ์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค. x64์˜ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ์— ๋Œ€ํ•œ ์ข€ ๋” ๊นŠ์€ ์ง€์‹์„ ์•Œ๊ณ  ์‹ถ์œผ์‹œ๋‹ค๋ฉด, Kevin Frei์˜ ๋ธ”๋กœ๊ทธ (์˜๋ฌธ) ์„ ๊ผญ ํ•œ ๋ฒˆ ์ฝ์–ด ๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

x64์— ํ˜ธํ™˜๋˜๋Š” ์œˆ๋„์šฐ์— ์ƒˆ๋กœ์šด API๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค; ๊ฑฐ์˜ ๋ชจ๋“  ์ƒˆ๋กœ์šด Win64 API๋“ค์€ ์•„์ดํ…œ๋‹ˆ์›€(Itanium) ํ”„๋กœ์„ธ์„œ๋ฅผ ์œ„ํ•œ ์œˆ๋„์šฐ ์ถœ์‹œ ๋•Œ ์ด๋ฏธ ์ถ”๊ฐ€๋˜์—ˆ๋˜ ๊ฒƒ๋“ค ์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ, ๊ทธ API๋“ค ์ค‘ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋‘ ๊ฐœ์˜ API๋Š” IsWow64Process์™€ GetNativeSystemInfo ์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋“ค์€ Win32 ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ž๊ธฐ ์ž์‹ ๋“ค์ด Win64์—์„œ ๋Œ๊ณ  ์žˆ๋Š”์ง€์˜ ์—ฌ๋ถ€๋ฅผ ์•Œ๋ ค ์ค๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, ๋งŒ์•ฝ 64๋น„ํŠธ ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์‹œ์Šคํ…œ์˜ ์ง„์งœ ์‚ฌ์–‘(capability)๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์—, 32๋น„ํŠธ ํ”„๋กœ์„ธ์Šค๋Š” GetSystemInfo ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์˜ค์ง 32๋น„ํŠธ ์‹œ์Šคํ…œ์ธ ๊ฒƒ์ฒ˜๋Ÿผ, ์‹œ์Šคํ…œ์˜ ์‚ฌ์–‘(capability)๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, GetSystemInfo๋Š” 32๋น„ํŠธ ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ ์˜์—ญ๋งŒ์„ ๋ณด๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆผ 4 ๋Š” x86์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ , ์˜ค์ง x64์—์„œ ์“ธ ์ˆ˜ ์žˆ๋Š” API๋“ค์„ ๋ณด์—ฌ ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ „๋ถ€ ๋‹ค 64๋น„ํŠธ๋กœ ๋™์ž‘ํ•˜๋Š” ์œˆ๋„์šฐ ์‹œ์Šคํ…œ์ด ์•„์ฃผ ๋ฉ‹์ง€๊ฒŒ ๋“ค๋ฆฌ๊ฒ ์ง€๋งŒ, ํ˜„์‹ค์ ์œผ๋กœ ์—ฌ๋Ÿฌ๋ถ„์€ ์ž ์‹œ ๋™์•ˆ Win32 ์ฝ”๋“œ๋ฅผ ํ•„์š”๋กœ ํ•˜๊ฒŒ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ์ž‘์—…์„ ์œ„ํ•ด์„œ, x64 ๋ฒ„์ ผ์˜ ์œˆ๋„์šฐ๋Š” Win32์™€ Win64 ํ”„๋กœ์„ธ์Šค๋ฅผ ๋™์‹œ์— ๋™์ผํ•œ ์‹œ์Šคํ…œ์—์„œ ๋™์ž‘์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” WOW64 ์„œ๋ธŒ์‹œ์Šคํ…œ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์—ฌ๋Ÿฌ๋ถ„์˜ 32๋น„ํŠธ DLL์„ 64๋น„ํŠธ ํ”„๋กœ์„ธ์Šค๋กœ ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜ ํ˜น์€ ๋ฐ˜๋Œ€์˜ ์ผ๋“ค์€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์ €๋ฅผ ๋ฏฟ์œผ์„ธ์š”, ์•„์ฃผ ์ข‹์€ ์ผ์ž…๋‹ˆ๋‹ค.) ๊ทธ๋ฆฌ๊ณ  ๋งˆ์นจ๋‚ด ์—ฌ๋Ÿฌ๋ถ„์€ ๊ตฌ๋‹ฅ๋‹ค๋ฆฌ 16๋น„ํŠธ ์ฝ”๋“œ์—๊ฒŒ ์ž˜ ๊ฐ€๋ผ๊ณ  ์ธ์‚ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

x64 ๋ฒ„์ ผ์˜ ์œˆ๋„์šฐ์—์„œ๋Š”, ํ”„๋กœ์„ธ์„œ๋Š” ์˜ค์ง Win64 DLL๋“ค๋งŒ ๋กœ๋”ฉํ•  ์ˆ˜ ์žˆ๋Š”, Explorer.exe ๊ฐ™์€ 64๋น„ํŠธ ์‹คํ–‰ ํŒŒ์ผ์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์—, 32๋น„ํŠธ ์‹คํ–‰ ํŒŒ์ผ์—์„œ ์‹œ์ž‘ํ•œ ํ”„๋กœ์„ธ์Šค๋Š” ์˜ค์ง Win32 DLL ๋“ค๋งŒ ๋กœ๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Win32 ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ปค๋„ ๋ชจ๋“œ์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ-์˜ˆ๋ฅผ ๋“ค์–ด์„œ ํŒŒ์ผ์„ ์ฝ๋Š”๋‹ค๋“ ์ง€-WOW64๋Š” ๊ทธ ํ•จ์ˆ˜๋ฅผ ์กฐ์šฉํžˆ ๊ฐ€๋กœ์ฑ„์„œ, ์˜ฌ๋ฐ”๋ฅธ x64 ์ฝ”๋“œ์˜ ์ฃผ์†Œ๋ฅผ ์ฃผ์–ด์„œ ํ˜ธ์ถœํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก , ์„œ๋กœ ๋‹ค๋ฅธ ์ข…์กฑ(32๋น„ํŠธ์™€ 64๋น„ํŠธ) ํ”„๋กœ์„ธ์„œ๋“ค๋ผ๋ฆฌ ํ†ต์‹ ํ•  ์ผ๋„ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šด์ข‹๊ฒŒ๋„, Win32์—์„œ ์—ฌ๋Ÿฌ๋ถ„์ด ์‚ฌ๋ž‘ํ•˜๊ณ  ์ข‹์•„ํ–ˆ๋˜ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๊ฐ„ ํ†ต์‹  ๋ฐฉ๋ฒ•์€ Win64์—์„œ๋„ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์‰์–ด๋“œ ๋ฉ”๋ชจ๋ฆฌ(shared memory), ๋„ค์ž„๋“œ ํŒŒ์ดํ”„(named pipe), ๊ทธ๋ฆฌ๊ณ , ๊ธฐํƒ€ ์ด๋ฆ„์ด ์žˆ๋Š” ๋™๊ธฐํ™” ๊ฐ์ฒด๋“ค์„ ํฌํ•จํ•ด์„œ ๋ง์ž…๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์ด ํ˜น์‹œ "๊ทธ๋Ÿผ ์‹œ์Šคํ…œ ๋””๋ ‰ํ† ๋ฆฌ๋„ Win32์™€ Win64๊ฐ€ ๋™์ผํ•œ๊ฐ€?"๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ค ์ง€๋„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ 32 ๋น„ํŠธ์™€ 64 ๋น„ํŠธ KERNEL32 ๋‚˜ USER32 ๋“ฑ๊ณผ ๊ฐ™์€ ๋™์ผํ•œ ์ด๋ฆ„์˜ ์‹œ์Šคํ…œ DLL๋“ค์„ ๋™์‹œ์— ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค, ๊ทธ๋ ‡์ง€์š”? WOW64๋Š” ์š”์ˆ ๊ฐ™์ด ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ๋ฆฌ๋‹ค์ด๋ ‰์…˜(redirection)์„ ํ†ตํ•ด์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. Win32 ํ”„๋กœ์„ธ์Šค์—์„œ์˜ ํŒŒ์ผ์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ํ˜น์€ ์ฝ๊ธฐ ๋“ฑ์ด ๋ฐœ์ƒํ•˜๋ฉด, SysWow64๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ์ปค๋„์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, System32์— ์žˆ๋Š” ์ปค๋„์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. WOW64๊ฐ€ ์•ˆ๋ณด์ด๊ฒŒ SysWow64 ๋””๋ ˆํ† ๋ฆฌ๋กœ ์š”์ฒญํ•œ ๊ฒƒ์„ ์กฐ์šฉํžˆ ๋ฐ”๊พธ์–ด ์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, Win64 ์‹œ์Šคํ…œ์ด ํšจ๊ณผ์ ์œผ๋กœ ๋‘ ๊ฐœ์˜ ์‹œ์Šคํ…œ ๋””๋ ‰ํ† ๋ฆฌ, ํ•˜๋‚˜๋Š” x64 ์šฉ ๋ฐ”์ด๋„ˆ๋ฆฌ๋“ค๊ณผ ๋˜ ํ•˜๋‚˜๋Š” Win32์šฉ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

์•ฝ๊ฐ„ ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋Ÿฌํ•œ ๋‚ด๋ถ€์ ์ธ ์ฒ˜๋ฆฌ๋Š” ์ƒ๋‹นํžˆ ๋ถ€๋“œ๋Ÿฌ์šด ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ œ๊ฐ€ System32 ๋””๋ ‰ํ† ๋ฆฌ์˜ Kernel32.dll์—์„œ Dir์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ, SysWow64 ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ํ–ˆ๋˜ ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๋˜‘๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ๋ฆฌ๋‹ค์ด๋ ‰์…˜์ด ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๊ธฐ ๊นŒ์ง€, ์ œ ์ž์‹ ์€ ๋จธ๋ฆฌ๊ฐ€ ์ข€ ๋งŽ์ด ์•„ํŒ ์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์ด x64 ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ 32๋น„ํŠธ WindowsSystem32 ํด๋”๋ฅผ ์•Œ๊ธฐ๋ฅผ ์ •๋ง๋กœ ์›ํ•˜์‹ ๋‹ค๋ฉด, GetSystemWow64Directory ๋ผ๋Š” API๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„๊ป˜ ์ •ํ™•ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ „๋‹ฌํ•ด ์ค„ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„, ์ „์ฒด ๋‚ด์šฉ์„ ์•Œ๊ธฐ ์œ„ํ•ด์„œ MSDN ๋ฌธ์„œ๋ฅผ ๊ผญ ์ฝ์–ด ๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ๋ฆฌ๋‹ค์ด๋ ‰์…˜์ด์™ธ์—๋„, WOW64๊ฐ€ ํ•ด์ฃผ๋Š” ๋˜ ๋‹ค๋ฅธ ๋งˆ๋ฒ• ์ค‘์˜ ํ•˜๋‚˜๊ฐ€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋ฆฌ๋‹ค์ด๋ ‰์…˜์ž…๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์•„๊นŒ Win64 ํ”„๋กœ์„ธ์Šค์—์„œ๋Š” Win32 DLL๋“ค์„ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ–ˆ๋˜ ๋ง์„ ์ƒ๊ฐํ•ด ๋ณด์‹œ๊ณ , ๊ทธ๋ฆฌ๊ณ  COM ๊ณผ in-process ์„œ๋ฒ„ DLL์„ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ, ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•ด ๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋งŒ์•ฝ, Win32 DLL์— ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” COM ์˜ค๋ธŒ์ ํŠธ๋ฅผ 64๋น„ํŠธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด CoCreateInstance๋ฅผ ์ด์šฉํ•ด์„œ, ์ƒ์„ฑํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? DLL์ด ์˜ฌ๋ผ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค, ๋งž์ง€์š”? WOW64๋Š” Win32 ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ๋ถ€ํ„ฐ์˜ ์ ‘๊ทผ์„ SoftwareClasses ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋…ธ๋“œ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ํ•ด ์ค๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ Win32 ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณด๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๊ตฌ์กฐ๋Š” x64 ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณด๋Š” ๊ฒƒ๊ณผ ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ , ์—ฌ๋Ÿฌ๋ถ„์ด ๊ธฐ๋Œ€ํ•˜์‹œ๋Š” ๋Œ€๋กœ, ์šด์˜์ฒด์ œ๋Š” 32๋น„ํŠธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด RegOpenKey์™€ ๊ทธ ๊ณ„์—ด ํ•จ์ˆ˜๊ตฐ์„ ์ด์šฉํ•˜์—ฌ, ์‹ค์ œ๋กœ๋Š” 64๋น„ํŠธ์ธ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•  ๋•Œ, ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒˆ๋กœ์šด ํ”Œ๋ž˜๊ทธ ๊ฐ’์„ ์ฃผ์–ด์„œ, ๊ทธ ๊ฐ’๋“ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์•ฝ๊ฐ„๋งŒ ๋” ๊นŠ์ˆ™์ด ๋“ค์–ด๊ฐ€์„œ, ์“ฐ๋ ˆ๋“œ ๋กœ์ปฌ ๋ฐ์ดํƒ€ ์˜์—ญ๋„ ์‚ดํŽด ๋ณด์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. x86 ๋ฒ„์ ผ์˜ ์œˆ๋„์šฐ์—์„œ๋Š”, FS ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ๊ฐ ์“ฐ๋ ˆ๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ๊ณผ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์—๋Ÿฌ(GetLastError๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์—๋Ÿฌ ๊ฐ’), ๊ทธ๋ฆฌ๊ณ  ์“ฐ๋ ˆ๋“œ์˜ ์ง€์—ญ ์ €์žฅ ์˜์—ญ(TLS: Thread Local Storage, TlsGetValue๋กœ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š”) ์— ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. x64 ๋ฒ„์ ผ์˜ ์œˆ๋„์šฐ์—์„œ๋Š”, FS ๋ ˆ์ง€์Šคํ„ฐ๋Š”, GS ๋ ˆ์ง€์Šคํ„ฐ๋กœ ๊ต์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์™ธ์—๋Š” ๊ฑฐ์˜ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ x32์™€ x64์˜ ์šด์˜์ฒด์ œ๊ฐ€ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋น„๋ก, ์ด ๊ธ€์ด x64์˜ ์‚ฌ์šฉ์ž ์ž…์žฅ์— ์ดˆ์ ์„ ๋‘๊ณ  ์žˆ๊ธฐ๋Š” ํ•˜์ง€๋งŒ, ์ปค๋„ ๋ชจ๋“œ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ์—์„œ ํ•œ ๊ฐ€์ง€ ์ถ”๊ฐ€๋œ ์ค‘์š”ํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. PatchGuard๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์ด x64 ์œˆ๋„์šฐ์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์ˆ ์€ ๋ณด์•ˆ๊ณผ ๊ฒฌ๊ณ ํ•จ์„ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž‘๊ฒŒ๋Š” syscall ํ…Œ์ด๋ธ”์ด๋‚˜ ์ธํ„ฐ๋ŸฝํŠธ ๋””์ŠคํŒจ์น˜ ํ…Œ์ด๋ธ”(interrupt dispatch table-IDT)๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ๋“œ๋ผ์ด๋ฒ„๋“ค์€ ๋ณด์•ˆ์ƒ์˜ ๋ฌธ์ œ์™€ ์ž ์žฌ์ ์ธ ์•ˆ์ •์„ฑ์˜ ๋ฌธ์ œ๋ฅผ ์ผ์œผ์ผœ ์™”์—ˆ์Šต๋‹ˆ๋‹ค. x64์˜ ๋‚ด๋ถ€์—์„œ๋Š”, ๊ทธ๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ปค๋„์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง€์›๋˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ์‹์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒƒ์„ ๊ฐ•ํ™”์‹œํ‚ค๋Š” ๊ธฐ์ˆ ์ด PatchGuard ์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ์ˆ ์€ ์ค‘์š”ํ•œ ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์˜ ์œ„์น˜๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์€ ์ปค๋„ ๋ชจ๋“œ์˜ ์“ฐ๋ ˆ๋“œ์—์„œ ํ•ญ์ƒ ๊ฐ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ฐ”๋€Œ๋ฉด, ์‹œ์Šคํ…œ์€ ๋ฒ„๊ทธ์ฒดํฌ๋ฅผ ํ†ตํ•˜์—ฌ ๋ฉˆ์ถฐ ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์„ ๊ณ ๋ คํ•ด ๋ณด์•„๋„, ๋งŒ์•ฝ ์—ฌ๋Ÿฌ๋ถ„์ด Win32์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ์— ์–ด๋Š ์ •๋„ ์•Œ๊ณ  ์žˆ๊ณ , ์ฝ”๋“œ๋ฅผ ์“ธ ์ค„ ์•Œ๊ณ , ๋™์ž‘ํ•˜๋Š”์ง€๋ฅผ ์•Œ๊ณ  ์žˆ์œผ๋ฉด, Win64๋กœ์˜ ์ด๋™์— ์žˆ์–ด์„œ ํฌ๊ฒŒ ๋†€๋ผ์ง€ ์•Š์œผ์‹ค ๊ฒ๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„์€ ์ข€ ๋” ๋„“์€ ํ™˜๊ฒฝ์œผ๋กœ์˜ ์ด๋™์ด๋ผ๊ณ  ๊ฐ„์ฃผํ•˜์…” ๋ฉ๋‹ˆ๋‹ค.


ํŽ˜์ด์ง€ ๋งจ ์œ„๋กœํŽ˜์ด์ง€ ๋งจ ์œ„๋กœ


x64์˜ ๊ฐ„๋žตํ•œ ๋‚ด๋ถ€ ๊ตฌ์กฐ

์ž ์ด์ œ, CPU์˜ ๊ตฌ์กฐ ์ž์ฒด์— ๋Œ€ํ•ด์„œ ์กฐ๊ธˆ ์‚ดํŽด ๋ณด๊ธฐ๋กœ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ๊ธฐ๋ณธ์ ์ธ CPU์˜ ๋ช…๋ น์–ด(instructions)์— ๋Œ€ํ•ด์„œ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์ด, ๊ฐœ๋ฐœ(ํŠนํžˆ ๋””๋ฒ„๊น…!)์„ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ์— ์—ฌ๋Ÿฌ๋ถ„์ด ์•Œ์•„ ์ฐจ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒ์„ฑํ•œ x64 ์ฝ”๋“œ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์ด ์•Œ๊ณ  ์žˆ๊ณ , ์‚ฌ๋ž‘ํ•˜๋Š” x86 ์ฝ”๋“œ์™€ ๊ฑฐ์˜ ํก์‚ฌํ•˜๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. IA64 ์ฝ”๋”ฉ์˜ ๊ฒฝ์šฐ๋Š” ๊ทธ๋ ‡๊ฒŒ ์œ ์‚ฌํ•˜์ง€ ์•Š์•˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ , ๋‘๋ฒˆ์งธ๋กœ ์—ฌ๋Ÿฌ๋ถ„์ด ์•Œ์•„์ฐจ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€, ๋ ˆ์ง€์Šคํ„ฐ ์ด๋ฆ„์ด ์—ฌ๋Ÿฌ๋ถ„์ด ์‚ฌ์šฉํ•˜๋˜ ๊ฒƒ๋“ค๊ณผ ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅด๊ณ , ๋ ˆ์ง€์Šคํ„ฐ ์ž์ฒด๋„ ์กฐ๊ธˆ ๋งŽ๋‹ค๋Š” ์  ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์šฉ๋„์˜ x64 ๋ ˆ์ง€์Šคํ„ท๋“ค์˜ ์ด๋ฆ„์€ R๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ, RAX, RBX, ์ด๋Ÿฐ ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ E์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” 32๋น„ํŠธ x86 ๋ ˆ์ง€์Šคํ„ฐ๋“ค์˜ ํ™•์žฅ์ž…๋‹ˆ๋‹ค. ์•„์ฃผ ์˜ค๋ž˜ ์ „์—, 16๋น„ํŠธ AX ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ 32๋น„ํŠธ EAX๊ฐ€ ๋˜๊ณ , 16๋น„ํŠธ BX ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ 32๋น„ํŠธ EBX๊ฐ€ ๋˜์—ˆ๋˜ ๊ฒƒ ์ฒ˜๋Ÿผ ๋ง์ž…๋‹ˆ๋‹ค. 32๋น„ํŠธ๋กœ ์ „์ด๊ฐ€ ๋  ๋•Œ ์ƒ๊ฒจ๋‚œ E ๋ ˆ์ง€์Šคํ„ฐ๋“ค์€ 64๋น„ํŠธ๋กœ ์ด๋™ํ•˜๋ฉด์„œ๋Š” R ๋ ˆ์ง€์Šคํ„ฐ๋“ค์ด ๋œ ๊ฒƒ์ด์ฃ . ๊ทธ๋ž˜์„œ, RAX๋Š” EAX์˜ ๊ณ„์Šน์ž์ด๊ณ , RBX๋Š” EBX์˜ ๊ณ„์Šน, RSI๋Š” ESI, ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ํ™•์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€๋กœ, 8๊ฐœ์˜ ์ผ๋ฐ˜์ ์ธ ์šฉ๋„์˜ ๋ ˆ์ง€์Šคํ„ฐ (R8-R15)๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 64๋น„ํŠธ์—์„œ ์ฃผ๋กœ ์“ฐ์ด๋Š” ์ผ๋ฐ˜์ ์ธ ์šฉ๋„์˜ ๋ ˆ์ง€์Šคํ„ฐ๋“ค์€ ๊ทธ๋ฆผ 5 ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  32๋น„ํŠธ EIP ๋ ˆ์ง€์Šคํ„ฐ๋„ RIP ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  32๋น„ํŠธ ๋ช…๋ น์–ด๋„ ์—ฌ์ „ํžˆ ๊ณ„์† ๋™์ž‘ํ•˜๊ณ  32๋น„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ๋Š” ๋ฌผ๋ก ์ด๊ณ 16๋น„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ๋„ (EAX, AX, AL, AH๋“ฑ๊ณผ ๊ฐ™์€) ์—ฌ์ „ํžˆ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”ฝ ์ž‘์—…์„ ํ•˜๊ฑฐ๋‚˜ ํ˜น์€ ๊ณผํ•™์ ์ธ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•œ ๊ณ ์ˆ˜๋“ค์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก, x64 CPU๋Š” ์—ฌ์ „ํžˆ XMM0์—์„œ XMM15๋กœ ๋ช…๋ช…๋œ 16๊ฐœ์˜ 128๋น„ํŠธ SSE2 ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์™ธ ์—ฌ๊ธฐ์„œ ์ด์•ผ๊ธฐํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ x64 ๋ ˆ์ง€์Šคํ„ฐ๋“ค์— ๋Œ€ํ•œ ๋ชจ๋“  ์ •๋ณด๋“ค์€ WINNT.H ์•ˆ์—์„œ _CONTEXT๋กœ ์ ์ ํ•˜๊ฒŒ #ifdef๋œ ๊ตฌ์กฐ์ฒด์—์„œ ์ฐพ์•„ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ญํŠผ, x64 CPU๋Š” ์–ธ์ œ๋ผ๋„ ๊ตฌํ˜•์˜ 32๋น„ํŠธ ๋ชจ๋“œ ํ˜น์€ 64๋น„ํŠธ ๋ชจ๋“œ ๋‘˜ ๋‹ค ์—์„œ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 32๋น„ํŠธ ๋ชจ๋“œ์—์„œ, CPU๋Š” ๋‹ค๋ฅธ x86 CPU์ฒ˜๋Ÿผ ๋ช…๋ น์–ด๋ฅผ ํ•ด์„ํ•˜๊ณ , ์ด์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. 64๋น„ํŠธ ๋ชจ๋“œ์—์„œ๋Š”, CPU๋Š” ์ƒˆ๋กœ์šด ๋ ˆ์ง€์Šคํ„ฐ์™€ ๋ช…๋ น์–ด๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์–ด๋–ค ํŠน์ • ๋ช…๋ น์–ด ์ธ์ฝ”๋”ฉ์— ๋Œ€ํ•ด์„œ ์•ฝ๊ฐ„์˜ ์‚ฌ์†Œํ•œ ์กฐ์ •์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์—ฌ๋Ÿฌ๋ถ„์ด CPU ์˜คํ”ผ์ฝ”๋“œ ์ธ์ฝ”๋”ฉ ๋‹ค์ด์•„๊ทธ๋žจ(opcode encoding diagram)์— ์ต์ˆ™ํ•˜์‹œ๋‹ค๋ฉด, ์•„๋งˆ๋„, ์ƒˆ๋กœ์šด ๋ช…๋ น์–ด ์ธ์ฝ”๋”ฉ์„ ์œ„ํ•œ ๊ณต๊ฐ„์€ ๋นจ๋ฆฌ ์—†์–ด์ง„๋‹ค๋Š” ๊ฒƒ๊ณผ ์ƒˆ๋กœ์šด ๋ช…๋ น์„ ์œ„ํ•ด ์—ฌ๋Ÿ ๊ฐœ์˜ ์ƒˆ๋กœ์šด ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ฅ์–ด์งœ๋Š” ๊ฒƒ์€ ์‰ฌ์šด ์ผ์€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์‹ค ๊ฒ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘์˜ ํ•˜๋‚˜๋Š”, ๊ฑฐ์˜ ์“ฐ์ด์ง€ ์•Š๋Š” ๋ช…๋ น์–ด๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, x64์—์„œ๋Š” ๊ธฐ์กด์˜ CPU์—์„œ ์‚ฌ์šฉ๋˜๋˜ ๋ช‡ ๊ฐœ์˜ ๋ช…๋ น์–ด๊ฐ€ ์‚ญ์ œ๋˜์—ˆ๊ณ , ์ง€๊ธˆ๊นŒ์ง€, ์ œ๊ฐ€ ์˜ค์ง ๊ทธ๋ฆฌ์›Œ ํ•˜๋Š” ๋ช…๋ น์–ด๋Š” ์Šคํƒ์˜ ์ผ๋ฐ˜์šฉ๋„ ๋ ˆ์ง€์Šคํ„ฐ์˜ ๊ฐ’์„ ๋ชจ๋‘ ์ €์žฅํ–ˆ๋‹ค๊ฐ€, ๋‹ค์‹œ ๋ณต์›ํ•ด ์ฃผ๋Š”, 64๋น„ํŠธ PUSHAD์™€ POPAD ์ž…๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ• ๋ช…๋ น์–ด ์ธ์ฝ”๋”ฉ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๋Š” ๋ฐฉ๋ฒ•์€, 64๋น„ํŠธ์—์„œ ๋” ์ด์ƒ ์“ฐ์ด์ง€ ์•Š๋Š” ์„ธ๊ทธ๋จผํŠธ๊ด€๋ จ ๋ ˆ์ง€์Šคํ„ฐ๋“ค์„ ์ „๋ถ€ ์ œ๊ฑฐํ•ด ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, CS, DS, ES, SS, FS, ๊ทธ๋ฆฌ๊ณ  GS ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ๋” ์ด์ƒ์„ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ์‚ฌ๋žŒ์ด ์ด ๋ ˆ์ง€์Šคํ„ฐ๋“ค์„ ๊ทธ๋ฆฌ์›Œํ•  ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š๊ตฐ์š”.

64๋น„ํŠธ ์ฃผ์†Œ๊ฐ€ ์‚ฌ์šฉ๋จ์— ๋”ฐ๋ผ, ์—ฌ๋Ÿฌ๋ถ„์ด ์ฝ”๋“œ ์‚ฌ์ด์ฆˆ์— ๋Œ€ํ•ด์„œ ๊ถ๊ธˆํ•ด ํ• ์ง€๋„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ, ์•„๋ž˜์˜ ๊ฒฝ์šฐ๋Š” ํ”ํ•œ 32๋น„ํŠธ ๋ช…๋ น์–ด ์ž…๋‹ˆ๋‹ค:

CALL DWORD PTR [XXXXXXXX]
์œ„ ์—์„œ, X๊ฐ€ ๋œ ๋ถ€๋ถ„์ด ๋ฐ”๋กœ 32๋น„ํŠธ ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค. 64๋น„ํŠธ ๋ชจ๋“œ์—์„œ๋Š”, ์œ„์—์„œ X๊ฐ€ ๋œ ๋ถ€๋ถ„์ด 64๋น„ํŠธ ์ฃผ์†Œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, 5๋ฐ”์ดํŠธ ๋ช…๋ น์–ด๊ฐ€ 9๋ฐ”์ดํŠธ๋กœ ๋˜๊ฒ ์ง€์š”? ์šด ์ข‹๊ฒŒ๋„, ๊ทธ๋ ‡์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์–ด๋Š” ์—ฌ์ „ํžˆ ๋˜‘๊ฐ™์€ ์‚ฌ์ด์ฆˆ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. 64๋น„ํŠธ ๋ชจ๋“œ์—์„œ๋Š”, ๋ช…๋ น์–ด์˜ 32๋น„ํŠธ ์˜คํผ๋žœ๋“œ ๋ถ€๋ถ„์€ ํ˜„์žฌ ๋ช…๋ น์–ด์— ์ƒ๋Œ€์ ์ธ ๋ฐ์ดํ„ฐ์˜ ์˜คํ”„์…‹์œผ๋กœ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ํ•˜๋‚˜ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 32๋น„ํŠธ ๋ชจ๋“œ์—์„œ๋Š”, ์•„๋ž˜์˜ ๋ช…๋ น์–ด๊ฐ€ 00020000h๋ฒˆ์ง€์— ์žˆ๋Š” 32๋น„ํŠธ ํฌ์ธํ„ฐ ๊ฐ’์„ ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
00401000: CALL DWORD PTR [00020000h]
64 ๋น„ํŠธ์—์„œ๋Š”, ๋˜‘๊ฐ™์€ ๋ช…๋ น์–ด๊ฐ€ 0042100h(4010000h + 20000h)์— ์žˆ๋Š” 64๋น„ํŠธ ํฌ์ธํ„ฐ ๊ฐ’์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์—ฌ๋Ÿฌ๋ถ„์ด ์—ฌ๋Ÿฌ๋ถ„์ด ์Šค์Šค๋กœ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์กฐ๊ธˆ๋งŒ ์ƒ๊ฐํ•ด ๋ณด์•„๋„ ์ด๋Ÿฌํ•œ ์ƒ๋Œ€ ์ฃผ์†Œ ๋ชจ๋“œ๊ฐ€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์€ ๋ช…๋ น์–ด์— 8 ๋ฐ”์ดํŠธ ํฌ์ธํŠธ ๊ฐ’์„ ์ œ๊ณตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ ๋Œ€์‹ ์—, ์—ฌ๋Ÿฌ๋ถ„์€ ์‹ค์ œ์˜ 64๋น„ํŠธ ๋Œ€์ƒ ์ฃผ์†Œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ณณ์˜ 32๋น„ํŠธ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, 64๋น„ํŠธ ๋Œ€์ƒ ํฌ์ธํ„ฐ๋Š” ๋ฐ˜๋“œ์‹œ ์ด ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ช…๋ น์–ด์™€ 2GB ๋‚ด์™ธ๋กœ(์•ž๋’ค๋กœ ๊ฐ๊ฐ 2GB์”ฉ) ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋งํ•˜์ง€ ์•Š์•„๋„ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ •์ด ์ƒ๊น๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ์ด๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋  ์ด์œ ๊ฐ€ ๋ณ„๋กœ ์—†๊ฒ ์ง€๋งŒ, ๋™์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋“ ์ง€ ํ˜น์€ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด, ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

x64 ๋ ˆ์ง€์Šคํ„ฐ์˜ ๊ฐ€์žฅ ํฐ ์žฅ์  ์ค‘์˜ ํ•˜๋‚˜๋Š”, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์Šคํƒ ๋ณด๋‹ค ๋ชจ๋“  ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ ๋ ˆ์ง€์Šคํ„ฐ์— ์ „๋‹ฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋งˆ์นจ๋‚ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์  ์ž…๋‹ˆ๋‹ค. ์Šคํƒ์— ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ตฌ๊ฒจ ๋„ฃ๋Š” ๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ ์–ต์„ธ์Šค๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ , ์šฐ๋ฆฌ๋Š” CPU ์บ์‰ฌ์— ์—†๋Š” ๋ฉ”๋ชจ๋ฆฌ ์–ต์„ธ์Šค๋Š” RMA์ด ๊ทธ ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ๊นŒ์ง€, ๋ช‡ ์‚ฌ์ดํด ๋™์•ˆ CPU๋ฅผ ์ž ์‹œ ์„œ์žˆ๊ฒŒ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค๋„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹(Calling Convention) ์˜ ๊ฒฝ์šฐ, x64 ๋‚ด๋ถ€๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜์—ฌ _stdcall, _cdecl, _fastcall, _thiscall ๊ฐ™์€ ๊ธฐ์กด์— ์กด์žฌํ•˜๋Š” Win32 ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์„ ๋ชจ์กฐ๋ฆฌ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ๊ฐ€์กŒ์Šต๋‹ˆ๋‹ค. Win64์˜ ๊ฒฝ์šฐ๋Š”, ๋”ฑ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. _cdecl ๊ฐ™์€ ๋ฐฉ์‹์€ ๊ทธ๋ƒฅ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์˜ ๋‹จ์ผํ™”๋Š” ๋ฌด์—‡๋ณด๋‹ค๋„ ๋””๋ฒ„๊น…์„ ์›ํ™œํ•˜๊ฒŒ ํ•˜๋Š”๋ฐ ํฐ ํ˜œํƒ์ž…๋‹ˆ๋‹ค.

x64์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์€ fastcall ๋ฐฉ๋ฒ•๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. x64 ํ˜ธ์ถœ ๋ฐฉ์‹์—์„œ๋Š”, ์ฒ˜์Œ ๋„ค ๊ฐœ์˜ ์ •์ˆ˜ ์ธ์ž๊ฐ€ ์ด ๋ชฉ์ ์„ ์œ„ํ•ด ๋””์ž์ธ๋œ ๋ ˆ์ง€์Šคํ„ฐ์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค:

 RCX: 1๋ฒˆ์งธ ์ •์ˆ˜ ์ธ์ž  
RDX: 2๋ฒˆ์งธ ์ •์ˆ˜ ์ธ์ž
R8: 3 ๋ฒˆ์งธ ์ •์ˆ˜ ์ธ์ž
R9: 4๋ฒˆ์งธ ์ •์ˆ˜ ์ธ์ž

๋„ค ๊ฐœ ์ด์ƒ์˜ ์ •์ˆ˜ ์ธ์ž๋Š” ์Šคํƒ์„ ํ†ตํ•ด์„œ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  this ํฌ์ธํ„ฐ๋Š” ์ •์ˆ˜ ์ธ์ž๋กœ ๊ฐ„์ฃผ๋˜์–ด ํ•ญ์ƒ RCX ๋ ˆ์ง€์Šคํ„ฐ์—์„œ ๋ฐœ๊ฒฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ€๋™ ์†Œ์ˆ˜์  ์ธ์ž๋“ค์— ๋Œ€ํ•ด์„œ๋Š”, ์ฒ˜์Œ ๋„ค ๊ฐœ์˜ ์ธ์ž๋“ค์€ XMM0์—์„œ๋ถ€ํ„ฐ XMM3 ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ํ†ตํ•ด์„œ ์ „๋‹ฌ๋˜๊ณ , ๋‚˜๋จธ์ง€ ๋ถ€๋™ ์ธ์ž๋“ค์€ ์“ฐ๋ ˆ๋“œ ์Šคํƒ์„ ํ†ตํ•ด์„œ ์ „๋‹ฌ ๋ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ ์กฐ๊ทธ๋งŒ ๋” ๊นŠ์ˆ™์ด ๋“ค์–ด๊ฐ€๋ฉด, ์ธ์ž๋“ค์ด ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ํ†ตํ•ด์„œ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์ปดํŒŒ์ผ๋Ÿฌ๋Š” RSP ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๊ฐ์†Œ์‹œํ‚ค๋ฉด์„œ, ์—ฌ์ „ํžˆ ์Šคํƒ์— ๊ณต๊ฐ„์„ ์˜ˆ์•ฝํ•ด ๋†“์Šต๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ, ๊ฐ๊ฐ์˜ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ 32๋ฐ”์ดํŠธ (๋„ค ๊ฐœ์˜ 64๋น„ํŠธ ๊ฐ’)์„ ์˜ˆ์•ฝํ•ด ๋†“์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณต๊ฐ„์€ ๋ ˆ์ง€์Šคํ„ฐ๋“ค์ด ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜์–ด, ์ž˜ ์•Œ๋ ค์ง„ ์Šคํƒ ์œ„์น˜์— ์‰ฝ๊ฒŒ ๋ณต์‚ฌ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก , ๋ถˆ๋ฆฌ๋Š” ํ•จ์ˆ˜ ์ธก์—์„œ ํ•จ์ˆ˜์˜ ์ธ์ž๋ฅผ ์ฑ„์šฐ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์ด๋Ÿฌํ•œ ์Šคํƒ ๊ณต๊ฐ„์˜ ์˜ˆ์•ฝ์€, ํ•จ์ˆ˜ ์ธ์ž๋“ค์ด ๋ ˆ์ง€์Šคํ„ฐ์—์„œ ์‰ฝ๊ฒŒ ์Šคํƒ์œผ๋กœ์˜ ๋ณต์‚ฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก , ๋„ค ๊ฐœ ์ด์ƒ์˜ ์ธ์ž๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค๋ฉด, ์ ์ ˆํ•œ ์Šคํƒ์˜ ์ถ”๊ฐ€ ๊ณต๊ฐ„์ด ๋ฐ˜๋“œ์‹œ ์˜ˆ์•ฝ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ํ•œ ๋ฒˆ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ์ž์‹ ํ•จ์ˆ˜์—๊ฒŒ ๋‘ ๊ฐœ์˜ ์ •์ˆ˜ ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •์„ ํ•œ ๋ฒˆ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‘ ๊ฐœ์˜ ์ธ์ž๋ฅผ ๊ฐ๊ฐ RCX์™€ RDX์— ๊ฐ๊ฐ ์ „๋‹ฌํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, RSP ์Šคํƒ ํฌ์ธํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ์—์„œ 32๋ฐ”์ดํŠธ๋ฅผ ๋นผ๋†“์Šต๋‹ˆ๋‹ค. ๋ถˆ๋ฆฌ๋Š” ํ•จ์ˆ˜ ์ž…์žฅ์—์„œ๋Š”, ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์„ RCX์™€ RDX ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ํ†ตํ•ด์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ, ๋ถˆ๋ฆฌ๋Š” ํ•จ์ˆ˜ ์ฝ”๋“œ๊ฐ€ ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ๋‹ค๋ฅธ ์ด์œ ์—์„œ ํ•„์š”ํ•  ๊ฒฝ์šฐ, ์ด ๊ฐ’๋“ค์€ ์˜ˆ์•ฝ๋œ 32๋ฐ”์ดํŠธ ์Šคํƒ ์˜์—ญ์— ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆผ 6์€ 6๊ฐœ์˜ ์ •์ˆ˜ ์ธ์ž๊ฐ€ ์ „๋‹ฌ๋œ ๋’ค์˜ ๋ ˆ์ง€์Šคํ„ฐ์™€ ์Šคํƒ์„ ๋ณด์—ฌ ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆผ 6 shows the registers and stack after six integer parameters have been passed.

Figure 6 ์ •์ˆ˜์˜ ์ „๋‹ฌ
Figure 6 ์ •์ˆ˜์˜ ์ „๋‹ฌ

x64 ์‹œ์Šคํ…œ์—์„œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์Šคํƒ ์ •๋ฆฌ๋Š” ์•ฝ๊ฐ„ ์žฌ๋ฐŒ๋Š” ๋ชจ์Šต์„ ๋ณด์—ฌ ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์ˆ ์ ์œผ๋กœ๋Š”, ๋ถˆ๋ฆฌ๋Š” ํ•จ์ˆ˜(callee)๊ฐ€ ์•„๋‹Œ, ๋ถ€๋ฅด๋Š” ํ•จ์ˆ˜(caller)๊ฐ€ ์Šคํƒ์˜ ์ •๋ฆฌ๋ฅผ ์ฑ…์ž„์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์—ฌ๋Ÿฌ๋ถ„์€ ํ”„๋กœ๋กค๊ทธ์™€ ์—ํ•„๋กœ๊ทธ ์ฝ”๋“œ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‹ค๋ฅธ ๋ถ€๋ถ„์—์„œ RSP๋ฅผ ์กฐ์ •ํ•˜๋Š” ๋ชจ์Šต์„ ๊ฑฐ์˜ ๋ณด๊ธฐ๊ฐ€ ํž˜๋“ค ๊ฒƒ ์ž…๋‹ˆ๋‹ค. PUSH์™€ POP ๋ช…๋ น์–ด๋กœ ์Šคํƒ์—์„œ ์ธ์ž๋ฅผ ๋”ํ•˜๊ฑฐ๋‚˜ ๋นผ์ฃผ๋Š” x86 ์ปดํŒŒ์ผ๋Ÿฌ์™€ ๋‹ค๋ฅด๊ฒŒ, x64 ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๋Š” (ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ž…์žฅ์—์„œ ๋ณด๋ฉด) ์–ผ๋งˆ๋“ ์ง€ ํฐ ๋Œ€์ƒ ํ•จ์ˆ˜์—์„œ๋„ ์“ธ ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ถฉ๋ถ„ํ•œ ์Šคํƒ์„ ์˜ˆ์•ฝํ•ด ๋†“์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, ์ž์‹ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ์‹œ์—, ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋˜‘๊ฐ™์€ ์Šคํƒ ์˜์—ญ์„ ๊ณ„์† ๋ฐ˜๋ณตํ•ด์„œ ์”๋‹ˆ๋‹ค.

์งง๊ฒŒ ๋งํ•ด์„œ, RSP ๋ ˆ์ง€์Šคํ„ฐ๋Š” ๊ฑฐ์˜ ๋ณ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ ์€ ESP ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์ด ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์Šคํƒ์— ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ •๋ฆฌ๋˜๋ฉด์„œ, ๊ณ„์† ๋ณ€ํ•˜๋Š” x86 ์ฝ”๋“œ์™€ ์ƒ๋‹นํžˆ ํ‹€๋ฆฝ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ํ•˜๋‚˜ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์„ธ ๊ฐœ์˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” x64 ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ฒ˜์Œ ํ•จ์ˆ˜๋Š” ๋„ค ๊ฐœ์˜ ์ธ์ž(0x20 ๋ฐ”์ดํŠธ=32๋ฐ”์ดํŠธ)๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋‘๋ฒˆ์งธ ์ธ์ž๋Š” ์—ด ๋‘๊ฐœ์˜ ์ธ์ž(0x60๋ฐ”์ดํŠธ=96๋ฐ”์ดํŠธ)๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์„ธ๋ฒˆ์งธ ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿ ๊ฐœ์˜ ์ธ์ž(0x40=64๋ฐ”์ดํŠธ)๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ํ”„๋กค๋กœ๊ทธ์—์„œ๋Š”, ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋Š”, ์Šคํƒ์— ๋‹จ์ง€ 96๋ฐ”์ดํŠธ๋งŒ ์˜ˆ์•ฝํ•ด์„œ ๋Œ€์ƒ ํ•จ์ˆ˜๊ฐ€ ์ธ์ž๋“ค์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก, 96 ๋ฐ”์ดํŠธ ์•ˆ์˜ ์ ์ ˆํ•œ ์œ„์น˜์— ์ธ์ž๋“ค์„ ๋ณต์‚ฌํ•ด ๋†“์Šต๋‹ˆ๋‹ค.

x86 ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ข€ ๋” ์ž์„ธํ•œ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋Š” Raymond Chen's blog (์˜๋ฌธ) ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์— ๋Œ€ํ•ด์„œ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง€๋Š” ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค๋งŒ, ๋ช‡ ๊ฐ€์ง€๋งŒ ์ค‘์š”ํ•œ ์ ์„ ๋” ๋ง์”€ ๋“œ๋ฆฌ์ž๋ฉด. ์ฒซ ๋ฒˆ์งธ, ํ•จ์ˆ˜์˜ ์ธ์ž๋“ค ์ค‘, ์ฒ˜์Œ ๋„ค ๊ฐœ์˜ ์ธ์ž๋“ค ์ค‘์—์„œ, 64๋น„ํŠธ ๋ณด๋‹ค ์ ์€ ์ •์ˆ˜ ์ธ์ž๋“ค์€ ๋ถ€ํ˜ธ ํ™•์žฅ(sign extended)์ด ์ผ์–ด๋‚˜๊ณ , ์ ์ ˆํ•œ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ํ†ตํ•˜์—ฌ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋กœ, 64๋น„ํŠธ ์–ผ๋ผ์ธ์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด์„œ, ์ ˆ๋Œ€๋กœ 8๋ฐ”์ดํŠธ์˜ ์ •์ˆ˜๋ฐฐ๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜ ์ธ์ž๊ฐ€ ์Šคํƒ์— ์กด์žฌํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด๋ฅผ ํฌํ•จํ•ด์„œ, 1, 2, 4, ํ˜น์€ 8 ๋ฐ”์ดํŠธ๊ฐ€ ์•„๋‹Œ ์ธ์ž๋“ค์€ ๋ž˜ํผ๋Ÿฐ์Šค๋ฅผ ํ†ตํ•ด์„œ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ, 8,16,32, 64๋น„ํŠธ์˜ ๊ตฌ์กฐ์ฒด์™€ ๊ณ ์šฉ์ฒด๋Š” ๋™์ผํ•œ ํฌ๊ธฐ์˜ ์ •์ˆ˜ ์ธ ๊ฒƒ ์ฒ˜๋Ÿผ, ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ๊ฒฐ๊ณผ ๊ฐ’์€ RAX ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋ถ€๋™ ์†Œ์ˆ˜์  ํ˜•์‹์˜ ๊ฐ’์€ ์˜ˆ์™ธ์ ์œผ๋กœ XMM0์œผ๋กœ ๋Œ๋ ค ๋ฐ›์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ†ตํ•˜์—ฌ, ์ œ๊ฐ€ ๋ง์”€๋“œ๋ฆฌ๋Š” ๋ ˆ์ง€์Šคํ„ฐ๋“ค์€ ์˜ˆ์•ฝ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: RBX, RBP, RDI, RSI, R12, R13, R14, ๊ทธ๋ฆฌ๊ณ  R15. ๊ทธ๋ฆฌ๊ณ  ์ง€๊ธˆ ๋ง์”€๋“œ๋ฆฌ๋Š” ๋ ˆ์ง€์Šคํ„ฐ๋“ค์€ ํœ˜๋ฐœ์„ฑ์ด๊ณ , ๊ฐ’์ด ์—†์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:RAX, RCX, RDX, R8, R9, R10, ๊ทธ๋ฆฌ๊ณ  R11.

์œ„์—์„œ ์ œ๊ฐ€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์ผํ™˜์œผ๋กœ, ์šด์˜์ฒด์ œ๊ฐ€ ์Šคํƒ ํ”„๋ ˆ์ž„์„ ๊ฒ€์‚ฌํ•œ๋‹ค๊ณ  ๋ง์”€ ๋“œ๋ ธ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์ด ํ•œ ๋ฒˆ์ด๋ผ๋„, ์Šคํƒ์„ ๊ฒ€์‚ฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์จ๋ณด์‹  ์ ์ด ์žˆ๋‹ค๋ฉด, ๊ฑฐ์˜ ์ž„์‹œ์ ์ธ Win32 ํ”„๋ ˆ์ž„์˜ ๋ ˆ์ด์•„์›ƒ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ค๋ฃจ๊ธฐ ํž˜๋“ค๊ฒŒ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•„์‹ค ๊ฒ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์ด x64์—์„œ๋Š” ๋” ์ข‹์•„์กŒ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ•จ์ˆ˜๊ฐ€ ์Šคํƒ ๊ณต๊ฐ„์„ ํ• ๋‹นํ•˜๊ณ , ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์–ด๋–ค ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์˜ˆ์•ฝํ•˜๊ฑฐ๋‚˜, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋‹ค๋ฉด, ๊ทธ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ ํ‘œ์ค€ํ™”๋œ ํ”„๋กค๋กœ๊ทธ์™€ ์—ํ•„๋กœ๊ทธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์ž˜ ์ •์˜๋œ ๋ช…๋ น์–ด ์ง‘ํ•ฉ(well-defined set of instructions)์„ ์จ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ‘œ์ค€ํ™”๋œ ํ•จ์ˆ˜์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์€, ์šด์˜์ฒด์ œ๊ฐ€ ์Šคํƒ์„ ์–ธ์ œ๋“ ์ง€ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๋Š” ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ผ๊ด€์„ฑ์—, ํ‘œ์ค€ํ™”๋œ ํ”„๋กค๋กœ๊ทธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ๋Ÿฌ์™€ ๋ง์ปค๋Š” ๊ด€๋ จ๋œ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ถ๊ธˆํ•˜์‹  ๋ถ„๋“ค์„ ์œ„ํ•ด์„œ, ์ข€ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๋ฉด, ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ•จ์ˆ˜ ์ •๋ณด๋“ค์€ winnt.h์— ์ •์˜๋˜์–ด ์žˆ๋Š” IMAGE_FUNCTION_ENTRY64์˜ ๋ฐฐ์—ด ํ…Œ์ด๋ธ”์— ์ €์žฅ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๊ทธ ํ…Œ์ด๋ธ”์„ ์ฐพ๋Š”์ง€ ๊ถ๊ธˆํ•˜์‹œ๋‹ค๊ตฌ์š”? ๊ทธ ํ…Œ์ด๋ธ”์€ PEํ—ค๋”์˜ ๋ฐ์ดํ„ฐ ๋””๋ ‰ํ† ๋ฆฌ ์˜์—ญ ์•ˆ์— IMAGE_DIRECTORY_ENTRY_EXCEPTION์˜ ์—”ํŠธ๋ฆฌ๊ฐ€ ์ง€์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ๋‹นํžˆ ์งง์€ ๋ถ„๋Ÿ‰์ด์ง€๋งŒ, ๋‚ด๋ถ€๊ตฌ์กฐ์˜ ๋งŽ์€ ๋ถ€๋ถ„์„ ๋‹ค๋ฃจ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, x86์— ๋Œ€ํ•œ ํฐ ๊ฐœ๋…๊ณผ 32๋น„ํŠธ ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด์— ๋Œ€ํ•œ ์ง€์‹์ด ์žˆ์œผ์‹  ๋ถ„๋“ค์€, ์ƒ๋‹นํžˆ ์งง์€ ์‹œ๊ฐ„ ์•ˆ์— x64 ๋ช…๋ น์–ด๋ฅผ ์ดํ•ดํ•˜์‹ค ์ˆ˜ ์žˆ์œผ์‹ค ๊ฒ๋‹ˆ๋‹ค.


ํŽ˜์ด์ง€ ๋งจ ์œ„๋กœํŽ˜์ด์ง€ ๋งจ ์œ„๋กœ


Visual C++๋กœ x64์šฉ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ

Visual Studioยฎ 2005 ์ด์ „์—๋„ ๋งˆ์ดํฌ๋กœ ์†Œํ”„ํŠธ์—์„œ ๋‚˜์˜จ C++ ์ปดํŒŒ์ผ๋Ÿฌ๋กœ x64์šฉ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒŒ ๊ฐ€๋Šฅํ–ˆ์ง€๋งŒ, IDE์™€ ์™„๋ฒฝํžˆ ํ†ตํ•ฉ์€ ๋˜์ง€ ์•Š์•˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š”, ์ €๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด Visual Studioยฎ 2005๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์—ฌ๋Ÿฌ๋ถ„์ด x64์šฉ ๋„๊ตฌ (๊ธฐ๋ณธ ์„ค์น˜ ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค.)์„ ์„ ํƒํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ด ๊ธ€์„ ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ , ์—ฌ๋Ÿฌ๋ถ„์ด ๊ธฐ์กด์— Win32 ์‚ฌ์šฉ์ž ๋ชจ๋“œ์—์„œ C++๋ฅผ ์ด์šฉํ•œ ํ”„๋กœ์ ํŠธ ๊ฒฝํ—˜์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

x64๋ฅผ ์œ„ํ•œ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š”, 64๋น„ํŠธ ๋นŒ๋“œ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ๋‹ค ์•„์‹œ๊ฒ ์ง€๋งŒ, ์—ฌ๋Ÿฌ๋ถ„ ํ”„๋กœ์ ํŠธ์—๋Š” ๊ธฐ๋ณธ์œผ๋กœ ๋‘ ๊ฐœ์˜ ํ™˜๊ฒฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Debug์™€ Retail์ด ๊ทธ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์ด ์—ฌ๊ธฐ์—์„œ ๋” ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€, ๋‘ ๊ฐœ์˜ ํ™˜๊ฒฝ์„ ๋” ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ ๋ฟ์ž…๋‹ˆ๋‹ค. x64๋ฅผ ์œ„ํ•œ Debug์™€ Retail ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

๊ธฐ์กด์˜ ํ”„๋กœ์ ํŠธ ํ˜น์€ ์†”๋ฃจ์…˜์„ ํ•œ ๋ฒˆ ์—ด์–ด ๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋นŒ๋“œ ๋ฉ”๋‰ด์—์„œ, Configuration Manager๋ฅผ ์„ ํƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. Configuration Manager ๋‹ค์ด์–ผ๋กœ๊ทธ ๋ฐ•์Šค์—์„œ, Active Solution Plaftfrom ์ฝค๋ณด ๋ฐ•์Šค๋ฅผ ๋ˆŒ๋Ÿฌ์„œ, New๋ฅผ ์„ ํƒํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค(๊ทธ๋ฆผ 7 ). ๊ทธ๋Ÿฌ๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์€ New Solution Plaftform์ด๋ผ๊ณ  ๋ช…๋ช…๋œ ๋‹ค๋ฅธ ๋‹ค์ด์–ผ๋กœ๊ทธ๋ฅผ ๋ณด์‹ค ์ˆ˜ ์žˆ์„ ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆผ7 ์ƒˆ๋กœ์šด ๋นŒ๋“œ ํ™˜๊ฒฝ์˜ ์ƒ์„ฑ
๊ทธ๋ฆผ7 ์ƒˆ๋กœ์šด ๋นŒ๋“œ ํ™˜๊ฒฝ์˜ ์ƒ์„ฑ

x64๋ฅผ ์ƒˆ ํ”Œ๋žซํผ(๊ทธ๋ฆผ 8)๋กœ ์„ ํƒํ•˜๊ณ , ๋‹ค๋ฅธ ์„ค์ •์€ ๊ทธ๋ƒฅ ๋†”๋‘์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค; ๊ทธ๋ฆฌ๊ณ  OK๋ฅผ ํด๋ฆญํ•˜์„ธ์š”. ๊ทธ๊ฒŒ ์ „๋ถ€๋ž๋‹ˆ๋‹ค! ์—ฌ๋Ÿฌ๋ถ„์€ ์ด์ œ ๋„ค ๊ฐ€์ง€์˜ ๊ฐ€๋Šฅํ•œ ๋นŒ๋“œ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜์…จ์Šต๋‹ˆ๋‹ค: Win32 Debug, Win32 Retail, x64 Debug, x64 Retail. Configuration Manager ๋ฅผ ์ด์šฉํ•ด์„œ, ์‰ฝ๊ฒŒ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์œผ๋กœ์˜ ๋ณ€๊ฒฝ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ž, ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ 64๋น„ํŠธ์— ์ ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ํ•œ ๋ฒˆ ์‚ดํŽด ๋ณด๊ธฐ๋กœ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. x64 Debug ์„ค์ •์„ ๊ธฐ๋ณธ์œผ๋กœ ๋†“์œผ์‹œ๊ณ , ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•ด ๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ž์ฒด๊ฐ€ ์•„์ฃผ ๊ฐ€๋ณ์ง€ ์•Š์€ ์ด์ƒ, Win32 ํ™˜๊ฒฝ์—์„œ ๋ณผ ์ˆ˜ ์—†์—ˆ๋˜ ์ปดํŒŒ์ผ ์—๋Ÿฌ๋“ค์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์ด ํฌํŒ…์ด ๋ถˆ๊ฐ€๋Šฅํ•  ์ •๋„์˜ C++์ฝ”๋“œ๋ฅผ ์“ฐ์ง€ ์•Š๋Š” ์ด์ƒ, ์ƒ๋Œ€์ ์œผ๋กœ ์‰ฌ์šด ์—๋Ÿฌ ๋ช‡ ๊ฐœ๋งŒ ๋ฐœ์ƒํ•ด์„œ, ์—ฌ๋Ÿฌ๋ถ„์€ ์‰ฝ๊ฒŒ Win32์™€ x64์— ๋Œ€์‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋  ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ํŠน๋ณ„ํžˆ ์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ ๊ฐ™์€ ๊ฒƒ์„ ์ด์šฉํ•˜์ง€ ์•Š์•„๋„ ๋ง์ด์ฃ .

๊ทธ๋ฆผ 8 ๋นŒ๋“œ ํ”Œ๋žซํผ์˜ ์„ ํƒ
๊ทธ๋ฆผ 8 ๋นŒ๋“œ ํ”Œ๋žซํผ์˜ ์„ ํƒ


ํŽ˜์ด์ง€ ๋งจ ์œ„๋กœํŽ˜์ด์ง€ ๋งจ ์œ„๋กœ


Win64 ํ˜ธํ™˜๋˜๋Š” ์ฝ”๋“œ ๋งŒ๋“ค๊ธฐ

์•„๋งˆ๋„, Win32 ์ฝ”๋“œ์—์„œ x64๋กœ ์ปจ๋ฒˆํŒ…ํ•  ๋•Œ ๊ฐ€์žฅ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„์€, ํƒ€์ž… ์ •์˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ผ์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ํ˜น์‹œ ์•ž์—์„œ Win64์˜ ์ž๋ฃŒํ˜•์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐ ํ–ˆ๋˜ ๊ฒƒ์— ๋Œ€ํ•ด์„œ ๊ธฐ์–ตํ•˜์‹œ๋‚˜์š”? C++ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์›๋ž˜ ์ž๋ฃŒํ˜• (int, long ๊ธฐํƒ€ ๋“ฑ๋“ฑ) ์„ ์“ฐ๋Š” ๊ฒƒ ๋ณด๋‹ค, ์œˆ๋„์šฐ์—์„œ ์ •์˜ํ•œ typedef๋กœ ์ •์˜๋œ ์ž๋ฃŒํ˜•์„ ์“ฐ๋Š” ํŽธ์ด ๊นจ๋—ํ•œ Win32 x64 ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Win32์˜ ์ž๋ฃŒํ˜•์„ ์“ฐ์‹ค ๋•Œ, ์ผ๊ด€์„ฑ์žˆ๊ฒŒ ์“ฐ์…”์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ, ์œˆ๋„์šฐ๊ฐ€ HWND์„ ๋„˜๊ฒจ์ค„ ๋•Œ, ๋‹จ์ง€ ํŽธํ•˜๊ณ  ์‰ฝ๋‹ค๊ณ  ํ•ด์„œ, FARPROC ํ˜•์‹์˜ ๋ณ€์ˆ˜์— ์ด ๊ฐ’์„ ์ €์žฅํ•˜์ง€ ๋งˆ์‹ญ์‹œ์š”.

๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•˜๋ฉด์„œ, ์•„๋งˆ๋„ ์ œ๊ฐ€ ํ”ํžˆ ๊ทธ๋ฆฌ๊ณ  ์‰ฝ๊ฒŒ ๋ณด๋Š” ์—๋Ÿฌ๋Š”, ํฌ์ธํ„ฐ ๊ฐ’์ด 32๋น„ํŠธ ๋ฐ์ดํƒ€ ํƒ€์ž…์ธ int ํ˜น์€ long, ๊ทธ๋ฆฌ๊ณ  DWORD์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฒƒ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. Win32์™€ Win64์—์„œ์˜ ํฌ์ธํ„ฐ๋Š” ์‚ฌ์ด์ฆˆ๋Š” ํ‹€๋ฆฌ์ง€๋งŒ, ์ •์ˆ˜ํ˜•์€ ๋™์ผํ•œ ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ํฌ์ธํ„ฐ ๊ฐ’์„ ์ •์ˆ˜ํ˜•์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ๊ธˆ์ง€ํ•˜๋Š” ๊ฒƒ ์—ญ์‹œ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ, ์œˆ๋„์šฐ ํ—ค๋”์—๋Š” _PTR ํƒ€์ž…์ด ์„ ์–ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, DWORD_PTR, INT_PTR, ๊ทธ๋ฆฌ๊ณ  LONG_PTR ๊ฐ™์€ ํƒ€์ž…๋“ค์ด ๋Œ€์ƒ ํ”Œ๋žซํผ์— ๋”ฐ๋ผ์„œ, ์•ˆ์ „ํ•˜๊ฒŒ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ, DWORD_PTRํƒ€์ž…์€ Win32์—์„œ ์ปดํŒŒ์ผ ๋˜์—ˆ์„ ๋•Œ๋Š”, 32๋น„ํŠธ์ง€๋งŒ, Win64์—์„œ๋Š” 64๋น„ํŠธ์ž…๋‹ˆ๋‹ค. ์ €์˜ ๊ฒฝ์šฐ๋Š”, ๊ทธ๋™์•ˆ์˜ ์—ฐ์Šต์œผ๋กœ, ์–ด๋–ค ์ž๋ฃŒํ˜•์„ ์„ ์–ธํ•  ๋•Œ, "๋‚ด๊ฐ€ ์—ฌ๊ธฐ์„œ DWORD๋ฅผ ์„ ์–ธํ•ด์•ผ ํ• ๊นŒ? ์•„๋‹ˆ๋ฉด DWORD_PTR๋ฅผ ์„ ์–ธํ•ด์•ผ ํ• ๊นŒ?"๋ผ๊ณ  ๋ฌผ์–ด๋ณด๋Š” ๊ฒƒ์ด ๋ฒ„๋ฆ‡์ด ๋˜์–ด ๋ฒ„๋ ธ๋‹ต๋‹ˆ๋‹ค.

๊ธฐ๋Œ€ํ•˜์‹œ๋Š” ๋Œ€๋กœ, ์ •์ˆ˜ํ˜•์—์„œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ฐ”์ดํŠธ๋ฅผ ์›ํ•˜๋Š”์ง€ ๊ณ„์‚ฐํ•˜๋Š”๋ฐ, ์•ฝ๊ฐ„์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DWORD_PTR๋ฅผ ์ •์˜ํ•˜๋Š” ํ—ค๋”ํŒŒ์ผ(basetsd.h)์—์„œ ์—ญ์‹œ INT32, INT64, INT16, UINT32, DWORD64 ๊ฐ™์€ ์—ฌ๋Ÿฌ ํ˜•ํƒœ์˜ ์ •์ˆ˜๋ฅผ ์„ ์–ธํ•ด ๋†“๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ž๋ฃŒํ˜•์˜ ํฌ๊ธฐ์— ๊ด€๋ จ๋œ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” printf์™€ sprintf์˜ ํฌ๋งทํŒ…(formatting)์ž…๋‹ˆ๋‹ค. ์ €๋Š” ํ™•์‹คํžˆ ๊ณผ๊ฑฐ์— %X ํ˜น์€ %08X๋“ฑ์„ ํฌ์ธํ„ฐ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ ์‚ฌ์šฉํ–ˆ๋‹ค๋Š” ์ ์—์„œ ์•ฝ๊ฐ„์˜ ์ฃ„์ฑ…๊ฐ(?)์„ ๋Š๋ผ๊ณ  ์žˆ๊ณ , ๊ทธ ์ฝ”๋“œ๋Š” x64 ์‹œ์Šคํ…œ์—์„œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ณ์€ ๋ฐฉ์‹์€ ๋Œ€์ƒ ํ”Œ๋žซํผ์˜ ํฌ์ธํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ์ž๋™์œผ๋กœ ๊ณ„์‚ฐํ•ด ์ฃผ๋Š” %p๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋กœ, printf์™€ sprintf๋Š” ์‚ฌ์ด์ฆˆ์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ํƒ€์ž…์ธ 'I' ํ”„๋ฆฌํ”ฝ์Šค(prefix)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ, ์—ฌ๋Ÿฌ๋ถ„์€ %Iu๋ฅผ UINT_PTR ๋ณ€์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ, ์—ฌ๋Ÿฌ๋ถ„์ด ํŠน์ • ๋ณ€์ˆ˜๊ฐ€ ์–ธ์ œ 64๋น„ํŠธ ๋ถ€ํ˜ธ ์žˆ๋Š” ๊ฐ’์ด ๋  ๊ฒƒ์ด๋ผ๋Š” ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด, %I64d๋ฅผ ์“ฐ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž๋ฃŒํ˜•์˜ ๋ถˆ์ผ์น˜์—์„œ ์ผ์–ด๋‚œ ์—๋Ÿฌ๋“ค์„ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” Win64๊ฐ€ ์ค€๋น„๋˜์—ˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์€ ์•„์ง์€ ์•„๋งˆ๋„ x86์—์„œ๋งŒ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ๊ณ„์‹ค๊ฒ๋‹ˆ๋‹ค. Win64๋กœ์˜ ํฌํŒ…์„ ์œ„ํ•ด์„œ, ํŠน์ • ์ฝ”๋“œ์—์„œ๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด Win32์™€ x64๋ฅผ ์œ„ํ•œ ๋‘ ๊ฐ€์ง€ ๋ฒ„์ ผ์˜ ํ•จ์ˆ˜๋ฅผ ์“ฐ์‹ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ์•ผ๋ง๋กœ, ์ „์ฒ˜๋ฆฌ์ž(preprocessor)๊ฐ€ ์•„์ฃผ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ž…๋‹ˆ๋‹ค:

_M_IX86 
_M_AMD64
_WIN64
์ „์ ˆํ•œ ์ „์ฒ˜๋ฆฌ์ž์˜ ์‚ฌ์šฉ์ด์•ผ ๋ง๋กœ, ์—ฌ๋Ÿฌ ํ”Œ๋žซํผ์—์„œ ๋™์ž‘ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. _M_IX86๊ณผ _M_AMD64๋Š” ํŠน์ • ํ”„๋กœ์„ธ์„œ๋ฅผ ์œ„ํ•ด์„œ ์ปดํŒŒ์ผํ•  ๋•Œ๋ฅผ ์œ„ํ•ด์„œ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ „์ฒ˜๋ฆฌ์ž ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ๋ญ˜ ์›ํ•˜๋Š”์ง€ ํ•œ ๋ฒˆ ์—ด์‹ฌํžˆ ์ƒ๊ฐํ•ด ๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ, ์ด ์ฝ”๋“œ๊ฐ€ ์ •๋ง๋กœ x64 ํ”„๋กœ์„ธ์„œ๋งŒ์„ ์œ„ํ•œ ๊ฒƒ์ด๋ผ๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด ๋งคํฌ๋กœ๋ฅผ ์“ฐ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค:

#ifdef _M_AMD64
๋ฐ˜๋ฉด์—, ๋™์ผํ•œ ์ฝ”๋“œ๊ฐ€ x64์™€ ์•„์ดํ…œ๋‹ˆ์›€(Itanium)์—์„œ ๋™์ž‘ํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์“ฐ์‹œ๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค:
#ifdef _WIN64

์ด๋Ÿฌํ•œ ๋งคํฌ๋กœ๋ฅผ ์“ธ ๋•Œ ์ œ๊ฐ€ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ๋Š” ๋ฒ„๋ฆ‡์ด ํ•˜๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ œ๊ฐ€ ๋ฌด์—‡์„ ์žŠ์–ด ๋ฒ„๋ ธ์„ ๋•Œ๋ฅผ ๋Œ€๋น„ํ•ด์„œ, ๋ช…์‹œ์ ์œผ๋กœ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ #else ์ผ€์ด์Šค๋ฌธ์„ ์จ์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์— ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ ์‚ดํŽด๋ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค:

#ifdef _M_AMD64 
// My x64 code here
#else
// My x86 code here
#endif
๋˜ ๋‹ค๋ฅธ ์„ธ๋ฒˆ์งธ CPU๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด? ์ €์˜ x86 ์ฝ”๋“œ๊ฐ€ ์ €์˜ ์˜๋„์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์ปดํŒŒ์ผ ๋ฉ๋‹ˆ๋‹ค. ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค:
#ifdef _M_AMD64 
// My x64 code here
#elif defined (_M_IX86)
// My x86 code here
#else
#error !!! Need to write code for this architecture
#endif

๊ทธ๋ฆฌ๊ณ , ๋งˆ์ง€๋ง‰์œผ๋กœ ์ €์˜ ๊ฒฝ์šฐ๋Š” Win32์ฝ”๋“œ ์ค‘์—์„œ x64๋กœ ์‰ฝ๊ฒŒ ํฌํŒ…๋˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„ ์ค‘์˜ ํ•˜๋‚˜๋Š” ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋Ÿฌ ๋ถ€๋ถ„์ด์—ˆ์Šต๋‹ˆ๋‹ค. Visual C++๊ฐ€ x64 ๋ฅผ ์œ„ํ•œ ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋Ÿฌ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ฑฐ๋“ ์š”. ๋Œ€์‹ ์— 64๋น„ํŠธ MASM์ด ์ œ๊ณต๋˜๊ณ , MSDN์— ๋ฌธ์„œํ™”๊ฐ€ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ML64.exe์™€ ๋‹ค๋ฅธ x64ํˆด๋“ค์€ (CL.EXE์™€ LINK.EXE๋ฅผ ํฌํ•จํ•ด์„œ) ์ปค๋ฉ˜๋“œ๋ผ์ธ์—์„œ๋„ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ VCVARS64.BAT๋ฅผ ์‹คํ–‰์‹œํ‚ค์„ธ์š”. ๊ทธ๋Ÿฌ๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ํŒจ์Šค์— ์ด ํŒŒ์ผ๋“ค์˜ ๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•ด ์ค„ ๊ฒƒ ์ž…๋‹ˆ๋‹ค.


ํŽ˜์ด์ง€ ๋งจ ์œ„๋กœํŽ˜์ด์ง€ ๋งจ ์œ„๋กœ


๋””๋ฒ„๊น…

์—ฌ๋Ÿฌ๋ถ„์€ ๋งˆ์นจ๋‚ด, ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๋ฅผ Win32์™€ x64 ์–‘์ชฝ์—์„œ ๊นจ๋—ํ•˜๊ฒŒ ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋Œ€์žฅ์ •์˜ ๋งˆ์ง€๋ง‰์€ "์–ด๋–ป๊ฒŒ ๋””๋ฒ„๊น…์„ ํ•˜๋Š๋ƒ?" ์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์ด x64 ์—์„œ x64 ๋ฒ„์ ผ์„ ๋นŒ๋“œ ํ–ˆ๋Š”์ง€์˜ ์—ฌ๋ถ€์— ์ƒ๊ด€์—†์ด, ์—ฌ๋Ÿฌ๋ถ„์€ x64 ๋ชจ๋“œ์—์„œ ๋””๋ฒ„๊น… ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, Visual Studio์˜ ๋ฆฌ๋ชจํŠธ ๋””๋ฒ„๊น… ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์šด์ข‹๊ฒŒ๋„, ์—ฌ๋Ÿฌ๋ถ„์ด 64๋น„ํŠธ ์ปดํ“จํ„ฐ์—์„œ Visual Studio๋ฅผ ๋™์ž‘์‹œํ‚ค๋ฉด, IDE๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ด ๋‹จ๊ณ„๋ฅผ ์—ฌ๋Ÿฌ๋ถ„์„ ์œ„ํ•ด์„œ ํ•ด์ค๋‹ˆ๋‹ค. ์–ด๋–ค ์ด์œ ๋กœ, ๋ฆฌ๋ชจํŠธ ๋””๋ฒ„๊น…์„ ํ•  ์ˆ˜ ์—†์„ ๋•Œ, ์—ฌ๋Ÿฌ๋ถ„์˜ ๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ x64์šฉ WinDbg (์˜๋ฌธ)๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด, Visual Studio ๋””๋ฒ„๊ทธ์˜ ๋งŽ์€ ํ›Œ๋ฅญํ•œ ๊ธฐ๋Šฅ๋“ค์„ ํฌ๊ธฐํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์ด ๋ฆฌ๋ชจํŠธ ๋””๋ฒ„๊น…์„ ํ•œ ๋ฒˆ๋„ ํ•ด๋ณด์‹  ์ ์ด ์—†๋‹ค๊ณ  ํ•˜๋”๋ผ๋„, ๊ฑฑ์ •ํ•˜์‹ค ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ๋งŒ ์„ค์น˜ ๋˜๋ฉด, ๋ฆฌ๋ชจํŠธ ๋””๋ฒ„๊น…๋„ ๋กœ์ปฌ์ฒ˜๋Ÿผ ์‰ผ์—†์ด ์ž˜ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” 64๋น„ํŠธ MSVSMON์„ ๋Œ€์ƒ ์ปดํ“จํ„ฐ์— ์„ค์น˜ํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ VisualStudio์™€ ๊ฐ™์ด ์˜ค๋Š” RdbgSetup์„ ๋™์ž‘์‹œํ‚ค๋ฉด, ์•Œ์•„์„œ ํ•ด ์ค๋‹ˆ๋‹ค. ์ผ๋‹จ MSVSMON์ด ์„ค์น˜๋˜๋ฉด, Tools ๋ฉ”๋‰ด์—์„œ ์ ์ ˆํ•œ ๋ณด์•ˆ ์„ค์ •(ํ˜น์€ lack)๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์—๋Š”, Visual Studio ์•ˆ์—์„œ, ์—ฌ๋Ÿฌ๋ถ„์ด x64์ฝ”๋“œ๋ฅผ ์œ„ํ•ด์„œ ๋ฆฌ๋ชจํŠธ ๋””๋ฒ„๊น…์„ ์œ„ํ•œ ์„ค์ •์„ ํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœํผํ‹ฐ( ๊ทธ๋ฆผ 9 )์—์„œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 9 ๋””๋ฒ„๊ทธ ์†์„ฑ
๊ทธ๋ฆผ 9 ๋””๋ฒ„๊ทธ ์†์„ฑ

์—ฌ๋Ÿฌ๋ถ„์˜ 64๋น„ํŠธ ๊ตฌ์„ฑ์„ ์„ ํƒํ•ด์„œ, Configuration ํ”„๋กœํผํ‹ฐ ์•„๋ž˜์— ์žˆ๋Š” Debugging์„ ์„ ํƒํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์œ„์ชฝ์— Debugger to launch๋ผ๊ณ  ๋˜์–ด ์žˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ๋ถ€๋ถ„์ด Local Windows Debugger๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„ค์ •์„ Remote Windows Debugger๋กœ ๋ณ€๊ฒฝํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ ์•„๋ž˜์—์„œ, ์—ฌ๋Ÿฌ๋ถ„์ด ๋””๋ฒ„๊น…์„ ์‹œ์ž‘ํ•  ๋•Œ์˜ ๋ฆฌ๋ชจํŠธ ๋ช…๋ น(์˜ˆ๋ฅผ ๋“ค์–ด์„œ, ํ”„๋กœ๊ทธ๋žจ ์ด๋ฆ„)๊ณผ ๋ฆฌ๋ชจํŠธ ์‹œ์Šคํ…œ์˜ ์ด๋ฆ„๊ณผ ์—ฐ๊ฒฐ ์†์„ฑ์„ ์„ ํƒํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์ด ๋‹ค ์ œ๋Œ€๋กœ ์„ค์ •๋˜์—ˆ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ x64 ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—ฌ๋Ÿฌ๋ถ„์ด Win32 ํ”„๋กœ๊ทธ๋žจ์—์„œ ํ•˜๋“ฏ์ด ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์€ MSVSMON์ด ๋งค ๋ฒˆ ์„ฑ๊ณต์ ์œผ๋กœ ๋””๋ฒ„๊ทธ์™€ ์—ฐ๊ฒฐ์ด ๋  ๋•Œ, "connected"๋ผ๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ์—ฐ๊ฒฐ์ด ๋˜์—ˆ๋Š”์ง€์˜ ์—ฌ๋ถ€๋ฅผ ํŒ๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ถ€ํ„ฐ๋Š”, ์—ฌ๋Ÿฌ๋ถ„์ด ์•Œ๊ณ  ์žˆ๊ณ , ์‚ฌ๋ž‘ํ•˜๋Š” Visual Studio ๋””๋ฒ„๊ฑฐ์™€ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์ด ๋™์ผํ•ฉ๋‹ˆ๋‹ค. 64๋น„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด์„œ, ๊ทธ๋ฆฌ๊ณ  ๋น„์Šทํ•˜์ง€๋งŒ ์กฐ๊ธˆ ๋‹ค๋ฅธ x64 ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด์„œ ๋ ˆ์ง€์Šคํ„ฐ ์ฐฝ๊ณผ ๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ ์ฐฝ์„ ๋„์šฐ๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”.

์ฃผ์˜: 64๋น„ํŠธ ๋ฏธ๋‹ˆ๋คํ”„๋Š” 32๋น„ํŠธ ๋คํ”„์ฒ˜๋Ÿผ Visual Studio์—์„œ ์ง์ ‘ ๋ถˆ๋Ÿฌ ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , ์—ฌ๋Ÿฌ๋ถ„์€ ๋ฆฌ๋ชจํŠธ ๋””๋ฒ„๊น…์„ ์ด์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ(native)์™€ ๋งค๋‹ˆ์ง€๋“œ(managed) 64๋น„ํŠธ ์ฝ”๋“œ์˜ ์ƒํ˜ธํ˜ธํ™˜์€ ํ˜„์žฌ๋กœ์„œ Visual Studio 2005์—์„œ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


ํŽ˜์ด์ง€ ๋งจ ์œ„๋กœํŽ˜์ด์ง€ ๋งจ ์œ„๋กœ


๋งค๋‹ˆ์ง€๋“œ ์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?

๋งˆ์ดํฌ๋กœ ์†Œํ”„ํŠธ .NET ํ”„๋ ˆ์ž„ ์›์—์„œ ์ฝ”๋”ฉ ํ•˜๋Š” ๊ฒƒ์˜ ์žฅ์  ์ค‘์˜ ํ•˜๋‚˜๋Š”, ๊น”๋ ค์žˆ๋Š” ์šด์˜์ œ์ œ์˜ ๋งŽ์€ ๋ถ€๋ถ„์ด ์ผ๋ฐ˜์ ์ธ ๋ชฉ์ ์œผ๋กœ ์ฝ”๋“œ๋กœ ์ถ”์ƒํ™” ๋˜์–ด ์‚ฌ๋ผ์ ธ ๋ฒ„๋ ธ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋กœ IL ๋ช…๋ น์–ด ํฌ๋งท์€ CPU์— ์˜์กด์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, ์ด๋ก ์ ์œผ๋กœ๋Š”, Win32์—์„œ ์ œ์ž‘๋œ .NET์— ๊ธฐ๋ฐ˜์„ ๋‘” ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์€ x64์‹œ์Šคํ…œ์—์„œ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๋™์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ํ˜„์‹ค์€ ์•„์ฃผ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.

x64๋ฒ„์ ผ์˜ .NET ํ”„๋ ˆ์ž„์› 2.0์„ ์ œ x64์‹œ์Šคํ…œ์— ์„ค์น˜ํ•œ ๋’ค์—, ์ €๋Š” ์ œ๊ฐ€ Win32์—์„œ ์‹คํ–‰ํ–ˆ๋˜ ๋˜‘๊ฐ™์€.NET ์‹คํ–‰ํŒŒ์ผ์„ ๋™์ž‘์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ •๋ง ์ข‹์ง€์š”? ๋ฌผ๋ก , ๋ชจ๋“  .NET์— ๊ธฐ๋ฐ˜์„ ๋‘” ํ”„๋กœ๊ทธ๋žจ์ด Win32์™€ x64์—์„œ ์ปดํŒŒ์ผ ํ•˜์ง€ ์•Š๊ณ , ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ ํ•œ๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค๋งŒ, ๋‹ค๋งŒ ํ•ฉ๋ฆฌ์ ์ธ ๋ฒ”์œ„์˜ ์‹œ๊ฐ„ ์•ˆ์— ๊ทธ๋ƒฅ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ native code๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด (์˜ˆ๋ฅผ ๋“ค์–ด์„œ, C# ํ˜น์€ Visual Basic ์—์„œ์˜ P/Invoke) 64๋น„ํŠธ CLR์—์„œ ์‹คํ–‰ ์‹œ์— ๋ฌธ์ œ์— ๋ถ€๋”ซํž ํ™•๋ฅ ์ด ์ปค์ง‘๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ ์ปดํŒŒ์ผ๋Ÿฌ ์Šค์œ„์น˜์— ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ํ”Œ๋žซํผ์—์„œ ๋™์ž‘ํ• ์ง€๋ฅผ ๋ช…์‹œํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ, ์—ฌ๋Ÿฌ๋ถ„์€ 64๋น„ํŠธ CLR์ด ์กด์žฌํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ WOW64์—์„œ ๋™์ž‘ํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ๋ช…์‹œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.


ํŽ˜์ด์ง€ ๋งจ ์œ„๋กœํŽ˜์ด์ง€ ๋งจ ์œ„๋กœ


์ตœ์ข… ์ •๋ฆฌ

๋ชจ๋“  ๊ฒƒ์„ ๊ณ ๋ คํ•ด ๋ณด์•„๋„, x64 ๋ฒ„์ ผ์˜ ์œˆ๋„์šฐ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์€, ๋น„๊ต์  ์ €์—๊ฒŒ๋Š” ์–ด๋ ต์ง€ ์•Š์€ ๊ณผ์ •์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋‹จ, ์—ฌ๋Ÿฌ๋ถ„์ด ์šด์˜์ฒด์ œ ๊ตฌ์กฐ์™€ ํˆด์˜ ์ƒ๋Œ€์ ์œผ๋กœ ๋ฏธ๋ฏธํ•œ ์ฐจ์ด์ ์„ ํ•œ ๋ฒˆ ํ›‘์–ด ๋ณด๊ธฐ๋งŒ ํ•˜๋ฉด, ํ•˜๋‚˜์˜ ์ฝ”๋“œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•ด์„œ ๋‘ ๊ฐœ์˜ ํ”Œ๋žซํผ์—์„œ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Visual Studio 2005๊ฐ€ ์ด ๋…ธ๋ ฅ์˜ ๊ณผ์ •์„ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด ์ฃผ๊ณ  ์žˆ๊ณ , x64์— ํŠนํ™”๋œ ๋””๋ฐ”์ด์Šค ๋“œ๋ผ์ด๋ฒ„๋‚˜ ํˆด, ์˜ˆ๋ฅผ ๋“ค๋ฉด Sysinternals.com์˜ Process Explorer์€ ๋งค์ผ ์ƒˆ๋กญ๊ฒŒ ๋‚˜ํƒ€๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค, ๊ทธ๋Ÿฌ๋‹ˆ ์ด ์ชฝ์œผ๋กœ ๋›ฐ์–ด ๋“ค์ง€ ์•Š์„ ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค!

๋ฐ˜์‘ํ˜•

์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

MFC์˜ ๊ตฌ์กฐ

 ์œˆ๋„์šฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฒฝํ—˜์ด ์žˆ๋‹ค๋ฉด MFC๋ฅผ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์‰ฌ์šธ ๊ฒƒ์ด๋‹ค. ๋งŒ์ผ ์œˆ๋„์šฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฒฝํ—˜ ์ค‘์—๋„ SDKํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฒฝํ—˜์ด ์žˆ๋‹ค๋ฉด ํ›จ์”ฌ ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šธ ๊ฒƒ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด MFC๋Š” SDK์˜ ๊ตฌ์กฐ๋ฅผ ๊ฑฐ์˜ ๊ทธ๋Œ€๋กœ ํด๋ž˜์Šค๋กœ ๊ฐ€์ ธ๋‹ค ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด์ œ๋ถ€ํ„ฐ ํ•˜๋Š” ์„ค๋ช…์€ ์ฃผ๋กœ SDK์™€ ๊ด€๋ จํ•œ ๋‚ด์šฉ์ด ๋งŽ๋‹ค.
 MFC์˜ ํ•˜๋ถ€ ๊ตฌ์กฐ๊ฐ€ SDK์ด๊ณ  ์ด๋ฒˆ ์žฅ์€ ๊ทธ ๊ตฌ์กฐ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ถ€๋ถ„์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ SDK ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•ด ๋ณธ ๊ฒฝํ—˜์ด ์—†๋‹ค๋ฉด ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด ์žฅ์€ MFC์˜ ๋‚ด๋ถ€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ถ€๋ถ„์ด๋ฏ€๋กœ ๋ชฐ๋ผ๋„ ๋ณ„ ์ƒ๊ด€์€ ์—†์ง€๋งŒ ๋‚ด์šฉ์„ ์ž˜ ์ดํ•ดํ•œ๋‹ค๋ฉฐ ๊ทธ๋งŒํผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๊ธฐ๋Š” ์‰ฌ์šธ ๊ฒƒ์ด๋‹ค. ์ด์ œ๋ถ€ํ„ฐ SDK๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ MFC์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๊ฐ€ ์–ด๋–ค ์‹์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ C++์„ ์ค‘์‹ฌ์œผ๋กœ ์•Œ์•„๋ณด์ž.

 SDK ์œˆ๋„์šฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋‹ค๋ณด๋ฉด ํ•ธ๋“ค์ด๋ž€ ๋ง์„ ๋งŽ์ด ๋“ฃ๊ฒŒ ๋œ๋‹ค. ํ•ธ๋“ค์ด๋ž€ ์œˆ๋„์šฐ, ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ, ๋น„ํŠธ๋งต, ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ์˜ ์˜ค๋ธŒ์ ํŠธ๋ผ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์ง€์นญํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ํ•ธ๋“ค์„ ์–ด๋–ค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ผ์ข…์˜ ์ผ๋ จ๋ฒˆํ˜ธ๋ผ๊ณ  ์ƒ๊ฐํ•ด๋„ ๋  ๋“ฏํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œˆ๋„์šฐ ํ•ธ๋“ค์ด๋ž€ ๊ฐ ์œˆ๋„์šฐ๋ฅผ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์œˆ๋„์šฐ๋ณ„๋กœ ํ• ๋‹น๋œ ๋ฒˆํ˜ธ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์œ„๋„์šฐ์™€ ๊ด€๊ณ„๋œ ๋ชจ๋“  API์—๋Š” ์กฐ์ž‘ ๋Œ€์ƒ์ด ๋˜๋Š” ์œˆ๋„์šฐ๋ฅผ ์ง€์นญํ•˜๋Š” ๋ฌด์—‡์ธ๊ฐ€๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๋Ÿฐ API๋“ค์˜ ์ธ์ž๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๊ทธ๋Ÿฐ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ธ์ž๊ฐ€ ์žˆ๋‹ค .๋ฐ”๋กœ ๊ทธ ์ธ์ž๋กœ ์œˆ๋„์šฐ ํ•ธ๋“ค์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œˆ๋„์šฐ์˜ ํฌ๊ธฐ๋ฅผ ์–ป๊ณ  ์‹ถ์œผ๋ฉด GetClientRect API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์‚ฌ์šฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    RECT rc;

    GetClientRect(hwnd, &rc);        // hwnd ๋Š” ์œˆ๋„์šฐ ํ•ธ๋“ค

๋˜ ์œˆ๋„์šฐ์˜ ํฌ๊ธฐ๋‚˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด MoveWindow API๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

    MoveWindow(hwnd, x, y, x2, y2, TRUE);

 ์œ„์˜ ๋‘ API๋ฅผ ๋ณด๋ฉด ์ž‘์—…๋Œ€์ƒ์ธ ์œˆ๋„์šฐ๋ฅผ ์ง€์นญํ•˜๊ธฐ ์œ„ํ•ด ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ์œˆ๋„์šฐ ํ•ธ๋“ค์„ ์ž…๋ ฅ๋ฐ›๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ์œˆ๋„์šฐ ํ•ธ๋“ค๊ณผ ์œˆ๋„์šฐ ๊ด€๋ จ API๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ MFC์—์„œ๋Š” CWnd๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜์˜€๋‹ค. CWnd ํด๋ž˜์Šค์—๋Š” ์œˆ๋„์šฐ์™€ ๊ด€๋ จ์žˆ๋Š” ๋ชจ๋“  SDK์˜ ํ•จ์ˆ˜๋“ค์ด ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค. ์•ž์˜ ์˜ˆ์— ๋น„์ถ”์–ด ๋ณด์ž๋ฉด ๋Œ€๋žต ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชจ์–‘์„ ๋ ๊ฒŒ ๋œ๋‹ค.

    class CWnd : public CCmdTarget
    {
         HWND m_hWnd;
         .......
         BOOL GetClientRect(LPRECT lpRect);
         BOOL MoveWindow(int x, int y, int width, int height, BOOL bDraw = TRUE);
         ........
    }

 ์œ„์— CWnd ํด๋ž˜์Šค์˜ ์ •์˜๋ฅผ ์•„์ฃผ ์•ฝ๊ฐ„ ๋ณด์˜€๋Š”๋ฐ ์‹ค์ œ CWnd ํด๋ž˜์Šค์˜ ์ •์˜๋ฅผ ๋ณด๊ณ  ์‹ถ์œผ๋ฉด MSDEV\MFC\INCLUDE ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” AFXWIN.H๋ฅผ ๋ณด๊ธฐ ๋ฐ”๋ž€๋‹ค. ์ƒ๊ฐ๋ณด๋‹ค ๋ฉ์น˜๊ฐ€ ๊ต‰์žฅํžˆ ํด ๊ฒƒ์ด๋‹ค. AFXWIN.H์—๋Š” MFCํด๋ž˜์Šค ๋Œ€๋ถ€๋ถ„์˜ ์ •์˜๊ฐ€ ๋“ค์–ด์žˆ๋‹ค.  ์œ„์˜ CWnd ํด๋ž˜์Šค๋ฅผ ๋ณด๋ฉด ๋ฐ์ดํ„ฐ ๋ฉค๋ฒ„๋กœ m_hWnd ๊ฐ€ ์žˆ๋‹ค. ๋ฐ”๋กœ ์œˆ๋„์šฐ ํ•ธ๋“ค์ด๋‹ค.
 ๋ฉค๋ฒ„ํ•จ์ˆ˜๋กœ๋Š” ์œˆ๋„์šฐ์—๊ฒŒ ๋ฌด์—‡์ธ๊ฐ€ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค์ด ์žˆ๊ธฐ ๋งˆ๋ จ์ธ์ผํ…๋ฐ MFC๋Š” ๊ทธ ํ•จ์ˆ˜๋“ค์˜ ์ด๋ฆ„์„ SDK์—์„œ์™€ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ์•ž์„œ ์‚ดํŽด๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ GetClientRect๋‚˜ MoveWindow ์—ญ์‹œ SDK์—์„œ์™€ ๊ฐ™์€ ์ด๋ฆ„์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— SDK์— ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด MFC๋ฅผ ๋ฐฐ์šฐ๊ธฐ๊ฐ€ ์œ ๋ฆฌํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋“ค ํ•จ์ˆ˜๋Š” ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ์„๊นŒ? ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ์ดํ„ฐ ๋ฉค๋ฒ„์ธ m_hWnd๋ฅผ ์ด์šฉํ•ด SDK์— ์žˆ๋Š” ์œˆ๋„์šฐ API๋ฅผ ๋ฐ”๋กœ ํ˜ธ์ถœํ•ด ๋ฒ„๋ฆฐ๋‹ค.

    BOOL CWnd::GetClientRect(LPRECT lpRect)
    {
          ::GetClientRect(m_hWnd, lpRect);
    }

    BOOL MoveWindow(int x, int y, int width, int height, BOOL bDraw = TRUE)
    {
           ::MoveWindow(m_hWnd, x, y, width, height)
    }

 CWnd ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ํ•จ์ˆ˜๋“ค์„ ๋ณด๋ฉด SDK ํ”„๋กœ๊ทธ๋žจ์‹œ์— ๋ณผ ์ˆ˜ ์žˆ๋˜ ์ด๋ฆ„๋“ค์ด ๋งŽ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋Š”๋ฐ ๋ชจ๋‘ SDK์—์„œ์™€๋Š” ๋‹ฌ๋ฆฌ ์ธ์ž์ค‘์— ์œˆ๋„์šฐ ํ•ธ๋“ค์ด ๋น ์ ธ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ ์ด์œ ๋Š” ์œ„์—์„œ์ฒ˜๋Ÿผ ์œˆ๋„์šฐ ํ•ธ๋“ค์€ ๋ฐ์ดํ„ฐ ๋ฉค๋ฒ„๋กœ ์ˆจ๊ฒจ ๋†“๊ณ  ๋‚˜์ค‘์— ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
 ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ MFC์˜ ํด๋ž˜์Šค๋Š” ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ์ฆ‰ MFC์˜ ๋ฐ‘๋ฐ”ํƒ•์ด SDK๋ผ๋Š” ๋ง์˜ ์˜๋ฏธ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์œ„์˜ ์˜ˆ๋ฅผ ๋ณด๋ฉด์„œ MFC๋Š” SDK ์œ„์— ํ•œ ๊ฒน์„ ๋” ์Œ“์•„๋‘” ์…ˆ์ด๋‹ˆ ์†๋„๊ฐ€ ๋งŽ์ด ๋Š๋ ค์ง€๊ฒ ๊ตฌ๋‚˜ ๋ผ๊ณ  ์ƒ๊ฐํ• ์ง€๋„ ๋ชจ๋ฅด๊ฒ ๋‹ค. ํ•˜์ง€๋งŒ ๊ผญ ๊ทธ๋ ‡์ง€๋Š” ์•Š๋‹ค. ์‚ฌ์‹ค ์œ„์˜ ํ•จ์ˆ˜๋“ค์€ ์ธ๋ผ์ธ ํ•จ์ˆ˜๋กœ ์ •์˜๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ์— ์•ž์„œ ๋งคํฌ๋กœ์ฒ˜๋Ÿผ ์น˜ํ™˜๋˜์–ด ๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. MFC์—์„œ ์ง์ ‘ SDK API๋ฅผ ๋ถ€๋ฅด๋Š” ๋ชจ๋“  ํ•จ์ˆ˜๋Š” ์ธ๋ผ์ธ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.  MFC์˜ ์ธ๋ผ์ธ ํ•จ์ˆ˜๋Š” \MSDEV\MFC\INCLUDE ๋””๋ ‰ํ† ๋ฆฌ์— ๊ฐ€๋ณด๋ฉด *.inl ์ด๋ผ๋Š” ํŒŒ์ผ๋“ค์ด ์žˆ์„ํ…๋ฐ ๊ฑฐ๊ธฐ์— ๋ชจ๋‘ ์ •์˜๋˜์–ด ์žˆ๋‹ค.

 ์ด๋ฒˆ์—๋Š” ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ–๊ณ  ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž. ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ๋ž€ ์œˆ๋„์šฐ์—์„œ ์ถœ๋ ฅ์žฅ์น˜์— ๋ฌด์—‡์ธ๊ฐ€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ ์ž ํ•˜๋ฉด ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜๋‹ค. ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ๋ž€ ์ถœ๋ ฅ๋Œ€์ƒ์„ ์ง€์นญํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
 ํ™”๋ฉด์— ๋ฌด์—‡์ธ๊ฐ€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ ์ž ํ•˜๋ฉด ํ™”๋ฉด์— ๋Œ€ํ•œ ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ํ”„๋ฆฐํ„ฐ์— ๋ฌด์—‡์ธ๊ฐ€ ์ถœ๋ ฅํ•˜๊ณ ์ž ํ•˜๋ฉด ์—ญ์‹œ ํ”„๋ฆฐํ„ฐ์— ๋Œ€ํ•œ ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๊ทธ๊ฒƒ์˜ ๋ฒˆํ˜ธ๊ฐ€ ๋ฆฌํ„ด๋œ๋‹ค. ์ด๋ฅผ ์ธ์ž๋กœ ์ถœ๋ ฅํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ทธ๋ฆฌ๋กœ ์ถœ๋ ฅ์ด ๋‚˜๊ฐ„๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ™”๋ฉด์— ์‚ฌ๊ฐํ˜•๊ณผ ํ…์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด Rectangle ์ด๋ผ๋Š” ํ•จ์ˆ˜์™€ TextOut ์ด๋ž€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

    HDC hDC = GetDC(hWnd);  // ํ™”๋ฉด์— ๋Œ€ํ•œ ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ๋ฅผ ์–ป๋Š”๋‹ค.

    Rectangle(hDC, 10, 10, 100, 100);    // ์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฐ๋‹ค.
    TextOut(hDC, 10, 10, "Sample", 6);   // ํ…์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
    ReleaseDC(hWnd, hDC);       // ํ™”๋ฉด์— ๋Œ€ํ•œ ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 GetDC๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ฐ”๋กœ ์œˆ๋„์šฐ ํ™”๋ฉด์— ๋Œ€ํ•œ ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ทธ ๋ฒˆํ˜ธ(ํ•ธ๋“ค)๋ฅผ ๋Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค. Rectangle๊ณผ TextOut๊ณผ ๊ฐ™์ด ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ๋กœ์˜ ์ถœ๋ ฅ์— ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ GDI(Graphic Device Interface) ํ•จ์ˆ˜๋ผ ํ•˜๋Š”๋ฐ ์ด ํ•จ์ˆ˜๋“ค์˜ ํŠน์ง•์€ ์ถœ๋ ฅํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์ธ์ž๋กœ ์ถœ๋ ฅ๋Œ€์ƒ์„ ์ง€์นญํ•˜๋Š” ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ ํ•ธ๋“ค์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. MFC์—์„œ๋Š” ์ด๋Ÿฐ GDI๋“ค๊ณผ ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ ํ•ธ๋“ค์„ CDC๋ผ๋Š” ํด๋ž˜์Šค ์•ˆ์œผ๋กœ ์ง‘์–ด๋„ฃ์–ด ๋ฒ„๋ ธ๋‹ค. CDC๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.

    class CDC : public CObject
    {
          HDC m_hDC;
          ..............
          BOOL Rectangle(int x1, int y1, int x2, int y2);
          BOOL TextOut(int x, int y, LPSTR lpstr, int size);
          ...............
    }

 ์œ„์˜ CDC ํด๋ž˜์Šค์˜ Rectangle ๊ณผ TextOut ๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” ์–ด๋–ค ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ์„๊นŒ? ์–ด๋Š ์ •๋„ ๊ฐ์ด ์žกํžŒ๋‹ค๋ฉด MFC์— ์กด์žฌํ•˜๋Š” ํด๋ž˜์Šค๋“ค์˜ ๊ธฐ๋ณธ๊ตฌ์กฐ๋Š” ์•ˆ ๊ฒƒ์ด๋‚˜ ๋‹ค๋ฆ„์—†๋‹ค. (๋‹ค๋งŒ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ์ผ ๋ฟ์ด์ง€๋งŒ..) ์ •๋‹ต์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    BOOL CDC::Rectangle(int x1, int y1, int x2, int y2)
    {
          ::Rectangle(m_hDC, x1, y1, x2, y2);
    }

    BOOL TextOut(int x, int y, LPSTR lpstr, int size)
    {
           ::TextOut(m_hDC, x, y, lpstr, size);
    }

 CWnd ์—์„œ์ฒ˜๋Ÿผ ๋‚ด๋ถ€์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋Š” ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ ํ•ธ๋“ค์„ ์ธ์ง€๋กœ ํ•˜์—ฌ SDK์— ์žˆ๋Š” API๋ฅผ ๊ทธ๋Œ€๋กœ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๋‹ค. ์œ„์˜ ๊ฒƒ ์—ญ์‹œ ์ธ๋ผ์ธ ํ•จ์ˆ˜๋กœ ์ •์˜๋˜์–ด ์žˆ๋‹ค.

 ๊ฒฐ๋ก ์ ์œผ๋กœ MFC์˜ ํ•˜๋ถ€๊ตฌ์กฐ๋Š” SDK์— ์žˆ๋Š” API๋กœ ๋˜์–ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ฒฐ๊ตญ MFC๋ž€ SDK API๋ฅผ ๊ธฐ๋Šฅ์ ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๊ทธ ์œ„์— ํด๋ž˜์Šค๋ž€ ์˜ท์„ ์ž…ํžŒ ๊ฒƒ์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ๊ธฐ๋Šฅ์ ์ธ ๋ถ„๋ฅ˜๊ฐ€ ์•ž์„œ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ ํ•ธ๋“ค์„ ์ค‘์‹ฌ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.
 ์ด๋Š” ์–ด๋””๊นŒ์ง€๋‚˜ ๊ธฐ๋ณธ์ ์ธ ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ์ด๊ณ  ์ข€๋” ๋ณต์žกํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค๋“ค์€ ์ด๋ฅผ ๋ฐ”ํƒ•์„ ์กด์žฌํ•˜๊ณ  ์žˆ๋‹ค.

๋ฐ˜์‘ํ˜•

์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

image

 

image

๋ฐ˜์‘ํ˜•

์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์—ด์–ด ํžˆ์Šคํ† ๊ทธ๋žจ์„ ์ƒ์„ฑํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ž„.

๋ฐ˜์‘ํ˜•

+ Recent posts