Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
¸Þ¸ð¸®¿¡ ´ëÇÏ¿© ¿©±â¿¡¼ ´Ù·ç´Â ÁÖÁ¦´Â ½ÇÁúÀûÀÎ ÇÁ·Î±×·¡¹Ö ±â¼ú°ú´Â °ü°è¾ø¾î º¸ÀÏ
¼öµµ ÀÖÀ» °ÍÀ̸ç, Áö±ØÈ÷ ÀÌ·ÐÀûÀÎ °ÍµéÀ̶ó¼ Àç¹Ì¾øÀ» ¼öµµ ÀÖÀ» °ÍÀÌ´Ù.
±×·¸Áö¸¸ ¿©±â¿¡¼ ´Ù·ç´Â ³»¿ëµéÀº ´ç½ÅÀÌ ¼º°øÀûÀÎ ÇÁ·Î±×·¡¸Ó°¡ µÇ±â À§ÇÑ
µçµçÇÑ ÈÄ¿øÀÚ°¡ µÇ¾îÁÙ °ÍÀÌ´Ù.
¿ì¸®´Â ÀÌ¹Ì 2Àå2절 ¿¡¼ ÄÄÇ»ÅͰ¡ ¸Þ¸ð¸®¸¦ ¾î¶»°Ô
º¸´ÂÁö¿¡ ´ëÇØ¼ °£´ÜÈ÷ ¾Ë¾Æº¸¾Ò´Ù. ÄÄÇ»ÅÍ´Â ¸Þ¸ð¸®ÀÇ °¢ ÀúÀ念¿ªÀ»
ÃÖ¼Ò´ÜÀ§·Î ³ª´©°í, ¿©±â¿¡ ÀÏ·ÃÀÇ ¿¬¼ÓµÈ ¹øÈ£¸¦ ºÙ¿©¼ °ü¸®ÇÏ°Ô µÈ´Ù.
ÃÖ±ÙÀÇ ÄÄÇ»Å͵éÀº ±âº» 512MÀÌ»óÀÇ Å©±â¸¦ °¡Áö°Ô µÇ¹Ç·Î ±âº» ¼ö¹é¸¸ ´ÜÀ§ÀÇ
ÀϷùøÈ£°¡ ºÙ°Ô µÉ°ÍÀÌ´Ù.
´ç½ÅÀÌ ¸¸µç ÇÁ·Î±×·¥Àº ÇÊ¿¬ÀûÀ¸·Î µ¥ÀÌÅÍ¿¡ ´ëÇÑ Á¶ÀÛÀ» ÇÊ¿ä·Î Çϸç,
ÀÌ·¯ÇÑ µ¥ÀÌÅÍ´Â ¸Þ¸ð¸®¿¡ ¾²¿©Áö°í ÀÐÇôÁö°Ô µÈ´Ù. ±âº»ÀûÀ¸·Î ÄÄÇ»ÅÍ´Â
µ¥ÀÌÅͰ¡ ¾î´ÀÀ§Ä¡¿¡ ³õ¿©¾ß ÇÏ´ÂÁö, µ¥ÀÌÅͰ¡ ¾î´ÀÁ¤µµÀÇ ÀúÀ念¿ªÀ»
ÇÊ¿ä·Î ÇÏ´ÂÁö¿¡ ´ëÇØ¼ ¾Æ´Â ¹Ù°¡ ÀüÇô ¾øÀ¸¹Ç·Î, µ¥ÀÌÅͰ¡ ¾îµð¿¡
¾î¶»°Ô ÀúÀåµÉÁö¸¦ ¸í·É (instruction)À» ÅëÇØ¼ ÄÄÇ»ÅÍ¿¡°Ô ¾Ë·ÁÁà¾ß ÇÑ´Ù.
ÀÌ·± ¸í·É¿ª½Ã ÀúÀ念¿ª¿¡ ¾²¿©ÁøÈÄ ¸Þ¸ð¸®¿¡ ÀúÀåµÈ´ÙÀ½ ÄÄÇ»ÅͰ¡ Àо°Ô µÈ´Ù.
ÇѸ¶µð·Î ¸ðµç°Ô ¸Þ¸ð¸®¿µ¿ª¿¡ µé¾î°£´ÙÀ½ ÄÄÇ»ÅÍ¿¡ ÀÇÇØ¼ ÀÐÇôÁö°í ½ÇÇàµÇ¾îÁø´Ù.
ÇÊ¿ä·Î ÇÏ°Ô µÈ´Ù.
movl data_items(, %edi, 4), %ebx
¿¹¸¦ µé¾î À§ÀÇ ¸í·ÉÀº 7ÀÇ ÀúÀ念¿ªÀ» ÇÊ¿ä·Î ÇÑ´Ù. óÀ½ ¸í·ÉÀº 2¹ÙÀÌÆ®, ´ÙÀ½ ·¹ÀÌÁö½ºÅÍÀÇ »ç¿ëÀ» À§Çؼ 1¹ÙÀÌÆ®, ¸¶Áö¸·À¸·Î data_items¿µ¿ªÀ» À§Çؼ 4¹ÙÀÌÆ®¸¦ »ç¿ëÇÏ°Ô µÈ´Ù. ¸Þ¸ð¸®»ó¿¡¼´Â ÀÌ·¯ÇÑ À§Ä¡¸¦ ÀÏ·ÃÀÇ ¼ýÀÚ¸¦ ÅëÇØ¼ ã¾Æ³»°Ô µÈ´Ù. ¸Þ¸ð¸®¿Í °ü·ÃµÇ¾î¼ ¸î°¡Áö ¿ë¾î¸¦ Á¤¸®ÇØ º¸µµ·Ï ÇÏÀÚ.
Address Address(ÁÖ¼Ò)´Â ÀúÀåÀ§Ä¡¸¦ °¡¸®Å°±â À§ÇÑ ¼ýÀÚ´Ù. ÄÄÇ»ÅÍ´Â
¸Þ¸ð¸®ÀÇ Ã¹¹øÂ° ÁÖ¼Ò°¡ 0ÀÌ µÇ¸ç, °è¼Ó 1¾¿ Áõ°¡ÇÏ¸ç ¸Þ¸ð¸®ÀÇ
À§Ä¡¸¦ °áÁ¤ÇÑ´Ù. ÀÌ·¯ÇÑ ÁÖ¼Ò´Â ÄÄÇ»ÅͰ¡ »ç¿ëÇϱ⿡´Â
Æí¸®ÇÏÁö¸¸ Àΰ£ÀÌ º¸±â¿¡´Â ¹®Á¦°¡ Àֱ⠶§¹®¿¡, ¼ýÀÚ ´ë½Å
ÀÌÇØÇϱ⠽¬¿î ½Éº¼ (data_items ¿Í °°Àº)À» »ç¿ëÇÑ´Ù.
Pointer Æ÷ÀÎÅÍ´Â ÁÖ¼Ò°ªÀ» °¡Áö°í ÀÖ´Â ¸Þ¸ð¸® ȤÀº ·¹Áö½ºÅÍ¿µ¿ªÀÌ´Ù.
À§ÀÇ ¿¹Á¦¿¡¼ %ebp °¡ Æ÷ÀÎÅÍ·Î, ÇöÀçÀÇ
stack¿µ¿ªÀ» point(°¡¸®Å²´Ù )ÇÑ´Ù.
´ëºÎºÐÀÇ ÇÁ·Î±×·¡¹Ö°úÁ¤¿¡ ÀÖ¾î¼ ¸¹Àº ¼öÀÇ Æ÷ÀÎÅ͸¦ »ç¿ëÇÏ°Ô µÈ´Ù.
Byte ÀúÀåÀ» À§ÇÑ ÃÖ¼Ò´ÜÀ§´Ù. x86ÇÁ·Î¼¼½ºÀÇ °æ¿ì ÇѹÙÀÌÆ®´Â 8bit·Î 0¿¡¼ 255»çÀÌÀÇ °ªÀ» °¡Áø´Ù.
Word ·¹Áö½ºÅÍÀÇ ÀϹÝÀûÀÎ Å©´Ù. x86 ÇÁ·Î¼¼½ºÀÇ °æ¿ì, 1 word´Â
4¸¸ÅÀÇ ÀúÀ念¿ª (4byte)ÀÇ Å©±â¸¦ °¡Áø´Ù.
¾ÕÀ¸·Î´Â ÀúÀ念¿ªÀ̶ó´Â ´Ü¾î´ë½Å¿¡ À§¿¡¼ Á¤ÀÇ ÇÑ ´Ü¾îµéÀ» ¾²°Ô
µÉ °ÍÀÌ´Ù.
ÀÏ´Ü ·¹Áö½ºÅͰ¡ ¹«¾ðÁö ±×·¯°í ¾î¶²ÀÏÀ» ÇÏ´ÂÁö¿¡ ´ëÇØ¼ Á»´õ
ÀÚ¼¼È÷ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. ÀÏ´Ü ¿ì¸®´Â ¸î°¡Áö ·¹Áö½ºÅ͵鿡
´ëÇØ¼ ¹è¿ü´Âµ¥, ¿©±â¿¡¼´Â instruction pointerÀ» ´Ù·ç´Â Á»´õ
Ưº°ÇÑ ·¹Áö½ºÅÍ¿¡ ´ëÇØ¼ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. ÀÌ ·¹Áö½ºÅÍ´Â %eip·Î
»ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿ì¸®´Â ÄÄÇ»ÅÍ´Â ¸ðµç°É µ¿ÀÏÇÑ µ¥ÀÌÅÍ·Î
Ãë±ÞÇÏ¸ç ¸í·É (instruction)µµ ¿¹¿Ü°¡ ¾øÀ½À» ¾Ë°í ÀÖ´Ù. ÄÄÇ»ÅÍ´Â
ÀÌ°Ô ¸í·ÉÀ̵çÁö ¾Æ´Ï¸é ÀÏ¹Ý µ¥ÀÌÅ͵çÁö µ¿ÀÏÇÏ°Ô Ã³¸®¸¦ Çϸç,
¶ÇÇÑ À̵éÀ» ±¸ºÐÇÒ ´É·ÂÀ» °¡Áö°í ÀÖÁö ¾Ê´Ù.
±×·¸´Ù¸é ÄÄÇ»ÅÍ´Â ¾î¶»°Ô ÀÌ·¯ÇÑ ÀÏ·ÃÀÇ µ¥ÀÌÅÍ¿¡¼ ¸í·ÉÀ» ã¾Æ³»¾î¼
±×°É ½ÇÇàÀ» ½ÃŰ°Ô µÇ´Â °ÍÀϱî ? ÇØ´äÀº instruction pointer¿¡ ÀÖ´Ù.
ÀÌ instruction pointer¶ó´Â À̸§¿¡¼ ¿ì¸®´Â ÀÌ Æ÷ÀÎÅͰ¡ ¹«¾ð°¡¸¦
°¡¸£Å²´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. instruction pointerÀº ´ÙÀ½
¸í·É (instruction)À» °¡¸£Å²´Ù.
ÄÄÇ»ÅÍ´Â instruction pointer¸¦ »ìÆìº½À¸·Î½á, ´ÙÀ½¿¡ ¾î¶² ¸í·ÉÀ» ½ÇÇàÇØ¾ß µÉÁö¸¦ ¾Ë¼ö À̰ڵȴÙ.
ÇØ´ç ¸í·ÉÀ» ½ÇÇàÇÏ°Ô µÇ¸é instruction pointer´Â ´ÙÀ½ ¸í·ÉÀÇ À§Ä¡¸¦
°¡¸®Å°µµ·Ï °ªÀÌ Áõ°¡°¡µÇ¸ç, ÇöÀç ½ÇÇàÇØ¾ßµÉ ¸í·ÉÀ» ¸¶Ä¡°Ô µÇ¸é,
´Ù½Ã instruction pointerÀÇ °ªÀ» »ìÇÇ°Ô µÈ´Ù. ÀÌ·¯ÇÑ ¸í·É½ÇÇà ¹æ½ÄÀº
´ëºÎºÐÀÇ °æ¿ì¿¡ À¯È¿ÇÒ °ÍÀÌ´Ù. ±×·¯³ª jmpµîÀ» ÀÌ¿ëÇØ¼ ¸í·ÉÀ»
Á¡ÇÁÇÏ°Ô µÉ°æ¿ì´Â ¾î¶»°Ô µÉ°¡ ? ÀÌ·² °æ¿ì¿¡ ÄÄÇ»ÅÍ´Â ´ÙÀ½ ¸í·ÉÀÌ ¾Æ´Ñ
´Ù¸¥ À§Ä¡ÀÇ ¸í·ÉÀ» ½ÇÇàÇØ¾ß ÇÒ°ÍÀÌ´Ù. ÀÌ·²°æ¿ì ¿ì¸®´Â ÀϹÝÀûÀ¸·Î ¾Æ·¡¿Í
°°Àº Äڵ带 »ç¿ëÇÏ°Ô µÉ°ÍÀÌ´Ù.
ÀÌ ÄÚµå´Â ¾Æ·¡ÀÇ ÄÚµå¿Í µ¿ÀÏÇÑ ÀÏÀ» ÇÑ´Ù.
¾Ë´Ù½ÃÇÇ
somewhere ´Â ÇÁ·Î±×·¥ÀÇ ¿µ¿ªÀ» ÂüÁ¶Çϱâ À§ÇÑ
»ó¡ÀÌ´Ù. ±×·¯¹Ç·Î %eip°¡ Á÷Á¢ somewhere¸¦ ÂüÁ¶Çϵµ·Ï ÇÏ´Â °ÍÀº Çã¿ëÀÌ
µÇÁö ¾Ê´Â´Ù. ±×·¯³ª '$'Ç¥½Ã¸¦ ÀÌ¿ëÇÏ°Ô µÉ°æ¿ì À̸¦ Çã¿ëÇÒ ¼ö ÀÖ°Ô µÈ´Ù.
ÀÌ´Â $Ç¥½Ã°¡ immediate mode addressiong¸ðµå·Î somewhere¸¦ °ªÀ¸·Î
´Ù·ê ¼ö ÀÖµµ·Ï ÇØÁֱ⠶§¹®ÀÌ´Ù. ¸¸¾à '$'Ç¥½Ã¸¦ »ç¿ëÇÏÁö ¾ÊÀ» °æ¿ì
direct addressing mode°¡ µÇ´Âµ¥, ±×·²°æ¿ì somewhereÀÇ ÁÖ¼Ò¿¡ ÀÖ´Â °ªÀÌ
%eip·Î À̵¿ÀÌ µÇ¾î¹ö¸°´Ù. À̰ÍÀº ¿ì¸®°¡ ¿øÇÏ´Â °á°ú°¡ ¾Æ´Ï´Ù.
¾Æ·¡´Â ½ÇÁ¦ ÀÚÁÖ »ç¿ëµÇ´Â ÄÚµå´Ù.
0¾Õ¿¡ $Ç¥½Ã°¡ ºÙ¾î Àִµ¥, À̰ÍÀº immediate-mode instruction¸¦ ÀǹÌÇÏ´Â
°ÍÀ̹ǷΠ0À» ebx¿¡ Áý¾î ³Ö°Ô µÈ´Ù.
¸¸¾à $Ç¥½Ã¸¦ Á¦°ÅÇÏ°Ô µÇ¸é direct addressing mode°¡ µÇ¾î¼
0¹øÁÖ¼ÒÀÇ °ªÀÌ %ebx¿¡ ¹Ð¾î³Ö¾îÁö°Ô µÈ´Ù.
¸Þ¸ð¸®ÀÇ ¾îµå·¹½Ì ¸ðµå¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº 2ÀåÀ» Âü°íÇϱ⠹ٶõ´Ù.
À̹ø ÀåÀÇ ³»¿ëÀº konstantin BoldyshevÀÇ "Startup state of a Linux/i386 ELF binary"¹®¼¿¡ ±â¹ÝÀ» µÎ°í ÀÖ´Ù.
°ü·ÃµÈ ¹®¼´Â http://linuxassembly.org/start.htmlÀ» Âü°íÇϱ⠹ٶõ´Ù.
´ç½ÅÀÌ ¸¸µç ÇÁ·Î±×·¥ÀÌ ¸Þ¸ð¸®¿¡ ÀûÀçµÉ¶§, °¢°¢ÀÇ .sectionÀÇ À̸§ÀÌ °¡¸®Å°´Â
ÁöÁ¡ÀÌ ·ÎµåµÈ´Ù. ½ÇÁ¦ÄÚµå (.text section)Àº 0x0848000 ÁÖ¼Ò¿¡
·ÎµåµÈ´Ù. .data¼½¼ÇÀÌ ±×´ÙÀ½¿¡ À§Ä¡ÇÏ°Ô µÇ°í, ±×µÚ¿¡ .bss ¼½¼ÇÀÌ À§Ä¡ÇÏ°Ô µÈ´Ù.
.bss ´Â ¹öÆÛ¿µ¿ªÀ¸·Î ¿ì¸®°¡ »ç¿ëÇÒ ¸Þ¸ð¸®ÀÇ ¿µ¿ªÀ» ¹Ì¸®È®º¸ÇÒ ¼ö ÀÖ°Ô µµ¿ÍÁØ´Ù.
¿ì¸®´Â run-timeÀü±îÁö´Â .bss¿¡ °ªÀ» ¹Ð¾î ³ÖÀ» ¼ö ¾ø´Ù. .data¼½¼ÇÀÇ °æ¿ì¿¡´Â
°ø°£À» ÇÒ´ç(.long µîÀ» ÀÌ¿ëÇØ¼)ÇÏ°í °Å±â¿¡ ÇÊ¿äÇÑ °ªÀ» Áï½Ã ¹Ð¾î ³ÖÀ» ¼ö ÀÖ´Ù.
ÀÌ °ªµéÀº ÇÁ·Î±×·¥ÀÌ ÄÄÆÄÀÏµÇ¾î¼ ¸¸µé¾î Áú¶§, ÇÁ·Î±×·¥ ÆÄÀÏ¿¡ Á÷Á¢ µé¾î°¡°Ô µÈ´Ù.
¹Ý¸é .bss ¼½¼ÇÀÇ °æ¿ì ÇÁ·Î±×·¥ÀÌ ½ÇÇàÀü¿¡´Â ÃʱâÈ µÇÁö ¾Ê´Â´Ù. ±×·¯¹Ç·Î ÇÁ·Î±×·¥
ÆÄÀÏ ÀÚü¿¡ ¾î¶°ÇÑ °ªÀ» ÀúÀåÇÒ ¼ö ¾ø´Ù. ¿©±â¿¡´Â ´ÜÁö ¾î´ÀÁ¤µµÀÇ ÀúÀå°ø°£ÀÌ ÇÊ¿äÇÑÁö
¿¡ ´ëÇÑ Á¤º¸¸¸ÀÌ ÀÖÀ» »ÓÀÌ´Ù. ÀÌ¿¡ ´ëÇÑ ³»¿ëÀº µÚ¿¡ ÀÚ¼¼È÷ ¾Ë¾Æº¸·Ï ÇÒ°ÍÀÌ´Ù.
¸¶Áö¸· ÀúÀ念¿ªÀº 0xbffffffffÀÇ ÁÖ¼Ò¸¦ °¡Áø´Ù. .text, .data, .bass ¼½¼ÇÀº 0x0804800
ÀÌÈÄ¿¡ À§Ä¡ÇÏ°Ô µÈ´Ù. .start ¼½¼ÇÀº À§ÀÇ ÁÖ¼Ò¿µ¿ª »çÀÌ¿¡ À§Ä¡ÇÏ°Ô µÇ¸ç,
óÀ½ µÎ¹ÙÀÌÆ®´Â 0À¸·Î ä¿öÁö°í ±×´ÙÀ½¿¡ ÇÁ·Î±×·¥ÀÇ À̸§ÀÌ ¿Â´Ù. ÇÁ·Î±×·¥ÀÇ À̸§ÀÇ
³¡Àº NULL ¹®ÀÚ (\0)±îÁö·Î °áÁ¤µÈ´Ù. ÇÁ·Î±×·¥À̸§ ´ÙÀ½¿¡´Â ȯ°æº¯¼ö (12)°¡ À§Ä¡ÇϰÔ
µÈ´Ù. ±×´ÙÀ¸ ÇÁ·Î±×·¥ÀÇ ÀÎÀÚ°¡ ¿À°Ô µÈ´Ù. ÇÁ·Î±×·¥ÀÎÀÚ´Â ÇÁ·Î±×·¥À» ½ÇÇà½Ãų ¶§
À¯Àú¿¡ ÀÇÇØ¼ ÇÁ·Î±×·¥¿¡ Àü´ÞµÇ´Â °ªÀÌ´Ù. ¿¹¸¦ µé¾î¼ "maximum"À̶õ ÇÁ·Î±×·¥À»
½ÇÇà½ÃŲ´Ù¶ó°í Çϸé, ./maximum À» ŸÀÌÇÎ ÇØ¼ ½ÇÇàÇÏ°Ô µÇ´Âµ¥ ./maximum ÀÌ ÇÁ·Î±×·¥
ÀÎÀÚ°¡ µÈ´Ù. À̰æ¿ìÀ¸³Ù ´ÜÁö ÇϳªÀÇ ÀÎÀÚ°¡ ÇÁ·Î±×·¥À¸·Î Àü´ÞµÉ °ÍÀÌ´Ù.
ÇÏÁö¸¸ Çʿ信 µû¶ó¼ ."/maximum 48 59"¿Í °°ÀÌ ÇϳªÀÌ»óÀÇ ÀÎÀÚ°¡ µé¾î°¥ ¼öµµ ÀÖ´Ù.
´ÙÀ½À¸·Î stack (12) ¿µ¿ªÀÌ ÀÖ´Ù. ½ºÅÃÀº Àӽ÷ΠÀڷḦ ÀúÀåÇϱâ À§ÇÑ ¿µ¿ªÀ¸·Î
ÇÊ¿äÇÑ µ¥ÀÌÅ͸¦ ¹Ð¾î³Ö°Å³ª °¡Á®¿Ã ¼ö ÀÖ´Ù. ½ºÅÃÀÇ Á¦ÀÏ Ã³À½(²À´ë±â)´Â %esp¸¦
ÀÌ¿ëÇØ¼ °¡¸®Å³ ¼ö ÀÖÀ¸¸ç, °ªÀ» Áõ°¡½ÃÅ´À¸·Î½á, ½ºÅÃÀ» Ž»öÇÒ ¼ö ÀÖ´Ù. ½ºÅÿ¡
¾î¶² °ªÀ» ÀÔ·ÂÇϸé, ½ºÅÃÀº ÀÚ¿¬½º·´°Ô ´ÙÀ½ °ªÀ» °¡¸®Å²´Ù. Áï °ªÀ» ¹Ð¾î³Ö°Ô µÇ¸é
½ºÅÃÆ÷ÀÎÅͰ¡ °¨¼ÒÇÏ°í °ªÀ» °¡Á®¿À¸é (pop) ½ºÅÃÆ÷ÀÎÅͰ¡ Áõ°¡ÇÏ´Â ¹æ½ÄÀÌ´Ù.
À§ÀÇ ÄÚµå´Â ¾Æ·¡¿Í µ¿ÀÏÇÏ´Ù.
movl %eax, (%esp)
subl $4, %esp
%eax´Â 4¹ÙÀÌÆ®ÀÇ Å©±â¸¦ °¡Áø´Ù. À̰ÍÀ» ½ºÅÿ¡ ¹Ð¾î ³Ö¾úÀ¸´Ï, ´ÙÀ½°ªÀ» ³ÖÀ» ¶§¿¡´Â
4¹ÙÀÌÆ® ¸¸Å µÚ·Î ¹Ð·Á¼ °ªÀ» ³Ö¾î¾ß ÇÒ °ÍÀÌ´Ù. À̸¦ À§Çؼ sublÀ» ÀÌ¿ëÇØ¼ %esp¿¡¼
4¸¸ÅÀ» »©ÁÖ¾ú´Ù.
À§ÀÇ ÄÚµå´Â popÀ» ÇѰæ¿ìÀε¥, ¾Æ·¡¿Í µ¿ÀÏÇÏ´Ù.
movl (%esp), %eax
addl $4, %esp
%esp¿¡ °ýÈ£°¡ ÀÖ´Â ÀÌÀ¯´Â %espÀÇ ÁÖ¼Ò°ªÀÌ ¾Æ´Ñ %esp°¡ °¡¸®Å°´Â °÷ÀÇ °ªÀ» °¡Á®¿À±æ
¿øÇϱ⠶§¹®ÀÌ´Ù. 4¹ÙÀÌÆ® Å©±âÀÇ °ªÀ» ²¨³»¿Ô±â ¶§¹®¿¡,
%esp¿¡¼ 4¸¸ÅÀ» ´õÇØÁ༠½ºÅÃÀÇ ´ÙÀ½ °ªÀ» °¡¸®Å°µµ·Ï ÇØÁÖ¾ú´Ù.
ÀÌ·¸°Ô ÇØ¼ stack´Â °ªÀ» °¨¼Ò½Ã۰í, .bss¼½¼ÇÀº °ªÀ» Áõ°¡½ÃŲ´Ù´Â °ÍÀ» ¾Ë°Ô µÇ¾ú´Ù.
À̵é Áß°£¿µ¿ªÀº break ¶ó°í ºÒ¸®¿ì¸ç, Ä¿³ÎÀº breakÀ» ¹þ¾î³ª¼ ¼·ÎÀÇ ¿µ¿ªÀ» ħ¹üÇÏÁö
¾Êµµ·Ï °ü¸®¸¦ Çϰí ÀÖ´Ù. ¸¸¾à ¼·ÎÀÇ ¿µ¿ªÀ» ħ¹üÇÏ°Ô µÇ¸é ÇÁ·Î±×·¥Àº
"segmentation falut" ¿¡·¯ ¸Þ½ÃÁö¸¦ Ãâ·ÂÇϰí Á¾·áµÈ´Ù. ¸¶Âù°¡Áö·Î ´ç½ÅÀÇ ÇÁ·Î±×·¥ÀÌ
0x08048000ÀÌÀüÀÇ µ¥ÀÌÅÍ¿µ¿ª¿¡ Á¢±ÙÇÒ°æ¿ì¿¡µµ µ¿ÀÏÇÑ ¿¡·¯¸Þ½ÃÁö¿Í ÇÔ²² Á¾·á°¡
µÈ´Ù.
±×·³ ¿Ö ÄÄÇ»ÅÍ´Â break ¿µ¿ªÀ» ¿¢¼¼½º ÇÏ´Â°É Çã¿ëÇÏÁö ¾Ê´Â °ÍÀϱî ?
À̵¥ ´ëÇÑ ´äÀ» ¾ò±â À§Çؼ´Â ÄÄÇ»ÅͰ¡ ¸Þ¸ð¸®¸¦ ¾î¶»°Ô ´Ù·ç´ÂÁö¿¡ ´ëÇÑ
Á»´õ ±íÀº ÀÌÇØ°¡ ÇÊ¿äÇÏ´Ù.
¿©±â¿¡¼ ¿©·¯ºÐÀº ¸ðµç ÇÁ·Î±×·¥ÀÌ °°Àº ¸Þ¸ð¸® ¿µ¿ªÀ» »ç¿ëÇÏ´ÂÁö¿¡ ´ëÇÑ
±Ã±ÝÁõÀÌ »ý±æ °ÍÀÌ´Ù. ±×·±µ¥ ÀÌ·¸°Ô µÉ°æ¿ì ´Ù¸¥ ÇÁ·Î±×·¥ÀÌ µ¥ÀÌÅ͸¦
µ¤¾î¾²°Å³ª »èÁ¦ÇÏ´Â°Ô °¡´ÉÇØÁú °ÍÀ̹ǷÎ, ÀÌ´Â ÇÁ·Î±×·¥ÀÇ ÀÛµ¿¿¡
Ä¡¸íÀûÀÎ ¿µÇâÀ» ³¢Ä¡°Ô µÉ °ÍÀÌ´Ù. ¾Õ ÀåÀ» º¸´õ¶óµµ, ¸ðµç ÇÁ·Î±×·¥Àº µ¿ÀÏÇÑ
ÁÖ¼Ò¿¡¼ ½ÃÀÛÇÏ´Â °ÍÀ¸·Î º¸ÀδÙ.
±×·¯³ª ½ÇÁ¦ ÀÌ·±ÀÏÀº ¹ß»ýÇÏÁö ¾Ê´Â´Ù. ´ç½ÅÀÇ ÇÁ·Î±×·¥Àº ´ÜÁö virtual_memory (12) ¿¡¸¸
Á¢±Ù °¡´ÉÇϱ⠶§¹®ÀÌ´Ù. ¿©·¯ºÐÀÌ »ç¿ëÇÏ´Â PC (12)¸¦ Æ÷ÇÔÇÑ °ÅÀÇ ´ëºÎºÐÀÇ ÇÁ·Î±×·¥Àº
¹°¸®ÀûÀÎ RAM (12)À» °¡Áö°í ÀÖÀ» °ÍÀÌ´Ù. º¸Åë 256¿¡¼ 1024Megabyte Á» ´õ ºÎÀ¯ÇÑ °æ¿ì
±× ÀÌ»óÀÇ ·¥À» °¡Áö°í ÀÖÀ» °ÍÀÌ´Ù. ¿ì¸®°¡ ¸»ÇÏ´Â ¹°¸®Àû ¸Þ¸ð¸® ÁÖ¼Ò¶õ ÀÌ·¯ÇÑ ¸Þ¸ð¸®ÀÇ
Ĩ¿¡ Á÷Á¢ÀûÀ¸·Î ºÎ¿©µÈ ¿µ¿ªÀ» ¸»ÇÑ´Ù. ±×·¸´Ù¸é °¡»ó ¸Þ¸ð¸®¶õ ¹«¾ùÀΰ¡ ?
°¡»óÀÇ ¸Þ¸ð¸®¶õ ÇÁ·Î±×·¥ÀÌ »ý°¢ÇÏ´Â ¸Þ¸ð¸®¶ó°í °£´ÜÈ÷ »ý°¢ÇÒ ¼ö ÀÖ´Ù.
¿©·¯ºÐÀÌ ÇÁ·Î±×·¥À» ½ÇÇà½Ã۸é, ÇÁ·Î±×·¥ÀÌ ·ÎµåµÇ±â Àü¿¡ Linux (12)´Â ¹°¸®Àû
¸Þ¸ð¸®¿µ¿ª¿¡¼ »ç¿ë°¡´ÉÇÑ ºñ¾îÀÖ´Â Áö¿ªÀ» ã¾Æ³»¾î¼, ÇÒ´çÇØ ÁÖ°í,
ÀÌ ÇÒ´çµÈ ¸Þ¸ð¸®ÀÇ ÁÖ¼Ò¸¦ 0x0804800 À̶ó°í ¾Ë·ÁÁÖ°Ô µÈ´Ù. Áï ÇÁ·Î±×·¥¸¶´Ù ÀÚ½ÅÀÇ
µ¶¸³ÀûÀÎ °¡»óÀÇ °ø°£À» ¸¸µé¾î ÁÖ´Â °ÍÀÌ´Ù.
ÀÌ·¸°Ô ÇÁ·Î±×·¥Àº ÀڽŸ¸ÀÇ °¡»óÀÇ °ø°£À» ¸¸µé°í, ÀÌ °ø°£¿¡¼ ³î°Ô µÈ´Ù.
´ç½ÅÀÇ ÄÄÇ»ÅÍ¿¡¼ ½ÇÇàµÇ´Â ¸ðµç ÇÁ·Î±×·¥Àº ÀÌ °¡»óÀÇ °ø°£ÀÇ 0x0804800 ÁÖ¼Ò¿¡
¿Ã·ÁÁö°í, ½ºÅÃÀº 0xbffffff¿¡¼ ½ÃÀÛÀÌ µÈ´Ù. ÀÌ·¯ÇÑ °¡»óÀÇ °ø°£¿¡ ÁÖ¾îÁö´Â
°¡»óÀÇ ÁÖ¼Ò¸¦ virtual address¶ó°í ÇÑ´Ù. ¸ðµç ÇÁ·Î±×·¥Àº °¡»óÀÇ ÁÖ¼Ò¸¦ ÀÌ¿ëÇØ¼
µ¥ÀÌÅ͸¦ ¾²°Å³ª ÀÐÁö¸¸, ½ÇÁ¦ µ¥ÀÌÅÍ´Â °¡»óÀÇ ÁÖ¼Ò¿¡ ¸ÊÇεǴ ¹°¸®ÀûÀÎ ÁÖ¼Ò¿¡
¾²¿©Áö°Ô µÈ´Ù. ÀÌ·¸°Ô °¡»óÀÇ ÁÖ¼Ò¸¦ ¹°¸®ÀûÀÎ ÁÖ¼Ò¿¡ ´ëÀÀ½ÃÄÑÁÖ´Â °úÁ¤À»
mapping À̶ó°í ÇÑ´Ù.
ÀÌÀüÀå¿¡¼ ¿ì¸®´Â bss¿Í stack»çÀÌÀÇ ¸Þ¸ð¸® ¿µ¿ªÀ» break¶ó°í Á¤ÀÇÇÑ´Ù°í ¹è¿ü¾ú´Ù.
±×·¯³ª ÀÌ·¯ÇÑ break°¡ Á¸ÀçÇÏ´Â ÀÌÀ¯¿¡ ´ëÇØ¼ ¼³¸íÇÏÁø ¾Ê¾Ò´Âµ¥, ±× ÀÌÀ¯¿¡ ´ëÇØ¼
¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.
°¡»ó¸Þ¸ð¸® ¼¼±×¸ÕÆ®´Â ±âº»ÀûÀ¸·Î ¿Ïº®ÇÏ°Ô ¹°¸®Àû ¸Þ¸ð¸® ¼¼±×¸ÕÆ®¿Í ¸ÊÇÎÀ» ½Ãų ¼ö´Â
¾ø´Ù. ¸ÊÇ뵃 ½Ã°£°ú °ø°£À» Á¤È®È÷ °í·ÁÇÒ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. ±×·¯´Ù º¸´Ï bss¿Í stack
»çÀÌ¿¡ °¡»ó¸Þ¸ð¸® ÁÖ¼Ò·Î ¸ÅÇÎÀÌ µÇÁö ¾Ê´Â ¿µ¿ªÀÌ »ý°Ü³¯ ¼ö ÀÖ´Ù. ÀÌ ºÎºÐÀº
ÇÁ·Î±×·¥¿¡¼ Á¦¾îÇÒ ¼ö ¾ø´Â ¿µ¿ªÀ̱⠶§¹®¿¡ break¿µ¿ªÀÌ µÇ´Â °ÍÀÌ´Ù.
°¡»ó ¸Þ¸ð¸®¸¦ ÀÌ¿ëÇÔÀ¸·Î ½á ¾òÀ» ¼ö ÀÖ´Â ´Ù¸¥ À̵浵 ÀÖ´Ù. ±»ÀÌ ¹°¸®ÀûÀÎ ¸Þ¸ð¸®°¡
¾Æ´Ñ Çϵåµð½ºÅ©µîµµ ¸Þ¸ð¸®¿µ¿ªÀ¸·Î »ç¿ëÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ¸ÊÇθ¸ ½ÃÄÑÁÖ¸é °£´ÜÇÑ
¹®Á¦´Ù. ´ç½ÅÀÇ ÄÄÇ»ÅͰ¡ 16MegaÀÇ ¸Þ¸ð¸®¸¦ °¡Áö°í ÀÖ´Ù°í °¡Á¤Çغ¸µµ·Ï ÇÏÀÚ.
ÀÌÁß 8Mega Á¤µµ´Â Linux¿Í ¸î °¡Áö ±âº»ÀûÀÎ ÀÀ¿ëÇÁ·Î±×·¥µéÀÌ »ç¿ëÇϰí ÀÖ´Ù.
±×¸®°í ´ç½ÅÀº gimp¸¦ ½ÇÇà½ÃÄѼ ±×·¡ÇÈ ÀÛ¾÷À» Çϱ⠿øÇϴµ¥, ÃÖ¼ÒÇÑ 20Mega Á¤µµÀÇ
°ø°£À» ÇÊ¿ä·Î ÇÑ´Ù. ±×·±µ¥ ½ÇÁ¦ ³²Àº °ø°£Àº 8Mega Á¤µµ·Î gimp¸¦ ½ÇÇà½Ãų¸¸ÇÑ ¸Þ¸ð¸®
°ø°£ÀÌ ³²¾ÆÀÖÁö¸¦ ¾Ê´Ù. ±×·¯³ª ¿ì¸®´Â ¹°¸®Àû ¸Þ¸ð¸® °ø°£ÀÌ ºÎÁ·ÇÏ´õ¶óµµ ÇÁ·Î±×·¥À»
½ÇÇà½ÃŰ´Â ¹æ¹ýÀ» ¾Ë°í ÀÖ´Ù. swap ÆÄƼ¼Ç(ȤÀº ½º¿ÒÆÄÀÏ)À» ÀÌ¿ëÇÏ¸é µÈ´Ù.
±×·¯¸é LinuxÀÇ °¡»ó¸Þ¸ð¸® °ü¸® ÇÁ·Î¼¼½º´Â ºÎÁ·ÇÑ ¾ç¸¸ÅÀ» swap¿µ¿ª¿¡¼ °¡Á®¿Í¼ ¾²°Ô µÇ¹Ç·Î
¹®Á¦¾øÀÌ gimp¸¦ ½ÇÇà½Ãų ¼ö ÀÖ°Ô µÈ´Ù. ÀÌ·¸°Ô °¡»ó ¸Þ¸ð¸®±â¹ýÀ» Àû¿ëÇÔÀ¸·Î½á,
ÇÁ·Î±×·¥Àº ÄÄÇ»ÅͰ¡ Á¦°øÇÏ´Â ÀÌ»óÀÇ ¸Þ¸ð¸® °ø°£À» »ç¿ëÇÒ ¼ö ÀÖ°Ô µÈ´Ù.
¸Þ¸ð¸®´Â pages ¶ó´Â ±×·ìÀ¸·Î ¹¿©¼ ³ª´µ°Ô µÈ´Ù. x86ÇÁ·Î¼¼½º¿¡¼
½ÇÇàµÇ´Â ¸®´ª½º¿¡¼ ÇÑ ÆäÀÌÁö´Â 4096 byteÀÇ Å©±â¸¦ °¡Áø´Ù. ¸ðµç ¸Þ¸ð¸®´Â ÆäÀÌÁö´ÜÀ§·Î
¸ÅÇÎÀÌ µÈ´Ù.
¿ì¸®´Â ¸®´ª½ºÀÇ °¡»ó¸Þ¸ð¸®°¡ ¸®¾ó¸Þ¸ð¸®¿Í swap¸¦ ÇÔ²² ÀÌ¿ëÇϰí ÀÖ´Ù´Â °ÍÀ» ¾Ë°í ÀÖ´Ù.
¸¸¾à ´ç½ÅÀÌ ¸¸µç ÇÁ·Î±×·¥ÀÌ ¾ÆÁ÷ ¸ÊÇεÇÁö ¾ÊÀº °¡»ó¸Þ¸ð¸®¸¦ Á¢±ÙÇÏ·Á°í ÇÑ´Ù¸é,
segmentation fault ¿¡·¯¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏ¸é¼ Á¾·áµÇ´Â °É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
ÀÌ·¯ÇÑ ¹®Á¦´Â ¿©·¯ºÐÀÌ data section¿¡ ¿©·¯ºÐÀÌ ÇÊ¿äÇÑ ¸¸ÅÀÇ ÃæºÐÇÑ ¸Þ¸ð¸® °ø°£À» ¹Ì¸®
È®º¸Çϵµ·Ï ÇØ¼ break point¸¦ ħ¹üÇÏÁö ¾Êµµ·Ï Çϸé ÇØ°áÀÌ °¡´ÉÇÏ´Ù.
±×·¯³ª ¾î´ÀÁ¤µµÀÇ ¸Þ¸ð¸® °ø°£À» ÇÒ´çÇØ¾ß ÇÒÁö ¾Ë¾Æ³»±â Èûµç °æ¿ì°¡ ¹ß»ýÇÑ´Ù.
¿¹¸¦ µé¾î¼ vi (12)¿Í °°Àº ÆíÁý±â¸¦ ¸¸µé°æ¿ì, ÆíÁý±âÀÇ »ç¿ëÀÚ°¡ ¾î´ÀÁ¤µµÀÇ ¹®ÀÚ¸¦ ¾²°Ô µÉÁö
¾Ë ¼ö ¾ø°Ô µÈ´Ù. ÇÑÁÙÁ¤µµ·Î ÆíÁýÀ» ¸¶Ä¡°í ÀúÀåÇÒ ¼ö ÀÖÁö¸¸, ¼ö½Ê¸Þ°¡ ÀÌ»óÀÇ µ¥ÀÌÅ͸¦
¾µ ¼ö µµ ÀÖ´Ù. ¹°·Ð ÇÑ 1±â°¡ Á¤µµ ¸Þ¸ð¸®¸¦ ÇÒ´çÇØ ¹ö¸®´Â °æ¿ì¸¦ »ý°¢Çغ¼ ¼ö ÀÖÁö¸¸ ´ÜÁö 80
¹ÙÀÌÆ®ÀÇ ¹®ÀÚ¸¦ ¾²±â¸¦ ¿øÇÒ°æ¿ì ¾öû³ ³¶ºñ°¡ ¹ß»ýÇÏ°Ô µÈ´Ù.
Linux (12)´Â ÀÌ·¯ÇÑ ¹®Á¦ÀÇ ÇØ°áÀ» À§Çؼ break point¸¦ À̵¿ÇÒ ¼ö ÀÖ°Ô²û ¼ö´ÜÀ» Á¦°øÇϰí ÀÖ´Ù.
¸¸¾à ´õ ¸¹Àº ¸Þ¸ð¸® °ø°£ÀÌ ÇÊ¿äÇÒ °æ¿ì À̸¦ ¸®´ª½º¿¡ ¿äûÀ» Çϸé, ¸®´ª½º´Â ÇÊ¿äÇÑ ¸¸ÅÀÇ
¸Þ¸ð¸®¸¦ ¸ÊÇνÃÄÑÁÖ°í break point¸¦ ÀÌ¿¡ ¸Â°Ô À̵¿½ÃÄÑ ÁØ´Ù.
ÀÌ·¸°Ô ¸Þ¸ð¸®¸¦ ÃßÀûÇÏ¸é¼ break point¸¦ º¯°æ½ÃŰ´Â ¹æ¹ýÀº ÇѰ¡Áö ¹®Á¦Á¡À» °¡Áö°í ÀÖ´Ù.
¿¹¸¦ µé¾î ¿©·¯ºÐÀÌ ÆÄÀÏÀ» ¿¾î¼ µ¥ÀÌÅ͸¦ Àоîµé¿´´Ù¸é, break point¸¦ º¯°æ½ÃÄѼ ÇÊ¿äÇÑ
¸¸ÅÀÇ ¸Þ¸ð¸® °ø°£À» È®º¸ÇÏ°Ô µÉ°ÍÀÌ´Ù. ¿©±â¿¡¼ »õ·Î¿î ÆÄÀÏÀ» ÀоîµéÀ̱â À§Çؼ´Â
¶Ç ´Ù½Ã break pointÀÇ À̵¿ÀÌ ÇÊ¿äÇÏ°Ô µÈ´Ù. ÀÌ break point´Â ù¹øÂ° ÆÄÀÏÀÇ ¿µ¿ªÀ» ¹þ¾î³
À§Ä¡¿¡ Á¸ÀçÇÏ°Ô µÉ °ÍÀ̹ǷÎ, ¸ÊÇÎÀº µÇ¾úÁö¸¸ »ç¿ëÇÏÁö ¾Ê´Â ³²´Â °ø°£ÀÌ »ý¼ºµÇ°Ô µÈ´Ù.
ÀÌ¹Ì ¸ÊÇÎÀÌ µÇ¾îÀÖÀ¸¹Ç·Î, ´Ù¸¥ ÇÁ·Î±×·¥Àº ÀÌ ¿µ¿ªÀ» »ç¿ëÇÒ ¼ö ¾ø°Ô µÈ´Ù.
¸¸¾à ÀÌ·¯ÇÑ ÀÏÀÌ °è¼ÓÀûÀ¸·Î ¹Ýº¹µÈ´Ù¸é, ¸Þ¸ð¸® ´©¼ö Çö»óÀÌ ¹ß»ýÇÏ°Ô µÉ °ÍÀÌ´Ù.
±×·¡¼ ¸Þ¸ð¸® °ü¸®°¡ ÇÊ¿äÇÏ°Ô µÈ´Ù. ¸Þ¸ð¸® °ü¸®´Â '''allocate'''¿Í '''deallocate'''ÀÇ µÎ°³ÀÇ
±âº»ÀûÀÎ ÇÔ¼ö¸¦ ÅëÇØ¼ ÀÌ·ç¾îÁö°Ô µÈ´Ù. ¸Þ¸ð¸®°¡ ÇÊ¿äÇÏ´Ù¸é allocate¸¦ È£ÃâÇØ¼ ÇÊ¿äÇÑ
°ø°£À» ÇÒ´ç¹Þ°í, ÇÊ¿ä ¾øÀ» °æ¿ì deallocate¸¦ È£ÃâÇØ¼ À̸¦ ¹ÝȯÇÏ°Ô µÈ´Ù.
±×·³ ¾î¶²½ÄÀ¸·Î ¸Þ¸ð¸®¸¦ °ü¸®ÇÏ´ÂÁö¿¡ ´ëÇØ¼ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.
#
.section .data
######### GLOBAL VARIABLE ###########
heap_begin:
.long 0
current_break:
.long 0
###### CONSTANTS ########
.equ UNAVAILABLE, 0
.equ AVAILABLE, 1
.equ BRK, 45 # brk (2) System Call
.equ LINUX_SYSTEMCALL, 0x80
###### STRCUTURE INFORMATION #######
.equ HEADER_SIZE, 8
.equ HDR_AVAIL_OFFSET, 0
.equ HDR_SIZE_OFFSET, 4
.section .text
######### FUNCTION ###########
## allcate_init
# PURPOSE : call this function initialize the functions
# specifically, this sets heap_begin and current_break.
# this has no parameters and no return value.
.globl allocate_init
.type allocate_init, @function
allocate_init:
pushl %ebp
movl %esp, %ebp
# brk (2) system call
movl $BRK, %eax
movl $0, %ebx
int $LINUX_SYSCALL
incl %eax # %eax now has last valid
# address, and we want the memory
#location after that
movl %eax, current_break #store the current break
movl %eax, heap_begin #store the current break as our
#first address. this cause the allocate function
# to get more memory from Linux the first
#time it is run
movl %ebp, %esp #exit function
popl %ebp
ret
##### END OF FUNCTION #####
##allocate##
#PURPOSE: This function is used to grab a section of memory.
# It checks to see if there are any free blocks, and,
# if not, it asks Linux for a new one.
#PARAMETERS: This function has one parameter - the size of the memory
# block we want allocate
#RETURN VALUE:
# This function returns the address of allocated
# memory in %eax. if there is no memory available, it will
# return 0 in %eax
##### PROCESSING ######
#Variables used;
#
# %ecx - hold the size of requested memory
# %eax - current memory segment being examined
# %ebx - current break position
# %edx - size of current memory segment
# We scan through each memory segment starting with heap_begin.
# We look at the size of each one, and if it has been allocated.
# If it's big enough for the requested size. and its available,
# if grabs that one. If it does not find a segment large enough,
# it asks Linux for more memory. In that case, it moves
# current_break up
.globl allocate
.type allocate,@function
.equ ST_MEM_SIZE, 8
allocate:
pushl %ebp
movl %esp, %ebp
movl ST_MEM_SIZE(%ebp), %ecx # %ecx will hold the size we are
# looking for
movl heap_begin, %eax # %eax will hold the current search
# location
movl current_break, %ebx # %ebx will hold the current break point
alloc_loop_begin: #here we iterate through each
#memory segment
cmpl %ebx, %eax #need more memory if these are equal
je move_break
movl HDR_SIZE_OFFSET(%eax), %edx #grab the size of this memory
cmpl $UNAVAILABLE, HDR_AVAIL_OFFSET(%eax) # If the space unavailable, go the
je next_location #next one
cmpl %edx, %ecx #If the space is avalable, compare
jle allocate_here #the size to the needed size. If its
#big enough, go to allocate_here
#may want to add code here to
#combine allocations
next_location:
addl $HEADER_SIZE, %eax #The total size of the memory segment
addl $edx, $eax #is the sum of the size requested
#(currently stored in %edx), plus another
#8 storage locations for the header
#(4 for the AVAILABLE/UNAVAILABLE flag,
#and 4 for the size of the segment). so
#adding %edx and $8 to %eax will get
#the address of the next memory segment
jmp alloc_loop_begin
allocate_here:
movl $UNAVAILABLE, HDR_AVAIL_OFFSET(%eax) #mark space as unavailable
addl $HEADER_SIZe, %eax
movl %ebp, %esp
popl %ebp
ret
move_break:
addl $HEADER_SIZE, %ebx #noew we need to increase %ebx to
addl %ecx, %ebx #where we _want_ memory to end, so we
#add space for the headers structure
#add space to the break for
#the data requested
#now its time to ask Linux for more
#memory
pushl %eax #save needed registers
pushl %ecx
pushl %ebx
movl %BRK, %eax
int $LINUX_SYSCALL
cmpl $0, %eax
jre error
popl %ebx #restore saved registers
popl %ecx
popl %eax
movl $UNAVAILABLE, HDR_AVAIL_OFFSET(%eax) #set this memory as
#unavailable, since we're about to
#give it away
movl %ecx, HDR_SIZE_OFFSET(%eax) #set the size of the memory
addl $HEADER_SIZE, %eax #move %eax to the actual start of
#usable memory. %eax now holds the
#return value
movl %ebx, current_break
movl %ebp, %esp
popl %ebp
ret
error:
movl $0, %eax
movl %ebp, %esp
popl %ebp
ret
####### END OF FUNCTION #######
## deallocate ##
# PURPOSE : The Purpose of this function is to give back
# a segment of memory to the poll after we're done
# using it.
#
# PARAMETERS : The only parameter is the address of the memory we want to
# return to the memory pool
# RETURN VALUE : There is no return value
# PROCESSING :
# If you remmember, we actually hand program the
# start of the memory that they can use, which is
# 8 storage locations after the actual start of the
# memory segment. All we have to do is go back
# 8 locations and mark that memory as available,
# so that the allocate function knows it can use it.
.globl deallocate
.type deallocate, @function
.equ ST_MEMORY_SEG, 4 # stack position of
deallocate:
# since the function is so simple, we
#don't need any of the fancy function
# stuff
movl ST_MEMORY_SEG(%esp), %eax # get the address of the memory to free
#(normally this is 8(%ebp), buf since
#we didn't push %ebp or move %esp to
#%ebp, we can just do 4(%esp)
subl $HEADER_SIZE, %eax #get the pointer to real beginning
#of the memory
movl $AVAILABLE, HDR_AVAIL_OFFSET(%eax) #mark it as available
ret
####### ENF OF FUNCTION ##########
À§ ÄÚµå´Â ±× ÀÚü°¡ ¿ÏÀüÇÑ ÇÁ·Î±×·¥ÀÌ ¾Æ´Ï´Ù. ´ÜÁö program ¼½¼Ç¸¸ °¡Áö°í ÀÖÀ¸¸ç, ¶§¹®¿¡ _start ½Éº¼À»
°¡Áö°í ÀÖÁö ¾Ê´Ù´Â Á¡À» ÁÖ¸ñÇϱ⠹ٶõ´Ù. ±×·¯¹Ç·Î ´Üµ¶À¸·Î ½ÇÇàµÉ ¼ö ¾øÀ¸¸ç, ´Ù¸¥ Äڵ忡 ¸µÅ©µÇ¾î¼
ÇØ´ç ÇÔ¼ö¸¦ È£ÃâÇÏ´Â Çü½ÄÀ¸·Î¸¸ »ç¿ëµÉ ¼ö ÀÖ´Ù. ¾Æ¸¶µµ C¸¦ ÀÌ¿ëÇØ¼ ´ÙÁß¼Ò½º ÄÄÆÄÀÏÀ» ÇØº¸¾Ò´Ù¸é ½±°Ô
ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº ³ªÁß¿¡ ´Ù·çµµ·Ï ÇÒ °ÍÀÌ´Ù. ÀÏ´ÜÀº ´ÙÀ½°ú °°ÀÌ objectÇü½ÄÀ¸·Î
¸¸µéµµ·Ï ÇÑ´Ù.
ÀÌÁ¦ Äڵ带 ºÐ¼®ÇØ º¸µµ·Ï ÇÏÀÚ.
heap_begin:
.long 0
current_break:
.long 0
À§ ÄÚµå´Â ÇÁ·Î±×·¥ÀÇ Ã¹ ºÎºÐÀ¸·Î heap¿µ¿ªÀ» °¡¸®Å°±âÀ§Çؼ »ç¿ëÇÑ´Ù.
¾î¼Àºí¸® ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¶§ ¿ì¸®´Â heap¿µ¿ªÀÇ ½ÃÀÛÀ§Ä¡¸¦ ¾Ë ¼ö°¡ ¾øÀ¸¸ç,
¶§¹®¿¡ break point¸¦ °áÁ¤ÇÒ ¼öµµ ¾ø´Ù. ±×·¡¼ 0À¸·Î ÀÏ´Ü Ã¤¿öµÎ¾ú´Ù. ÁÖ¼®À» º¸¸é
global variable (Àü¿ªº¯¼ö)¶ó°í ÇØµÐ°É º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÇÁ·Î±×·¥À»
ÀÛ¼ºÇÏ´Ùº¸¸é Àü¿ªº¯¼ö³ª Áö¿ªº¯¼ö¶ó´Â ¸»À» ¸¹ÀÌ µé¾î º¸¾ÒÀ» °ÍÀÌ´Ù.
Áö¿ªº¯¼ö´Â procedure°¡ ½ÇÇàµÉ ¶§ ½ºÅÿ¡ ÇÒ´çµÇ´Â º¯¼ö¸¦ ¸»ÇÑ´Ù. ¹Ý¸é Àü¿ªº¯¼ö´Â
ÇÁ·Î±×·¥ÀÌ ½ÃÀÛµÉ ¶§, Á¤ÀÇ¿Í ÇÒ´çÀÌ ÀÌ·ç¾îÁø´Ù. ÀÌ·¯ÇÑ ÀÌÀ¯·Î Àü¿ªº¯¼ö´Â
ÇÁ·Î±×·¥ÀÌ Á¾·áµÉ ¶§±îÁö ÇÁ·Î±×·¥ Àü¿ª¿¡ °ÉÃļ »ç¿ëµÇ¾îÁö¸ç, Áö¿ªº¯¼ö´Â ÇÁ·Î½ÃÁ®ÀÇ Á¾·á¿Í
µ¿½Ã¿¡ »ç¶óÁö°Ô µÈ´Ù. ÀϹÝÀûÀ¸·Î ÁÁÀº ÇÁ·Î±×·¥Àº Áö¿ªº¯¼ö¸¦ ÁÖ·Î »ç¿ëÇϸç, Àü¿ªº¯¼ö´Â
Á¦ÇÑÀûÀ¸·Î »ç¿ëÇÑ´Ù. Áö¿ªº¯¼ö¿¡ ´ëÇØ¼´Â ³ªÁß¿¡ Á»´õ ÀÚ¼¼È÷ ´Ù·çµµ·Ï ÇϰڴÙ.
´ÙÀ½Àº »ó¼ö (constants)¿µ¿ªÀÌ´Ù. »ó¼ö´Â ¾î¶² °ªÀ» »ç¿ëÇϱ⠽±µµ·Ï ÀçÁ¤ÀÇ
ÇÑ Symbol À̶ó°í º¸¸é µÈ´Ù. ¾Æ·¡ÀÇ ¿¹¸¦ º¸µµ·Ï ÇÏÀÚ.
.equ UNAVAILABLE, 0
.equ AVAILABLE, 1
ÀÌ´Â UNAVAILABE¸¦ »ç¿ëÇÒ°æ¿ì ÀÌ´Â ¼ýÀÚ 0À» »ç¿ëÇϸç, AVAILABLE¸¦ »ç¿ëÇÒ °æ¿ì ¼ýÀÚ 1ÀÌ
»ç¿ëµÇ¾î ÁüÀ» ÀǹÌÇÑ´Ù. ¸¸¾à ÀÌ·¯ÇÑ »ó¼ö´ë½Å¿¡, ÄÚµå Áß¿¡ 0°ú 1À» Á÷Á¢ »ç¿ëÇÏ°Ô µÉ°æ¿ì
Àǹ̸¦ Á¦´ë·Î ÆÄ¾ÇÇϱⰡ Èûµé °ÍÀÌ´Ù. ¶ÇÇÑ AVAILABLEÀÇ °ªÀ» 2·Î ÇÏ°í ½Í´Ù°í ÇÒ °æ¿ì¿¡µµ,
´ÜÁö »ó¼ö¸¸ ã¾Æ¼ °ªÀ» ¹Ù²ãÁÖ¸é µÈ´Ù. »ó¼ö¸¦ »ç¿ëÇÏÁö ¾Ê¾ÒÀ» °æ¿ì¿¡´Â ÀÏÀÏÀÌ Äڵ带 ã¾Æ°¡¸é¼
°ªÀ» ¹Ù²ãÁà¾ß¸¸ ÇÒ °ÍÀÌ´Ù.
.equ BRK, 45
.equ LINUX_SYSCALL, 0x80
int $0x80À» »ç¿ëÇÏ´Â °Íº¸´Ù´Â int $LINUX_SYSCALLÀÌ ÈξÀ ÀÌÇØÇÏ°í »ç¿ëÇϱ⵵ ½±´Ù. ÀϹÝÀûÀ¸·Î
»ó¼ö´Â ÇÁ·Î±×·¥»ó¿¡ ÇϵåÄÚµù µÇ´Â °ªµéÀ» °ü¸®Çϱâ À§Çؼ »ç¿ëµÈ´Ù. »ó¼ö´Â .equ¸¦ ÀÌ¿ëÇØ¼
Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.
´ÙÀ½¿¡¼ ±¸Á¶Ã¼¸¦ Á¤ÀÇ Çϰí ÀÖ´Ù. ÀÌ ±¸Á¶Ã¼´Â ¸Þ¸ð¸®ÀÇ ¸íÈ®ÇÑ Á¦¾î¿Í
°ü·ÃµÈ ÀÏ·ÃÀÇ Á¤º¸µé·Î ÀÌ·ç¾îÁø´Ù.
¸Þ¸ð¸®¸¦ »ç¿ëÇϱâ À§ÇÑ °¡Àå Áß¿äÇÑ Á¤º¸´Â, "½ÃÀÛÀ§Ä¡"¿Í "Å©±â"°¡ µÈ´Ù.
À̵é Á¤º¸¸¦ À§Çؼ 4byteÀÇ Å©±â¸¦ °¡Áö´Â 2°³ÀÇ °ªÀÌ Á¤Àǰ¡ µÇ¾î¾ß
ÇÒ °ÍÀÌ´Ù. ±×¸®°í Çì´õÁ¤º¸¸¦ °¡Áö´Âµ¥, ÀÌ Çì´õ´Â ±¸Á¶Ã¼ÀÇ Å©±â¸¦
¾Ë·ÁÁÖ±â À§Çؼ »ç¿ëÇÑ´Ù. 2°³ÀÇ 4byteÅ©±âÀÇ »ó¼ö°¡ »ç¿ëµÇ°í
ÀÖÀ½À¸·Î 8·Î Á¤ÀÇµÇ¸é µÉ °ÍÀÌ´Ù.
ÃÖÁ¾ÀûÀ¸·Î ´ÙÀ½°ú °°ÀÌ ±¸Á¶Ã¼¸¦ Á¤ÀÇÇϰí ÀÖ´Ù.
.equ HEADER_SIZE, 8
.equ HDR_AVAIL_OFFSET, 0
.equ HDR_SIZE_OFFSET, 4
Çì´õ¿¡´Â ±¸Á¶Ã¼ÀÇ Å©±â¸¦ °¡¸®Å°´Â 8ÀÌ Á¤ÀǵǾî ÀÖ´Ù. available offsetÀº
µ¥ÀÌÅͰ¡ ÀúÀåµÇ´Â ¸Þ¸ð¸®»óÀÇ À§Ä¡¸¦ ÀúÀåÇϱâ À§Çؼ »ç¿ëÇÑ´Ù.
Size Offset ¿¡´Â ÇÒ´çµÈ ¸Þ¸ð¸®ÀÇ Å©±â°¡ µé¾î°¡°Ô µÈ´Ù. ¸Þ¸ð¸®ÀÇ
½ÃÀÛÀ§Ä¡¿Í Å©±â¸¦ ¾Ë°Ô µÇ¹Ç·Î ¸Þ¸ð¸®°ü¸®¸¦ À§ÇÑ ÃÖ¼ÒÇÑÀÇ Á¤º¸¸¦
ÀúÀåÇϱâ À§ÇÑ ±¸»öÀº ¸ÂÃá¼ÀÀÌ´Ù. ¸¸¾à ¸Þ¸ð¸®°ü¸®¸¦ À§Çؼ ´Ù¸¥ ¾î¶²
Á¤º¸¸¦ ´õ Ãß°¡ÇØ¾ß ÇÑ´Ù¸é, »ó¼öÇϳª¸¦ ´õ Ãß°¡Çϰí HEADER_SIZE¸¦
º¯°æ½ÃÄÑ Áֱ⸸ ÇÏ¸é µÈ´Ù. ÀÌ·¯ÇÑ ±¸Á¶Ã¼´Â Àü¿ªº¯¼öµé°ú ¸¶Âù°¡Áö·Î
ÄÚµåÀÇ °¡Àå ù ºÎºÐ¿¡ À§Ä¡ÇÏ°Ô µÈ´Ù.
ÀÌ ÇÔ¼ö´Â °£´ÜÇÏ´Ù. heap_begin°ú current_break º¯¼ö°ªÀ» ¼³Á¤ÇÏ°Ô µÇ´Âµ¥,
À̵鿡 ´ëÇÑ ³»¿ëÀº ÀÌ¹Ì ¾Õ¿¡¼ ´Ù·ç¾ú´Ù. ÀÌÀü ÀåÀÇ ³»¿ëÀ» ÁÖÀDZí°Ô
ÀÐ¾î º¸¾Ò´Ù¸é, brk (2)½Ã½ºÅÛ È£ÃâÀ» ÀÌ¿ëÇØ¼ ÃÖ±ÙÀÇ ºê·¹ÀÌÅ© Æ÷ÀÎÅ͸¦
¿Å±â´Â ¾Æ·¡ÀÇ Äڵ带 ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
pushl %ebp
movl %esp, %ebp
movl $BRK, %eax
movl $0, %ebx
int $LINUX_SYSCALL
incl %eax
int $LINUX_SYSCALLÀÌ ½ÇÇàµÈ ÈÄ¿¡, %eax´Â ÁÖ¼ÒÀÇ ¸¶Áö¸·°ªÀÌ Ã¤¿öÁö°Ô µÈ´Ù.
±×·¯³ª ¿ì¸®°¡ ½ÇÁ¦·Î ¿øÇÏ´Â ÁÖ¼Ò´Â »ç¿ë°¡´ÉÇÑ ÁÖ¼ÒÀÇ Ã³À½ °ªÀÌ´Ù. ±×·¡¼
incl %eax¸¦ ÀÌ¿ëÇØ¼ %eax¸¦ Áõ°¡½ÃÄ×´Ù. ÀÌÁ¦ ¿ì¸®´Â heap_begin¿µ¿ªÀ¸·Î À̵¿Çϸé
µÈ´Ù. ¾ÆÁ÷ ÇÒ´çÇÑ ¸Þ¸ð¸®°¡ ¾øÀ¸¹Ç·Î current_break¿Í heap_beginÀº °°Àº °ªÀ» °¡Áö°í
ÀÖÀ» °ÍÀÌ´Ù.
incl %eax
movl %eax, current_break
movl %eax, heap_begin
movl %ebp, %esp
popl %ebp
heap¿µ¿ªÀº heap_begin°ú current_break»çÀÌ¿¡ À§Ä¡ÇÑ´Ù. ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ ÈüÀÇ Ã³À½ À§Ä¡¸¦
¾ò¾î³ÂÀ¸´Ï ÀÌÁ¦ allocateÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ heapÀ» ÇÊ¿äÇÑ ¸¸Å È®Àå½Ã۱⸸ ÇÏ¸é µÈ´Ù.
ÀÌ ÇÔ¼ö´Â ´ÙÀ½°ú °°Àº ÀϵéÀ» ÇÏ°Ô µÈ´Ù.
heapÀÇ ½ÃÀÛ À§Ä¡·Î °£´Ù.
heapÀÇ ³¡ÀÎÁö ¾Æ´ÑÁö¸¦ üũÇÑ´Ù.
¸¸¾à ¿ì¸®°¡ ¿äûÇÏ´Â ¸Þ¸ð¸®ÀÇ ¿µ¿ªÀÌ heapÀÇ ³¡À» ÃʰúÇØ ¹ö¸°´Ù¸é, unavailable(»ç¿ëÇÒ¼ö ¾øÀ½)
À» ¸®ÅÏÇÒ °ÍÀÌ´Ù.
¿äûµÈ ÃÖ±ÙÀÇ ¸Þ¸ð¸® ¿µ¿ªÀÌ unavailable À̶ó¸é, 2´Ü°è·Î µÇµ¹¾Æ°£´Ù.
¶§·Î´Â available»óÅÂÀÌÁö¸¸, ¸Þ¸ð¸® ¿µ¿ªÀÌ ¿äûÇÑ ¸¸Å ÃæºÐÇÏÁö°¡ ¾ÊÀ» °æ¿ì°¡ ÀÖ´Ù. À̰æ¿ì¿¡µµ
2 ´Ü°è·Î µÇµ¹¾Æ°£´Ù.
ÇöÀç ¸Þ¸ð¸® ¿µ¿ªÀÌ ¿äûÇÑ Å©±â¸¦ ¼ö¿ëÇÒ¸¸Å ÃæºÐÈ÷ Å©´Ù¸é, unavailable ¸¦
Ç¥±âÇÏ°í ¸®ÅÏÇÑ´Ù.
À§ÀÇ °úÁ¤À» ¿°µÎ¿¡ µÎ°í Äڵ带 ´Ù½Ã º¸°Ô µÇ¸é, ¾Æ·¡ÀÇ ÄÚµåÀÇ ³»¿ëÀÌ ½±°Ô ÀÌÇØµÉ °ÍÀÌ´Ù.
´Ù½Ã ´ÙÀ½ ÄÚµå·Î ³Ñ¾î°¡º¸ÀÚ.
pushl %ebp
movl %esp, %ebp
movl ST_MEM_SIZE(%ebp), %ecx
movl heap_begin, %ecx
movl current_break, %ebx
À§ ÄÚµå´Â ·¹Áö½ºÅ͸¦ ÃʱâÈ ÇÏ´Â ÀÏÀ» ÇÏ´Ù. óÀ½ µÎ¶óÀÎÀº ÇÔ¼ö¿¡ µé¾î°¡´Â ÀüÇüÀûÀÎ ÄÚµåµéÀÌ´Ù.
´ÙÀ½ ¶óÀο¡¼´Â ½ºÅÿ¡ ÇÒ´çÇϱ⠿øÇÏ´Â ¸Þ¸ð¸®ÀÇ »çÀÌÁ ¹Ð¾î ³Ö´Âµ¥, À̰ÍÀº ÇÔ¼öÀÇ
ÀÎÀÚ·Î »ç¿ëµÉ °ÍÀÌ´Ù. ´ÙÀ½ ¶óÀο¡¼ heapÀÇ ½ÃÀÛÁÖ¼Ò¿Í ³¡ÁÖ¼Ò¸¦ ÀÔ·ÂÇÑ´Ù.
´ÙÀ½ ¼½¼ÇÀº alloc_loop_beginÀÌ´Ù. ¿©±â¿¡¼´Â ¿ì¸®°¡ ÇÊ¿ä·ÎÇÏ´Â ¸Þ¸ð¸®ÀÇ °ø°£ÀÌ È®º¸µÉ ¶§±îÁö,
Áö¼ÓÀûÀ¸·Î ¸Þ¸ð¸® ¿µ¿ªÀ» üũÇÏ°Ô µÈ´Ù.
cmpl %ebx, %eax
je move_break
¿©±â¿¡¼´Â ÃÖ±ÙÀÇ °Ë»çµÈ ¸Þ¸ð¸®ÀÇ ¿µ¿ªÀÎ %eax¿Í ÈüÀÇ ¸¶Áö¸· ¿µ¿ªÀÎ %ebx¸¦ ºñ±³ÇÏ°Ô µÈ´Ù.
°Ë»çÇѸ޸ð¸®ÀÇ ¿©¿µ¿ªÀÌ, ¸¶Áö¸· ÈüÀÇ ¿µ¿ª°ú °°´Ù¸é, ÀÌ´Â ¿ì¸®°¡ ÇÊ¿ä·Î ¿äûÇÑ ¸Þ¸ð¸®ÀÇ ¿µ¿ªÀÌ»óÀÌ
Á¸ÀçÇϰí ÀÖÀ½À» ÀǹÌÇÑ´Ù. ±×·¯¹Ç·Î ´ÙÀ½ ´Ü°è´Â °Ç³Ê ¶Ù°í ¹Ù·Î move_break·Î Á¡ÇÁÇÏ°Ô µÈ´Ù.
move_break:
addl $HEADER_SIZE, %ebx
addl %ecx, %ebx
pushl %eax
pushl %ecx
pushl %ebx
movl $BRK, %eax
int $LINUX_SYSCALL
¿©±â´Â ÄÚµåÀÇ ¸¶Áö¸· ÁöÁ¡ÀÌ´Ù. %ebx¿¡´Â ¿ì¸®°¡ »ç¿ëÇϱ⠿øÇÏ´Â ¸Þ¸ð¸®ÀÇ ¿µ¿ª°ªÀÌ µé¾î°¡¸ç,
brk (2)
½Ã½ºÅÛ È£ÃâÀÇ ÀÎÀÚ·Î »ç¿ëµÉ °ÍÀÌ´Ù. ±×¸®°í ½ºÅÿ¡ ÀúÀåÇϱ⠿øÇÏ´Â ´Ù¸¥ ·¹Áö½ºÅÍ °ªµéÀ» ¸ðµÎ ÀúÀåÇÑ´Ù.
¸¶Áö¸·À¸·Î
brk (2)À» È£ÃâÇϰí, ¸®ÅϰªÀ» °Ë»çÇÑ´Ù.
brk ½Ã½ºÅÛ È£Ãâ¿¡ ¹®Á¦°¡ ¾ø¾ú´Ù¸é, ½ºÅÃÀÇ ·¹Áö½ºÅÍ °ªµéÀ» ´Ù½Ã º¹±¸ ½Ã۰í, ¸Þ¸ð¸®¿¡ unavailabe
Ç¥½Ã¸¦ Çϰí, ¸Þ¸ð¸®»çÀÌÁ ±â·ÏÇÑ´ÙÀ½ %eax ÀÇ Æ÷ÀÎÅ͸¦ »ç¿ë°¡´ÉÇÑ ¸Þ¸ð¸®ÀÇ Ã³À½À¸·Î À̵¿½ÃŲ´Ù.
popl %ebx
popl %ecx
popl %eax
movl $UNAVAILABLE, HDR_AVAIL_OFFSET(%eax)
movl %ecx, HDR_SIZE_OFFSET(%eax)
addl $HEADER_SIZE, %eax
¸¶Áö¸·À¸·Î »õ·Î¿î ºê·¹ÀÌÅ© Æ÷ÀÎÅÍ¿Í ÇÒ´çµÈ¸Þ¸ð¸®ÀÇ Æ÷ÀÎÅ͸¦ ÀúÀåÇÏ°í ¸®ÅÏÇÑ´Ù.
±×·³ ·çÇÁÀÇ Ã³À½À¸·Î ´Ù½Ã µÇµ¹¾Æ°¡¼, ÃÖ±ÙÀÇ ¸Þ¸ð¸®°¡ ÈüÀÇ ¸¶Áö¸·À» °¡¸®Å°Áö ¾Ê°í ÀÖÀ» °æ¿ì ¾î¶²ÀÏÀÌ
¹ß»ýÇÏ´ÂÁö¸¦ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.
movl HDR_SIZE_OFFSET(%eax), %edx
cmpl $UNAVAILABLE, HDR_AVAIL_OFFSET(%eax)
je next_locaton
óÀ½ ÄÚµå´Â ¾ò¾î³½ ¸Þ¸ð¸®¿µ¿ªÀÇ Å©±â¸¦ %edx¿¡ ³Ö´Â ÀÏÀ» ÇÑ´Ù. ±×¸®°í ³ª¼ UNAVAILABLEÇ¥½Ã°¡ µÇ¾î
ÀÖ´ÂÁö¸¦ È®ÀÎÇÑ´Ù. ¸¸¾à UNAVAILABLE·Î Ç¥½Ã°¡ µÇ¾î ÀÖ´Ù¸é, ÀÌ¹Ì »ç¿ëÁßÀÎ ¿µ¿ªÀ̹ǷΠnext_location
À¸·Î Á¡ÇÁÇÑ´Ù. ¸¸¾à AVAILABLE·Î Ç¥½Ã°¡ µÇ¾î ÀÖ´Ù¸é, ÃæºÐÇÑ °ø°£ÀÌ È®º¸µÇ¾î ÀÖ´ÂÁö ¾Æ·¡ÀÇ ÄÚµå·Î
È®ÀÎÇϰí, ÃæºÐÇÑ °ø°£ÀÌ È®º¸µÇ¾î ÀÖ´Ù¸é allocate_here·Î Á¡ÇÁÇÏ¸é µÈ´Ù.
cmpl %edx, %ecx
jle allocate_here
allocate_here¿¡¼´Â ´ÙÀ½°ú °°Àº ÀÏÀ» ÇÏ°Ô µÈ´Ù.
movl $UNAVAILABLE, HDR_AVAIL_OFFSET(%eax)
addl $HEADER_SIZE, %eax
movl %ebp, %esp
popl %ebp
ret
È®º¸µÈ ¸Þ¸ð¸®´Â ´Ù¸¥, Äڵ尡 »ç¿ëÇÒ ¼ö ¾øµµ·Ï unabailableÇ¥½Ã¸¦ ÇØµÎ°í, Çì´õ»çÀÌÁŠÆ÷ÀÎÅ͸¦
À̵¿Çϰí, ÇÊ¿äÇÑ °ªÀ» ¸®ÅÏÇϰí ÇÔ¼ö¸¦ ºüÁ®³ª¿À¸é µÈ´Ù. Çì´õ»çÀÌÁŠÆ÷ÀÎÅ͸¦ À̵¿ÇÏ´Â ÀÌÀ¯´Â,
ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â ÀϹݻç¿ëÀÚ´Â Çì´õ¸¦ »ç¿ëÇÒ Çʿ䰡 ÀüÇô ¾ø±â ¶§¹®ÀÌ´Ù. »ç¿ëÀÚ¿¡°Ô´Â
´ÜÁö »ç¿ë°¡´ÉÇÑ ¸Þ¸ð¸®ÀÇ Æ÷ÀÎÅ͸¸ ³Ñ°ÜÁÖ¸é µÈ´Ù.
¸¸¾à »ç¿ë°¡´ÉÇÑ ¿µ¿ªÀε¥, Å©±â°¡ ÃæºÐÇÏÁö ¾ÊÀ» °æ¿ì´Â ¾î¶»°Ô µÉ±î ? ÀÌ °æ¿ì¿¡´Â next_location
Äڵ念¿ª (section) À¸·Î À̵¿ÇÑ´Ù. ÀÌ ¿µ¿ª¿¡¼´Â, ÇöÀç ¸Þ¸ð¸® ¿µ¿ªÀº ¿äûÇÑ ¸¸ÅÀÇ ¸Þ¸ð¸®°¡
¾øÀ¸¹Ç·Î ·çÇÁÀÇ Ã³À½ÀÎ alloc_loop_beginÀ¸·Î À̵¿ÇÏ´Â Äڵ尡 µé¾î°¡¾ß ÇÒ °ÍÀÌ´Ù. ÀÌ¿Í ´õºÒ¾î
´ÙÀ½ header¸¦ °¡¸®Å³ ¼ö ÀÖµµ·Ï HEADER_SIZE¸¸ÅÀ» À̵¿½ÃÄÑ¾ß ÇÑ´Ù.
addl $HEADER_SIZE, %eax
addl %edx, %eax
jmp alloc_loop_begin
deallocate ´Â allocate ÇÔ¼ö¿¡ ºñÇØ¼ ¸Å¿ì ½±°Ô ¸¸µé ¼ö ÀÖ´Ù. ´ÜÁö ÇöÀç
¸Þ¸ð¸® ¿µ¿ªÀ» AVAILABLE·Î Ç¥½Ã¸¸ ÇÏ¸é µÇ±â ¶§¹®ÀÌ´Ù.
movl ST_MEMORY_SEG(%esp), %eax
subl $HEADER_SIZE, %eax
movl $AVAILABLE, HDR_AVAIL_OFFSET(%eax)
ret
ÇÏ´Â ÀÏÀº °£´ÜÇÏ´Ù. ÇöÀç ½ºÅÃÀ¸·Î ºÎÅÍ ¸Þ¸ð¸®¿µ¿ªÀÇ ÁÖ¼Ò¸¦ ¾ò¾î¿Â´ÙÀ½, Çì´õºÎºÐÀ¸·Î À̵¿Çؼ
AVAILABLEÇ¥½Ã¸¦ Çϱ⸸ ÇÏ¸é µÈ´Ù.
¿©±â¿¡¼ ¸¸µç ÄÚµå´Â ½ÇÁ¦ Ȱ¿ë¿¡´Â ¹®Á¦°¡ ÀÖ´Â ÃÖ¼ÒÇÑÀÇ ±â´É¸¸ ±¸ÇöÇÑ ÇнÀ¿ë ÄÚµåÀÏ »ÓÀÌ´Ù.
Á»´õ ±×·²µíÇÏ°Ô ¸¸µé±â À§Çؼ´Â allocatorÇÔ¼ö¿¡ ¸î°¡Áö ¹®Á¦Á¡µéÀ» Àâ¾ÆÁÖ¾î¾ß¸¸ ÇÑ´Ù.
ÀÌ ÇÔ¼öÀÇ °¡Àå Å« ¹®Á¦Á¡Àº ´À¸®´Ù¶ó´Â Á¡ÀÌ´Ù. ¸¸¾à ¸î°³ÀÇ ¸Þ¸ð¸®¿µ¿ª¸¸ ¿äûÀ» ÇÏ°Ô µÈ´Ù¸é
¼Óµµ´Â ±×¸® Å« ¹®Á¦°¡ µÇÁö ¾ÊÀ» °ÍÀÌ´Ù. ±×·¯³ª ¼öõ¹øÀÇ ¸Þ¸ð¸®ÇÒ´ç ¿äûÀÌ µé¾î¿À°Ô µÈ´Ù¸é
¼Óµµ¹®Á¦°¡ ¹ß»ýÇÑ´Ù. 1000¹øÂ° ¸Þ¸ð¸®ÇÒ´ç ¿äûÀ» ÇÏ°Ô µÈ´Ù¸é, ¿©·¯ºÐÀº ¿äûÇÑ Å©±â¸¦ °¡Áø
»ç¿ë°¡´ÉÇÑ ¸Þ¸ð¸®¿µ¿ªÀÌ ÀÖ´ÂÁö¸¦ È®ÀÎÇϱâ À§Çؼ ÃÖ´ë 999¹øÀÇ °Ë»ç¸¦ ÇØ¾ß ÇÑ´Ù.
°Ô´Ù°¡ ¸®´ª½º´Â ¸Þ¸ð¸®ÀÇ ÆäÀÌÁö Á¤º¸¸¦ ¸Þ¸ð¸®°¡ ¾Æ´Ñ µð½ºÅ©¿¡¼ °ü¸®ÇÑ´Ù. ÀÌ´Â
¸Å¹øÀÇ °Ë»ç¸¦ ÇÔ¿¡ ÀÖ¾î¼, ¼Óµµ°¡ ´À¸° µð½ºÅ©¸¦ ÀÏÀÏÀÌ °Ë»çÇØ¾ß ÇÔÀ» ÀǹÌÇÑ´Ù.
´ç¿¬È÷ ¸Å¿ì ´À·ÁÁú ¼ö ¹Û¿¡ ¾ø´Ù. Áï ÀÌ ÇÁ·Î±×·¥Àº ÇÒ´ç¿äûÀÌ ´Ã¾î³¯¶§ ¸¶´Ù ¼±ÇüÀûÀ¸·Î ½Ã°£ÀÌ
(linear time)´Ã¾î³ª°Ô µÈ´Ù. ¸ðµç ¼±ÇüÀûÀÎ ½Ã°£ÀÌ ¼ÒºñµÇ´Â ÄÚµå´Â ³ª»Û ÄÚµåÀ̸ç, °¡´ÉÇÑ
»ó¼ö½Ã°£ (constant time)¿¡ ÁÖ¾îÁø ÀÏÀ» ÇØ³»´Â Äڵ带 ¸¸µé¾î ³»¾ß ÇÑ´Ù. ±×·¯±â À§Çؼ´Â
¸Þ¸ð¸®ÇÒ´ç ¿äûÀ» °ü¸®ÇÒ ¼ö ÀÖ´Â Äڵ带 Ãß°¡½ÃÄÑ¾ß ÇÑ´Ù. deallocate
ÇÔ¼öÀÇ °æ¿ì ´ÜÁö 4°³ÀÇ ¸í·É¸¸ »ç¿ëµÇ´Â °£´ÜÇÑ ÄÚµåÀ̹ǷΠÇÒ´ç¿äûÀÇ °¹¼ö°¡ ¸¹¾ÆÁ³´Ù°í ÇØ¼
Ưº°È÷ ¹®Á¦µÉ°Ç ¾ø´Ù.
´Ù¸¥ ¶ÇÇϳªÀÇ ¹®Á¦Á¡Àº brk (2) ½Ã½ºÅÛ È£ÃâÀ» ÀÚÁÖÇѴٴµ¥ ÀÖ´Ù. ½Ã½ºÅÛ È£ÃâÀº ¸¹Àº ½Ã°£ÀÌ
¼Ò¸ðµÇ´Â ÀÛ¾÷ÀÌ´Ù. ¿Ö³ÄÇÏ¸é ´ÜÀÏÇÑ ÇÁ·Î¼¼½ºÀÇ mode º¯È¯ÀÌ ÀϾ±â ¶§¹®ÀÌ´Ù.
°ÅÀÇ ¸ðµç kernel´Â ¿î¿µÃ¼Á¦¸¦ º¸È£Çϱâ À§Çؼ user mode¿Í kernel mode·Î ¸ðµå¸¦
ºÐ¸®Çؼ ÇÊ¿äÇÑ ÀÏÀ» ÇÏ°Ô µÈ´Ù. ¸Þ¸ð¸® ¸ÊÇÎ, ÆÄÀÏ¿±â/¾²±â¿Í °°Àº Áß¿äÇÑ ÀÏÀ», ÇÁ·Î¼¼½º¿¡°Ô
ÀüÀûÀ¸·Î ¸Ã±æ°æ¿ì ½É°¢ÇÑ º¸¾È À§ÇèÀ» °¡Áú ¼ö Àֱ⠶§¹®À¸·Î, À§ÀÇ ÀϵéÀº ÇÁ·Î¼¼½º°¡ Ä¿³Î¿¡°Ô
¿äûÇϰí Ä¿³ÎÀÌ ¿äûÀ» ¹Þ¾Æ¼ ¼öÇàÇÏ´Â ½ÄÀ¸·Î ÀÌ·ç¾îÁø´Ù. ÇÁ·Î¼¼½º´Â Æò»ó½Ã¿¡´Â user mode·Î
ÀÛµ¿À» Çϰí, Ä¿³Î¿¡ ¾î¶² ¿äûÀ» ÇØ¾ß ÇÒ°æ¿ì kernel mode·Î º¯È¯À» ÇÏ°Ô µÇ°í, ¿äûÇÑ ÀÏÀ» ³¡³ÂÀ»
°æ¿ì ´Ù½Ã user mode·Î ÀÛµ¿ÇÏ°Ô µÈ´Ù. ÀÌ·¯ÇÑ ¸ðµåº¯È¯À» context switch ¶ó°í
ºÎ¸£±âµµ ÇÑ´Ù. ÀÌ·¯ÇÑ context switch´Â x86 ÇÁ·Î¼¼½º¿¡¼ ¸Å¿ì ´À¸®°Ô ÀϾÙ. ±×·¯¹Ç·Î
°¡´ÉÇϸé context switch°¡ ÀϾÁö ¾Êµµ·Ï ÇØÁÖ¾î¾ß ÇÑ´Ù. brk (2)´Â ¸Þ¸ð¸® ¸ÊÇÎ °ü·ÃÀÏÀ»
ÇÏ´Â °ÍÀ¸·Î, user ¸ðµå¿¡¼´Â ÇÊ¿äÇÑ ÀÛ¾÷À» ¼öÇàÇÒ ¼ö ¾øÀ¸¸ç, ¶§¹®¿¡ kernelmode·Î context switch
°¡ ¹ß»ýÇÏ°Ô µÈ´Ù. ¿ì¸®°¡ ¸¸µçÇÔ¼ö´Â ¸Å¹ø ¿äû½Ã ¸¶´Ù brk ½Ã½ºÅÛÈ£ÃâÀ» ÇØ¾ßÇÏ´Â ¹®Á¦Á¡À»
°¡Áø´Ù.
±×¸®°í ¸Þ¸ð¸®¸¦ ºñÈ¿À²ÀûÀ¸·Î °ü¸®ÇÑ´Ù´Â ¹®Á¦Á¡À» °¡Áö°í ÀÖ´Ù. ¿¹¸¦ µé¾î 5byteÀÇ ¸Þ¸ð¸® ¿µ¿ªÀ»
¿äûÇߴµ¥, »ç¿ë°¡´ÉÇÑ ¿µ¿ªÀ¸·Î?1000byte¸¦ ¾ò¾ú´Ù°í °¡´ÉÇØº¸ÀÚ. ¿ì¸®°¡ ¿äûÇÑ
¸Þ¸ð¸® ¿µ¿ªº¸´Ù ÃæºÐÈ÷ Å©¹Ç·Î, ¹®Á¦ ¾øÀÌ ¸®Å쵃 °ÍÀÌ°í »ç¿ëÇϴµ¥µµ ¹®Á¦´Â ¾ø°ÚÁö¸¸, 955 byte´Â
»ç¿ëÇÏÁö ¾Ê´Â ¸Þ¸ð¸® ¿µ¿ªÀ¸·Î ³¶ºñÇÏ°Ô µÈ´Ù. À̸¦ È¿À²ÀûÀ¸·Î »ç¿ëÇϱâ À§Çؼ´Â 955 byte¸¦ ³ªÁß¿¡
»ç¿ë°¡´ÉÇϵµ·Ï break¸¦ ºÐ¸®ÇØÁÖ¾î¾ß ÇÑ´Ù.
¿ì¸®°¡ ÀÛ¼ºÇÑ ¸Þ¸ð¸®°ü¸®ÀÚ´Â ½ÇÁ¦ »ç¿ëÇϱ⿡´Â ¹®Á¦°¡ ÀÖÁö¸¸, ÀÛµ¿
Å×½ºÆ® Á¤µµ´Â ÇØº¼ ¼ö ÀÖ´Ù. ±×·¡¼ 6Àå¿¡¼ ¿¹Á¦·Î ´Ù·ç¾ú´ø
read-records.s ÇÁ·Î±×·¥¿¡ ¿©±â¿¡¼ ¸¸µç ¸Þ¸ð¸®°ü¸®ÀÚ¸¦ »ç¿ëÇØ
º¸µµ·Ï ÇϰڴÙ.
read-records.s ÇÁ·Î±×·¥Àº ÆÄÀÏ·Î ºÎÅÍ ÀоîµéÀÎ, ³»¿ëÀ» ÀúÀåÇϱâ
À§Çؼ .bss sectionÀ»?»ç¿ëÇϰí ÀÖ´Ù.
.bss sectionÀ» º¸¸é
record_buffer ¸¦ ÀÔÃâ·Â
¹öÆÛ·Î ÀÌ¿ëÇϰí Àִµ¥, °íÁ¤µÈ Å©±â·Î ÇÒ´çµÇ¾î ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù.
ÀÌ°É ¿ì¸®°¡ ¸¸µç ¸Þ¸ð¸® °ü¸®ÀÚ¸¦ ÀÌ¿ëÇØ¼ µ¿ÀûÀ¸·Î ÇÒ´çÇϵµ·Ï
Äڵ带 ¼öÁ¤ÇÑ ÈÄ Å×½ºÆ® ÇÏ¸é µÈ´Ù. ¿ì¸®°¡ ¼öÁ¤ÇÒ ºÎºÐÀÇ
¿øº» ÄÚµå´Â ´ÙÀ½°ú °°´Ù.
.section .bss
.lcomm, record_buffer, RECORD_SIZE
¿ì¼± °íÁ¤µÈ Å©±âÀÇ record_buffer´Â Çʿ䰡 ¾øÀ» °ÍÀÌ´Ù.
µ¿ÀûÀ¸·Î ÇÒ´çµÈ ¹öÆÛÀÇ ½ÃÀÛÁÖ¼Ò¸¦ ÀúÀåÇÒ ¼ö ÀÖ´Â °ø°£¸¸ ÀÖÀ¸¸é µÈ´Ù.
½ÃÀÛÁÖ¼Ò¸¦ ÀúÀåÇϱâ À§ÇÑ °ø°£Àº 4byte¸é ÃæºÐÇÏ´Ù. ½ÃÀÛÁÖ¼Ò¸¦ ÀúÀåÇÒ
°ø°£Àº .data ¿µ¿ª¿¡ ¼±¾ðÇÏ¸é µÈ´Ù.
record_buffer_ptr:
.long 0
´ÙÀ½À¸·Î ÇÁ·Î±×·¥ÀÌ ½ÃÀÛµÈ µÚ, ¸Þ¸ð¸® °ü¸®ÀÚ¸¦ ÃʱâÈ ½Ã۱â À§Çؼ
allocate_init ¸¦ È£ÃâÇÏ´Â Äڵ带 Ãß°¡ÇÑ´Ù.
ÀÌÁ¦ ¸Þ¸ð¸®¸¦ ¿äûÇϱâ À§Çؼ, ÇÊ¿äÇÑ ¸Þ¸ð¸®ÀÇ Å©±â¿Í ÇÔ²² allocate
ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µÈ´Ù.
pushl $RECORD_SIZE
call allocate
movl %eax, record_buffer_ptr
ÀÌÁ¦ read_record¸¦ È£ÃâÇÏ°Ô µÇ¸é, µ¿ÀûÀ¸·Î ¸¸µé¾îÁø ¸Þ¸ð¸®ÀÇ ÁÖ¼Ò¸¦
ÀÌ¿ëÇÏ°Ô µÉ °ÍÀÌ´Ù. ¿¹Àü Äڵ忡¼ Æ÷ÀÎÅÍ´Â immediate-mode »óÅ·Î
record_buffer¸¦ °¡¸®Å°°í ÀÖ¾ú´Âµ¥, ÀÌÁ¦´Â record_buffer_ptrÀÇ
ÁÖ¼Ò°¡ °¡¸®Å°´Â ¿µ¿ªÀ» ÀÌ¿ëÇØ¾ß Çϱ⠶§¹®¿¡, direct mode·Î
record_buffer_ptrÀÇ °ªÀ» ÀÌ¿ëÇϵµ·Ï º¯°æÇØ¾ß ÇÑ´Ù.
pushl $record_buffer # À»
pushl record_buffer_ptr # ·Î º¯°æÇÑ´Ù.
´ÙÀ½À¸·Î ·¹Äڵ忡¼ À̸§ÀÌ ÀúÀåµÈ ÁÖ¼Ò¸¦ ã´Â ºÎºÐÀ» º¯°æÇØ¾ß ÇÑ´Ù.
¿¹Àü ÄÚµå´Â $RECORD_FIRSTNAME + record_buffer·Î À̸§ÀÌ ÀúÀåµÈ ÁÖ¼Ò¸¦
ãÀ» ¼ö ÀÖ¾ú´Ù. »õ·Î¿î ÄÚµå´Â record_buffer_ptrÀÌ °¡¸®Å°´Â ÁÖ¼Ò·Î ºÎÅÍ
À̸§ÀÌ ÀÖ´Â ÁÖ¼Ò¸¦ ã¾Æ³»¾ß ÇÑ´Ù.
¶§¹®¿¡ ·¹Áö½ºÅÍÀÇ Æ÷ÀÎÅ͸¦ record_buffer_ptr·Î ¿Å±ä´ÙÀ½
$RECORD_FIRSTNAME¸¸Å Æ÷ÀÎÅ͸¦ À̵¿ ½ÃŰ´Â ÀÏÀ» Çϵµ·Ï Äڵ带 º¯°æÇØ¾ß ÇÑ´Ù.
pushl $RECORD_FIRSTNAME + record_buffer # À»
## ¾Æ·¡¿Í °°ÀÌ º¯°æÇÑ´Ù.
movl record_buffer_ptr, %eax
addl $RECORD_FIRSTNAME, %eax
pusl %eax
¸¶Âù°¡Áö·Î ¾Æ·¡ÀÇ Äڵ嵵 º¯°æÇØ¾ß ÇÑ´Ù.
movl $RECORD_FIRSTNAME + record_buffer, %eax #À»
## ¾Æ·¡¿Í °°ÀÌ º¯°æÇÑ´Ù.
movl record_buffer_ptr, %ecx
addl $RECORD_FIRSTNAME, %ecx
¸¶Áö¸·À¸·Î ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ µÇµ¹·ÁÁÖ±â À§Çؼ record_buffer_ptrÀ» È£ÃâÇϸé
µÈ´Ù.
pushl record_buffer_ptr
call deallocate
À§¿¡¼ ¾ð±ÞÇÑ ºÎºÐÀ» ¼öÁ¤ÇÑ ÈÄ ¾Æ·¡¿Í °°ÀÌ ½ÇÇàÆÄÀÏÀ» ¸¸µé¸é µÈ´Ù.
as read-records.s -o read-records.o
ld alloc.o read-record.o read-records.o write-newline.o count-chars.o -o read-records
¼º°øÀûÀ¸·Î ½ÇÇàÆÄÀÏÀ» ¸¸µé¾ú´Ù¸é, ½ÇÇà½ÃÄѼ Å×½ºÆ®Çغ¸µµ·Ï ÇÏÀÚ.
¸®´ª½º¿Í ´Ù¸¥ ¿î¿µÃ¼Á¦ ½Ã½ºÅÛ¿¡¼ÀÇ ¸Þ¸ð¸® °ü¸®¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸µéÀº ¾Æ·¡ÀÇ ¸µÅ©µéÀ»
Âü°íÇϱ⠹ٶõ´Ù.
¸®´ª½º ÇÁ·Î±×·¥ÀÌ ½ÃÀÛµÉ ¶§ÀÇ ¸Þ¸ð¸® ±¸¼º¿¡ ´ëÇØ¼ ¼³¸íÇ϶ó.
heap¶õ ¹«¾ùÀΰ¡.
current break¶õ ¹«¾ùÀΰ¡.
¸ÊÇεÇÁö ¾ÊÀº ¸Þ¸ð¸®¿¡ Á¢±ÙÀ» ½ÃµµÇÒ °æ¿ì ¾î¶² ÀÏÀÌ ¹ß»ýÇϴ°¡.
¿î¿µÃ¼Á¦´Â ¾î¶»°Ô °¢°¢ÀÇ ÇÁ·Î¼¼½º°¡ Àڽŵ鿡°Ô ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ ÃʰúÇØ¼ »ç¿ëÇÏÁö ¸·´Â°¡.
¸Þ¸ð¸®¸¦ ÀÌ¿ëÇÒ¶§, µð½ºÅ©»ó¿¡¼ ¾î¶²ÀÏÀÌ ¹ß»ýÇÏ´ÂÁö¸¦ ¼³¸íÇ϶ó.
¸Þ¸ð¸® ÇÒ´çÀÚ°¡ ÇÊ¿äÇÑ ÀÌÀ¯¿¡ ´ëÇØ¼ ¼³¸íÇ϶ó.