9Àå. ¸Þ¸ð¸®
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

¸Þ¸ð¸®¿¡ ´ëÇÏ¿©

9. ¸Þ¸ð¸®¿¡ ´ëÇÏ¿©

¿©±â¿¡¼­ ´Ù·ç´Â ÁÖÁ¦´Â ½ÇÁúÀûÀÎ ÇÁ·Î±×·¡¹Ö ±â¼ú°ú´Â °ü°è¾ø¾î º¸ÀÏ ¼öµµ ÀÖÀ» °ÍÀ̸ç, Áö±ØÈ÷ ÀÌ·ÐÀûÀÎ °ÍµéÀÌ¶ó¼­ Àç¹Ì¾øÀ» ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. ±×·¸Áö¸¸ ¿©±â¿¡¼­ ´Ù·ç´Â ³»¿ëµéÀº ´ç½ÅÀÌ ¼º°øÀûÀÎ ÇÁ·Î±×·¡¸Ó°¡ µÇ±â À§ÇÑ µçµçÇÑ ÈÄ¿øÀÚ°¡ µÇ¾îÁÙ °ÍÀÌ´Ù.

9.1. ÄÄÇ»ÅÍ´Â ¸Þ¸ð¸®¸¦ ¾î¶»°Ô ¹Ù¶óº¸´Â°¡

¿ì¸®´Â ÀÌ¹Ì 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)ÀÇ Å©±â¸¦ °¡Áø´Ù.

¾ÕÀ¸·Î´Â ÀúÀ念¿ªÀ̶ó´Â ´Ü¾î´ë½Å¿¡ À§¿¡¼­ Á¤ÀÇ ÇÑ ´Ü¾îµéÀ» ¾²°Ô µÉ °ÍÀÌ´Ù.

9.2. Instruction Pointer

ÀÏ´Ü ·¹Áö½ºÅͰ¡ ¹«¾ðÁö ±×·¯°í ¾î¶²ÀÏÀ» ÇÏ´ÂÁö¿¡ ´ëÇØ¼­ Á»´õ ÀÚ¼¼È÷ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. ÀÏ´Ü ¿ì¸®´Â ¸î°¡Áö ·¹Áö½ºÅ͵鿡 ´ëÇØ¼­ ¹è¿ü´Âµ¥, ¿©±â¿¡¼­´Â instruction pointerÀ» ´Ù·ç´Â Á»´õ Ưº°ÇÑ ·¹Áö½ºÅÍ¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. ÀÌ ·¹Áö½ºÅÍ´Â %eip·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿ì¸®´Â ÄÄÇ»ÅÍ´Â ¸ðµç°É µ¿ÀÏÇÑ µ¥ÀÌÅÍ·Î Ãë±ÞÇÏ¸ç ¸í·É(instruction)µµ ¿¹¿Ü°¡ ¾øÀ½À» ¾Ë°í ÀÖ´Ù. ÄÄÇ»ÅÍ´Â ÀÌ°Ô ¸í·ÉÀ̵çÁö ¾Æ´Ï¸é ÀÏ¹Ý µ¥ÀÌÅ͵çÁö µ¿ÀÏÇÏ°Ô Ã³¸®¸¦ Çϸç, ¶ÇÇÑ À̵éÀ» ±¸ºÐÇÒ ´É·ÂÀ» °¡Áö°í ÀÖÁö ¾Ê´Ù. ±×·¸´Ù¸é ÄÄÇ»ÅÍ´Â ¾î¶»°Ô ÀÌ·¯ÇÑ ÀÏ·ÃÀÇ µ¥ÀÌÅÍ¿¡¼­ ¸í·ÉÀ» ã¾Æ³»¾î¼­ ±×°É ½ÇÇàÀ» ½ÃŰ°Ô µÇ´Â °ÍÀϱî ? ÇØ´äÀº instruction pointer¿¡ ÀÖ´Ù. ÀÌ instruction pointer¶ó´Â À̸§¿¡¼­ ¿ì¸®´Â ÀÌ Æ÷ÀÎÅͰ¡ ¹«¾ð°¡¸¦ °¡¸£Å²´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. instruction pointerÀº ´ÙÀ½ ¸í·É(instruction)À» °¡¸£Å²´Ù. ÄÄÇ»ÅÍ´Â instruction pointer¸¦ »ìÆìº½À¸·Î½á, ´ÙÀ½¿¡ ¾î¶² ¸í·ÉÀ» ½ÇÇàÇØ¾ß µÉÁö¸¦ ¾Ë¼ö À̰ڵȴÙ. ÇØ´ç ¸í·ÉÀ» ½ÇÇàÇÏ°Ô µÇ¸é instruction pointer´Â ´ÙÀ½ ¸í·ÉÀÇ À§Ä¡¸¦ °¡¸®Å°µµ·Ï °ªÀÌ Áõ°¡°¡µÇ¸ç, ÇöÀç ½ÇÇàÇØ¾ßµÉ ¸í·ÉÀ» ¸¶Ä¡°Ô µÇ¸é, ´Ù½Ã instruction pointerÀÇ °ªÀ» »ìÇÇ°Ô µÈ´Ù. ÀÌ·¯ÇÑ ¸í·É½ÇÇà ¹æ½ÄÀº ´ëºÎºÐÀÇ °æ¿ì¿¡ À¯È¿ÇÒ °ÍÀÌ´Ù. ±×·¯³ª jmpµîÀ» ÀÌ¿ëÇØ¼­ ¸í·ÉÀ» Á¡ÇÁÇÏ°Ô µÉ°æ¿ì´Â ¾î¶»°Ô µÉ°¡ ? ÀÌ·² °æ¿ì¿¡ ÄÄÇ»ÅÍ´Â ´ÙÀ½ ¸í·ÉÀÌ ¾Æ´Ñ ´Ù¸¥ À§Ä¡ÀÇ ¸í·ÉÀ» ½ÇÇàÇØ¾ß ÇÒ°ÍÀÌ´Ù. ÀÌ·²°æ¿ì ¿ì¸®´Â ÀϹÝÀûÀ¸·Î ¾Æ·¡¿Í °°Àº Äڵ带 »ç¿ëÇÏ°Ô µÉ°ÍÀÌ´Ù.

jmp somewhere
            
ÀÌ ÄÚµå´Â ¾Æ·¡ÀÇ ÄÚµå¿Í µ¿ÀÏÇÑ ÀÏÀ» ÇÑ´Ù.
movl $somewhere, %eip
            
¾Ë´Ù½ÃÇÇ somewhere´Â ÇÁ·Î±×·¥ÀÇ ¿µ¿ªÀ» ÂüÁ¶Çϱâ À§ÇÑ »ó¡ÀÌ´Ù. ±×·¯¹Ç·Î %eip°¡ Á÷Á¢ somewhere¸¦ ÂüÁ¶Çϵµ·Ï ÇÏ´Â °ÍÀº Çã¿ëÀÌ µÇÁö ¾Ê´Â´Ù. ±×·¯³ª '$'Ç¥½Ã¸¦ ÀÌ¿ëÇÏ°Ô µÉ°æ¿ì À̸¦ Çã¿ëÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ÀÌ´Â $Ç¥½Ã°¡ immediate mode addressiong¸ðµå·Î somewhere¸¦ °ªÀ¸·Î ´Ù·ê ¼ö ÀÖµµ·Ï ÇØÁֱ⠶§¹®ÀÌ´Ù. ¸¸¾à '$'Ç¥½Ã¸¦ »ç¿ëÇÏÁö ¾ÊÀ» °æ¿ì direct addressing mode°¡ µÇ´Âµ¥, ±×·²°æ¿ì somewhereÀÇ ÁÖ¼Ò¿¡ ÀÖ´Â °ªÀÌ %eip·Î À̵¿ÀÌ µÇ¾î¹ö¸°´Ù. À̰ÍÀº ¿ì¸®°¡ ¿øÇÏ´Â °á°ú°¡ ¾Æ´Ï´Ù. ¾Æ·¡´Â ½ÇÁ¦ ÀÚÁÖ »ç¿ëµÇ´Â ÄÚµå´Ù.
movl $0, $ebx
            
0¾Õ¿¡ $Ç¥½Ã°¡ ºÙ¾î Àִµ¥, À̰ÍÀº immediate-mode instruction¸¦ ÀǹÌÇÏ´Â °ÍÀ̹ǷΠ0À» ebx¿¡ Áý¾î ³Ö°Ô µÈ´Ù. ¸¸¾à $Ç¥½Ã¸¦ Á¦°ÅÇÏ°Ô µÇ¸é direct addressing mode°¡ µÇ¾î¼­ 0¹øÁÖ¼ÒÀÇ °ªÀÌ %ebx¿¡ ¹Ð¾î³Ö¾îÁö°Ô µÈ´Ù. ¸Þ¸ð¸®ÀÇ ¾îµå·¹½Ì ¸ðµå¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº 2ÀåÀ» Âü°íÇϱ⠹ٶõ´Ù.

9.3. ¸®´ª½º ÇÁ·Î±×·¥¿¡¼­ÀÇ ¸Þ¸ð¸® ±¸Á¶

À̹ø ÀåÀÇ ³»¿ëÀº 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) ½ºÅÃÆ÷ÀÎÅͰ¡ Áõ°¡ÇÏ´Â ¹æ½ÄÀÌ´Ù.

pushl %eax
            
À§ÀÇ ÄÚµå´Â ¾Æ·¡¿Í µ¿ÀÏÇÏ´Ù.
movl %eax, (%esp)
subl $4, %esp
            
%eax´Â 4¹ÙÀÌÆ®ÀÇ Å©±â¸¦ °¡Áø´Ù. À̰ÍÀ» ½ºÅÿ¡ ¹Ð¾î ³Ö¾úÀ¸´Ï, ´ÙÀ½°ªÀ» ³ÖÀ» ¶§¿¡´Â 4¹ÙÀÌÆ® ¸¸Å­ µÚ·Î ¹Ð·Á¼­ °ªÀ» ³Ö¾î¾ß ÇÒ °ÍÀÌ´Ù. À̸¦ À§Çؼ­ sublÀ» ÀÌ¿ëÇØ¼­ %esp¿¡¼­ 4¸¸Å­À» »©ÁÖ¾ú´Ù.
popl %eax
            
À§ÀÇ ÄÚµå´Â popÀ» ÇѰæ¿ìÀε¥, ¾Æ·¡¿Í µ¿ÀÏÇÏ´Ù.
movl (%esp), %eax
addl $4, %esp
            
%esp¿¡ °ýÈ£°¡ ÀÖ´Â ÀÌÀ¯´Â %espÀÇ ÁÖ¼Ò°ªÀÌ ¾Æ´Ñ %esp°¡ °¡¸®Å°´Â °÷ÀÇ °ªÀ» °¡Á®¿À±æ ¿øÇϱ⠶§¹®ÀÌ´Ù. 4¹ÙÀÌÆ® Å©±âÀÇ °ªÀ» ²¨³»¿Ô±â ¶§¹®¿¡, %esp¿¡¼­ 4¸¸Å­À» ´õÇØÁ༭ ½ºÅÃÀÇ ´ÙÀ½ °ªÀ» °¡¸®Å°µµ·Ï ÇØÁÖ¾ú´Ù.

ÀÌ·¸°Ô ÇØ¼­ stack´Â °ªÀ» °¨¼Ò½Ã۰í, .bss¼½¼ÇÀº °ªÀ» Áõ°¡½ÃŲ´Ù´Â °ÍÀ» ¾Ë°Ô µÇ¾ú´Ù. À̵é Áß°£¿µ¿ªÀº break ¶ó°í ºÒ¸®¿ì¸ç, Ä¿³ÎÀº breakÀ» ¹þ¾î³ª¼­ ¼­·ÎÀÇ ¿µ¿ªÀ» ħ¹üÇÏÁö ¾Êµµ·Ï °ü¸®¸¦ Çϰí ÀÖ´Ù. ¸¸¾à ¼­·ÎÀÇ ¿µ¿ªÀ» ħ¹üÇÏ°Ô µÇ¸é ÇÁ·Î±×·¥Àº "segmentation falut" ¿¡·¯ ¸Þ½ÃÁö¸¦ Ãâ·ÂÇϰí Á¾·áµÈ´Ù. ¸¶Âù°¡Áö·Î ´ç½ÅÀÇ ÇÁ·Î±×·¥ÀÌ 0x08048000ÀÌÀüÀÇ µ¥ÀÌÅÍ¿µ¿ª¿¡ Á¢±ÙÇÒ°æ¿ì¿¡µµ µ¿ÀÏÇÑ ¿¡·¯¸Þ½ÃÁö¿Í ÇÔ²² Á¾·á°¡ µÈ´Ù.

9.4. Every Memory Address is Lie

±×·³ ¿Ö ÄÄÇ»ÅÍ´Â 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ÀÇ Å©±â¸¦ °¡Áø´Ù. ¸ðµç ¸Þ¸ð¸®´Â ÆäÀÌÁö´ÜÀ§·Î ¸ÅÇÎÀÌ µÈ´Ù.

9.5. Getting More Memory

¿ì¸®´Â ¸®´ª½ºÀÇ °¡»ó¸Þ¸ð¸®°¡ ¸®¾ó¸Þ¸ð¸®¿Í 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¸¦ È£ÃâÇØ¼­ À̸¦ ¹ÝȯÇÏ°Ô µÈ´Ù.

9.6. ¸Þ¸ð¸® °ü¸®

±×·³ ¾î¶²½ÄÀ¸·Î ¸Þ¸ð¸®¸¦ °ü¸®ÇÏ´ÂÁö¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.

# 
.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Çü½ÄÀ¸·Î ¸¸µéµµ·Ï ÇÑ´Ù.
# as alloc.s -o alloc.o
ÀÌÁ¦ Äڵ带 ºÐ¼®ÇØ º¸µµ·Ï ÇÏÀÚ.

9.7. º¯¼ö¿Í »ó¼öµé

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¸¦ º¯°æ½ÃÄÑ Áֱ⸸ ÇÏ¸é µÈ´Ù. ÀÌ·¯ÇÑ ±¸Á¶Ã¼´Â Àü¿ªº¯¼öµé°ú ¸¶Âù°¡Áö·Î ÄÚµåÀÇ °¡Àå ù ºÎºÐ¿¡ À§Ä¡ÇÏ°Ô µÈ´Ù.

9.8. allocate_init ÇÔ¼ö

ÀÌ ÇÔ¼ö´Â °£´ÜÇÏ´Ù. 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À» ÇÊ¿äÇÑ ¸¸Å­ È®Àå½Ã۱⸸ ÇÏ¸é µÈ´Ù.

9.9. allocate ÇÔ¼ö

ÀÌ ÇÔ¼ö´Â ´ÙÀ½°ú °°Àº ÀϵéÀ» ÇÏ°Ô µÈ´Ù.

  • 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)À» È£ÃâÇϰí, ¸®ÅϰªÀ» °Ë»çÇÑ´Ù.
cmpl  $0, %eax
je    error
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
            

9.10. deallocate ÇÔ¼ö

deallocate´Â allocate ÇÔ¼ö¿¡ ºñÇØ¼­ ¸Å¿ì ½±°Ô ¸¸µé ¼ö ÀÖ´Ù. ´ÜÁö ÇöÀç ¸Þ¸ð¸® ¿µ¿ªÀ» AVAILABLE·Î Ç¥½Ã¸¸ ÇÏ¸é µÇ±â ¶§¹®ÀÌ´Ù.

movl ST_MEMORY_SEG(%esp), %eax
subl $HEADER_SIZE, %eax
movl $AVAILABLE, HDR_AVAIL_OFFSET(%eax) 
ret
            
ÇÏ´Â ÀÏÀº °£´ÜÇÏ´Ù. ÇöÀç ½ºÅÃÀ¸·Î ºÎÅÍ ¸Þ¸ð¸®¿µ¿ªÀÇ ÁÖ¼Ò¸¦ ¾ò¾î¿Â´ÙÀ½, Çì´õºÎºÐÀ¸·Î À̵¿Çؼ­ AVAILABLEÇ¥½Ã¸¦ Çϱ⸸ ÇÏ¸é µÈ´Ù.

9.11. ¼º´É ¹× ´Ù¸¥ ¸î°¡Áö ¹®Á¦µé

¿©±â¿¡¼­ ¸¸µç ÄÚµå´Â ½ÇÁ¦ Ȱ¿ë¿¡´Â ¹®Á¦°¡ ÀÖ´Â ÃÖ¼ÒÇÑÀÇ ±â´É¸¸ ±¸ÇöÇÑ ÇнÀ¿ë ÄÚµåÀÏ »ÓÀÌ´Ù. Á»´õ ±×·²µíÇÏ°Ô ¸¸µé±â À§Çؼ­´Â 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¸¦ ºÐ¸®ÇØÁÖ¾î¾ß ÇÑ´Ù.

9.12. Allocator »ç¿ëÇϱâ

¿ì¸®°¡ ÀÛ¼ºÇÑ ¸Þ¸ð¸®°ü¸®ÀÚ´Â ½ÇÁ¦ »ç¿ëÇϱ⿡´Â ¹®Á¦°¡ ÀÖÁö¸¸, ÀÛµ¿ Å×½ºÆ® Á¤µµ´Â ÇØº¼ ¼ö ÀÖ´Ù. ±×·¡¼­ 6Àå¿¡¼­ ¿¹Á¦·Î ´Ù·ç¾ú´ø read-records.s ÇÁ·Î±×·¥¿¡ ¿©±â¿¡¼­ ¸¸µç ¸Þ¸ð¸®°ü¸®ÀÚ¸¦ »ç¿ëÇØ º¸µµ·Ï ÇϰڴÙ.

read-records.s ÇÁ·Î±×·¥Àº ÆÄÀÏ·Î ºÎÅÍ ÀоîµéÀÎ, ³»¿ëÀ» ÀúÀåÇϱâ À§Çؼ­ .bss sectionÀ»?»ç¿ëÇϰí ÀÖ´Ù.

.bss
            
.bss sectionÀ» º¸¸é record_buffer¸¦ ÀÔÃâ·Â ¹öÆÛ·Î ÀÌ¿ëÇϰí Àִµ¥, °íÁ¤µÈ Å©±â·Î ÇÒ´çµÇ¾î ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. ÀÌ°É ¿ì¸®°¡ ¸¸µç ¸Þ¸ð¸® °ü¸®ÀÚ¸¦ ÀÌ¿ëÇØ¼­ µ¿ÀûÀ¸·Î ÇÒ´çÇϵµ·Ï Äڵ带 ¼öÁ¤ÇÑ ÈÄ Å×½ºÆ® ÇÏ¸é µÈ´Ù. ¿ì¸®°¡ ¼öÁ¤ÇÒ ºÎºÐÀÇ ¿øº» ÄÚµå´Â ´ÙÀ½°ú °°´Ù.
.section .bss
.lcomm, record_buffer, RECORD_SIZE
            
¿ì¼± °íÁ¤µÈ Å©±âÀÇ record_buffer´Â Çʿ䰡 ¾øÀ» °ÍÀÌ´Ù. µ¿ÀûÀ¸·Î ÇÒ´çµÈ ¹öÆÛÀÇ ½ÃÀÛÁÖ¼Ò¸¦ ÀúÀåÇÒ ¼ö ÀÖ´Â °ø°£¸¸ ÀÖÀ¸¸é µÈ´Ù. ½ÃÀÛÁÖ¼Ò¸¦ ÀúÀåÇϱâ À§ÇÑ °ø°£Àº 4byte¸é ÃæºÐÇÏ´Ù. ½ÃÀÛÁÖ¼Ò¸¦ ÀúÀåÇÒ °ø°£Àº .data ¿µ¿ª¿¡ ¼±¾ðÇÏ¸é µÈ´Ù.
record_buffer_ptr:
.long 0
                
´ÙÀ½À¸·Î ÇÁ·Î±×·¥ÀÌ ½ÃÀÛµÈ µÚ, ¸Þ¸ð¸® °ü¸®ÀÚ¸¦ ÃʱâÈ­ ½Ã۱â À§Çؼ­ allocate_init ¸¦ È£ÃâÇÏ´Â Äڵ带 Ãß°¡ÇÑ´Ù.
call 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
                
¼º°øÀûÀ¸·Î ½ÇÇàÆÄÀÏÀ» ¸¸µé¾ú´Ù¸é, ½ÇÇà½ÃÄѼ­ Å×½ºÆ®Çغ¸µµ·Ï ÇÏÀÚ.
# ./read-records
                

9.13. ´õ ¸¹Àº Á¤º¸µé

¸®´ª½º¿Í ´Ù¸¥ ¿î¿µÃ¼Á¦ ½Ã½ºÅÛ¿¡¼­ÀÇ ¸Þ¸ð¸® °ü¸®¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸µéÀº ¾Æ·¡ÀÇ ¸µÅ©µéÀ» Âü°íÇϱ⠹ٶõ´Ù.

9.14. º¹½À

  • ¸®´ª½º ÇÁ·Î±×·¥ÀÌ ½ÃÀÛµÉ ¶§ÀÇ ¸Þ¸ð¸® ±¸¼º¿¡ ´ëÇØ¼­ ¼³¸íÇ϶ó.

  • heap¶õ ¹«¾ùÀΰ¡.

  • current break¶õ ¹«¾ùÀΰ¡.

  • ¸ÊÇεÇÁö ¾ÊÀº ¸Þ¸ð¸®¿¡ Á¢±ÙÀ» ½ÃµµÇÒ °æ¿ì ¾î¶² ÀÏÀÌ ¹ß»ýÇϴ°¡.

  • ¿î¿µÃ¼Á¦´Â ¾î¶»°Ô °¢°¢ÀÇ ÇÁ·Î¼¼½º°¡ Àڽŵ鿡°Ô ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ ÃʰúÇØ¼­ »ç¿ëÇÏÁö ¸·´Â°¡.

  • ¸Þ¸ð¸®¸¦ ÀÌ¿ëÇÒ¶§, µð½ºÅ©»ó¿¡¼­ ¾î¶²ÀÏÀÌ ¹ß»ýÇÏ´ÂÁö¸¦ ¼³¸íÇ϶ó.

  • ¸Þ¸ð¸® ÇÒ´çÀÚ°¡ ÇÊ¿äÇÑ ÀÌÀ¯¿¡ ´ëÇØ¼­ ¼³¸íÇ϶ó.

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.