============================================================== Á¦¸ñ : C ¾ð¾î·Î Ä¿³ÎÀ» ÀÛ¼ºÇϱâ À§ÇÑ ¹æ¹ý ¿øÀúÀÚ : Tim Robinson (Mobius OS) ÀÛ¼ºÀÚ : edward ÀÛ¼ºÀÏÀÚ : 2003. 12. 05 ºÐ¼®¹×¹ø¿ª: edward_frswz ºÐ¼®¹öÁ¯ : ver 0.0.1 ¶óÀ̼¾½º : GPL ȨÆäÀÌÁö : http://OSx86.ORG ¿ø¹®ÂüÁ¶ : http://www.themoebius.org.uk/tutes/ckernel.html ============================================================== ======================================================= - Áغñ¹° - ¿ä±¸Áö½Ä - Å×½ºÆ® ȯ°æ Ʋ¸° ³»¿ëÀ̳ª ÀÌ»óÇÑ ³»¿ëÀº ¹Ù·Î ¸ÞÀÏ·Î ¾Ã¾îÁÖ¼¼¿ä. Á¦°¡ °ËÁõ ÈÄ ¹Ù·Î °íÃļ­ ¾÷µ¥ÀÌÆ® ÇϰڽÀ´Ï´Ù. email : osx86@osx86.org ======================================================= 0. C ¾ð¾î·Î Ä¿³Î ÀÛ¼ºÇϱ⠿øÀÛÀÚ : Timothy Robinson(Mobius OS) E-Mail : timothy.robinson@ic.ac.uk 1. ¼Ò°³ Áö±Ý±îÁö ¿©·¯ºÐµéÀÌ °¡Áø ¿î¿µÃ¼Á¦ °³¹ß¿¡ ´ëÇÑ °æÇèÀº ´ë°³°¡ ¾î¼Àºí¸® ¾ð¾î·Î ºÎÆ®·Î´õ¸¦ ÀÛ¼ºÇÑ Á¤µµÀÏ °ÍÀÔ´Ï´Ù. ¸¸¾à ¿©·¯ºÐµéÀÌ ¾î¼Àºí¸®¾ð¾î·Î ºÎÆ®·Î´õ¸¦ ÀÛ¼ºÇß´Ù¸é Àû¾îµµ ¸îÁÖ´Â °É·ÈÀ¸¸®¶ó º¾´Ï´Ù. µû¶ó¼­ ´õ ³ªÀº ¹æ¹ýÀ» »ý°¢ÇÏ°Ô ÇϰïÇÏÁÒ. ´ëºÎºÐÀÇ ºÎÆ®·Î´õ¸¦ ÀÛ¼ºÇÑ ¿©·¯ºÐµéÀ̶ó¸é ÀÌ¹Ì C ÇÁ·Î±×·¡¹Ö ¾ð¾î¸¦ ¾Ë°í ÀÖÀ¸¸®¶ó »ý°¢ÀÌ µÇ°í, C ¾ð¾î°¡ ±×¿¡ ´ëÇÑ ÃæºÐÇÑ ´ë¾ÈÀÌ µÉ ¼ö ÀÖ°ÚÁÒ. C ¾ð¾î Á¶Â÷ Àß ¸ð¸£´Â ºÐµéÀ̶ó ÇÏ´õ¶óµµ ÀÌ¹Ì ¸î°¡Áö ´Ù¸¥ ÇÏÀÌ·¹º§ ¾ð¾î¸¦ ÀÍÇûÀ¸¸®¶ó »ý°¢µÇ¸ç ÀÌ´Â C ¾ð¾î¸¦ ÀÍÈ÷´Âµ¥ µµ¿òÀÌ µÇ¸®¶ó º¾´Ï´Ù. C ¾ð¾î·Î ¿©·¯ºÐÀÇ Ä¿³ÎÀ» ÄÚµùÇϱ⠽ÃÀÛÇϱâ À§ÇÑ ±â¹ÝÀÌ¹Ç·Î ÃæºÐÈ÷ ÀÍÇôµÎ½Ã¸é ÁÁ°Ú½À´Ï´Ù. 2. C ÇÁ·Î±×·¡¹Ö ¾ð¾î C ¾ð¾î´Â ±Ùº»ÀûÀ¸·Î ·Î¿ì·¹º§¿¡ °¡±î¿î ÇÏÀÌ·¹º§ ¾ð¾î·Î µðÀÚÀÎ µÇ¾ú½À´Ï´Ù. (À¯´Ð½º Ä¿³ÎÀº C ¾ð¾î·Î ÀÛ¼ºµÇ¾î ¿À°í ÀÕ½À´Ï´Ù.) ±×¸®°í C ¾ð¾î¸¦ »ç¿ëÇÒ ¶§ÀÇ °¡Àå Å« ÀÌÁ¡Àº ¶Ù¾î³­ À̽ļº°ú ¸Ó½Å¿¡ ´ëÇÑ ¿ëÀÌÇÑ Á¢±Ù¿¡ ÀÖ½À´Ï´Ù. ¹°·Ð C ¾ð¾î·Î ÀÛ¼ºµÈ ÇÁ·Î±×·¥ÀÌ À̽ļºÀÌ ¶³¾îÁú¼öµµ ÀÖÁö¸¸ C ¾ð¾î¿¡ ´ëÇÑ ¾à°£ÀÇ Áö½Ä¸¸ ÀÖ´Ù¸é À̽ļº ÀÖ´Â Äڵ带 ÀÛ¼ºÇÏ´Â °ÍÀÌ ÃæºÐÈ÷ °¡´ÉÇÕ´Ï´Ù. ±×·¸´Ù¸é ±×·±Á¡¿¡¼­ C ¾ð¾î·Î ÄÄÆÄÀÏµÈ ÄÚµå´Â ¾î¼Àºí¸®·Î ÀÛ¼ºÇÏ´Â °Í°ú ´Ù¸¥ ¾î¶² Ưº°ÇÑ Á¡ÀÌ ÀÖÀ»±î¿ä ? »ç½Ç»ó, ¿©·¯ºÐÀÇ ¾î¼Àºí¸® ¾ð¾î´Â ¸Ó½Å¿¡ ´ëÇÑ Opcode µé°ú 1:1·Î º¯È¯ÇØÁÖ´Â ¿ªÇÒÀ» ÇÏ´Â ´ÜÁö ·Î¿ì·¹º§ ÄÄÆÄÀÏ·¯¿¡ Áö³ªÁö ¾ÊÁö¸¸ ¿©Å¸ ´Ù¸¥ ÇÏÀÌ·¹º§ ¾ð¾îó·³ C ¾ð¾î´Â Ãß»óÀûÀÌ¸ç ¸Ó½Å¿¡ ´ëÇØ ·Î¿ì·¹º§ ¾ð¾îó·³ ¸¹ÀÌ »ý°¢ÇÒ Çʿ䰡 ¾øÀÌ Äڵ带 ¸¸µé ¼ö ÀÖ½À´Ï´Ù. ±×¸®°í ¹«¾ùº¸´Ùµµ C ¾ð¾î´Â ¿©·¯ºÐÀÌ ÀÛ¼ºÇÒ Äڵ忡 ´ëÇØ ±×¸® ¸¹Àº Á¦¾àÀ» °¡ÇÏ´Â ÆíÀº ¾Æ´Ï¶ø´Ï´Ù. 3. Åøµé(Tools) C ¾ð¾î·Î ÀÛ¼ºµÈ ¼Ò½º Äڵ带 ¸Ó½ÅÀÌ ½ÇÇà°¡´ÉÇÑ ÄÚµå·Î ¸¸µé±â À§Çؼ­´Â µÎ°¡ÁöÀÇ Áß¿äÇÑ ¼ÒÇÁÆ®¿þ¾î°¡ ÇÊ¿äÇÕ´Ï´Ù : ====================================== ±×°ÍÀÌ ¹Ù·Î - ÄÄÆÄÀÏ·¯(Compiler) ¿Í - ¸µÄ¿(Linker) ÀÔ´Ï´Ù. ====================================== ÄÄÆÄÀÏ·¯(Compiler)´Â C ¼Ò½º Äڵ带 ¿ÀºêÁ§Æ® ÆÄÀÏ(Object file)·Î Æ©´×À» ÇÏ´Â ÀÏ¿¡ °üÇÑ ´ëºÎºÐÀÇ ÀÏÀ» ó¸®ÇÕ´Ï´Ù. ¿ÀºêÁ§Æ® ÆÄÀÏÀº ¸Ó½Å ÄÚµå¿Í µ¥ÀÌÅ͸¦ °®Áö¸¸ ±× ÀÚü·Î´Â ¿ÏÀüÇÑ ÇÁ·Î±×·¥ÀÇ ÇüŰ¡ µÇÁö´Â ¸øÇÑ´ä´Ï´Ù. ¸¹Àº C ÄÄÆÄÀÏ·¯µéÀº ¼Ò½º ÄÚµå·Î ºÎÅÍ ½ÇÇà°¡´ÉÇÑ È­ÀÏ(executable file)À» ¹Ù·Î »ý¼ºÇÏ´Â ¿É¼ÇÀ» °¡Áö°í ÀÖÁö¸¸ ¾Æ¸¶µµ ±×·¯ÇÑ ¿É¼ÇÀ» »ç¿ëÇÒ °æ¿ì ÄÄÆÄÀÏ·¯´Â ³»ºÎÀûÀ¸·Î ¸µÄ¿(linker)¸¦ È£ÃâÇÏ°Ô µÉ °Í ÀÔ´Ï´Ù. ¸µÄ¿(Linker)´Â ÇÊ¿äÇÑ ¸ðµç ¿ÀºêÁ§Æ® ÆÄÀÏ(Object File)µéÀ» ¼­·Î ¹­¾îÁÖ´Â ¿ªÇÒÀ» Çϰí, ¿ÀºêÁ§Æ® ÆÄÀϵ鿡 Á¸ÀçÇÏ´Â ÂüÁ¶µéÀ» ¼­·Î ¸ÂÃß°í ±×°ÍµéÀ» À̵¿½Ã۱⵵ Çϴµ¥ ÀÌ·¯ÇÑ ÀÛ¾÷À» Àç¹èÄ¡(relocation)¶ó°í ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ Àç¹èÄ¡ ÀÛ¾÷À» ¸¶Ä¡°í ½ÇÇà°¡´ÉÇÑ ÆÄÀÏÀ» »ý¼ºÇسÀ´Ï´Ù. ´ëºÎºÐÀÇ ¸µÄ¿´Â ÄÄÆÄÀÏ·¯·Î ºÎÅÍ È£È¯°¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀÏ »ý¼ºµÇ´ÂÇÑ ¾î¶² ÄÄÆÄÀÏ·¯·Î ¸¸µé¾îÁø ¿ÀºêÁ§Æ® ÆÄÀϰúµµ µ¿ÀÛÀÌ °¡´ÉÇÕ´Ï´Ù. ÀÌ´Â ¿©·¯ºÐµéÀÌ ¸Ó½Å¿¡ Á¾¼ÓÀûÀÎ ºÎºÐÀ» ¾î¼Àºí¸®·Î ÀÛ¼ºÇÑ µÚ ±× ¿Ü Ä¿³ÎÀÇ ´ëºÎºÐÀº C ¾ð¾î·Î ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù´Â À̾߱âÀÔ´Ï´Ù. Àú´Â GNU gcc ÄÄÆÄÀÏ·¯¿Í ld ¸µÄ¿¸¦ Æ÷ÇÔÇÏ´Â ÆÐŰÁö¸¦ ÃßõÇÕ´Ï´Ù. ¿Ö³ÄÇÏ¸é ¾Æ·¡¿Í °°Àº ÀÌÀ¯ ¶§¹®ÀÔ´Ï´Ù : ================================================================= * ÀÌ ¼ÒÇÁÆ®¿þ¾îµéÀº Free Çϸç Open-Source ÀÔ´Ï´Ù. * ld ´Â ¸¹Àº ½ÇÇà°¡´ÉÇÑ Æ÷¸ËÀ» Áö¿øÇÕ´Ï´Ù. * gcc´Â ¹öÁ¯¿¡ µû¶ó ¸¹Àº ÇÁ·Î¼¼¼­¿¡¼­ À̿밡´ÉÇÕ´Ï´Ù. ================================================================= GNU ÆÐŰÁöµéÀº ´Ù¾çÇÑ ¿î¿µÃ¼Á¦¿¡¼­ ÀÌ¿ëÀÌ °¡´ÉÇÕ´Ï´Ù. MS-DOS ·Î Æ÷Æ®(port)µÈ ¹öÁ¯Àº "DJGPP", Windows ·Î Æ÷Æ®(port)µÈ °ÍÁß¿¡´Â Cygwin °ú °°Àº °ÍµéÀÌ ÀÖÁÒ. (% edward : ¾Æ·¡ ¸µÅ©¸¦ ÂüÁ¶Çϼ¼¿ä. ======================================= DJGPP : http://www.delorie.com/djgpp/ CygWin : http://www.cygwin.com/ ======================================= ) ¸ðµç ¸®´ª½º ¹èÆ÷ÆÇÀº GNU ÅøÀ» Æ÷ÇÔÇϰí ÀÖ½À´Ï´Ù. °¢°¢ÀÇ ½Ã½ºÅÛÀ¸·Î Æ÷ÆÃµÈ GNU ÅøµéÀº ÄÄÆÄÀÏ·¯¿Í ¸µÄ¿¸¦ Àç ÄÄÆÄÀÏ ÇÏÁö ¾Ê´Â´Ù¸é »ç¿ëÁßÀÎ Ç÷§Æû¿¡ ¸Â´Â Äڵ带 »ý¼ºÇÕ´Ï´Ù. ±×¸®°í ·±Å¸ÀÓ ¶óÀ̺귯¸®´Â OS °³¹ßÀÚ¿¡ ÀÇÇØ »ç¿ëµÇ°ï Çϴµ¥ CygWin ÇÁ·Î±×·¥¿¡¼­´Â Win32 API ¸¦ »ç¿ëÇϱâÀ§ÇØ cygwin1.dll ¿¡ ÀÇÁ¸ÇÏ°Ô µË´Ï´Ù. ÇÏÁö¸¸ ±âº»ÀûÀÎ ·±Å¸ÀÓ ¶óÀ̺귯¸®(RTL)¸¦ ¹«½ÃÇϰí, ´ç½Å ÀÚ½ÅÀÇ °ÍÀ» ÀÛ¼ºÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ¸¸¾à ¿©·¯ºÐµéÀÌ Windows ¿¡¼­ Äڵ带 ÀÛ¼ºÇÑ´Ù¸é Àú´Â Cygwin(ELF ¸¦ Áö¿øÇÒ ¼ö ÀÖ°Ô patch/rebuild µÈ ¹öÁ¯)À» ÃßõÇÕ´Ï´Ù. ¿Ö³ÄÇϸé Cygwin ÀÇ Flat Binary Ãâ·ÂÀº ºÎºÐÀûÀÎ ¿À·ù¸¦ °®°í ÀÖ½À´Ï´Ù¸¸ Cygwin ÀÌ DJGPP º¸´Ù ¾à°£ ´õ ºü¸£°í ±ä ÆÄÀϸí°ú ¸í·É¶óÀÎÀ» Áö¿øÇϱ⠶§¹®ÀÔ´Ï´Ù. ´Ù¾çÇÑ ´Ù¸¥ Åøµéµµ OS °³¹ß¿¡¼­ À¯¿ëÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. GNU ÀÇ binutils ÆÐŰÁö(gcc¿Í ld ¿Í ÇÔ²² »ç¿ëÇϱâ À§ÇÑ º¸Á¶ ÇÁ·Î±×·¥)´Â objdump ¶ó´Â ÇÁ·Î±×·¥À» Æ÷ÇÔÇϴµ¥, objdump ´Â ¿©·¯ºÐµéÀÇ ½ÇÇà°¡´ÉÇÑ ÆÄÀÏÀÇ ³»ºÎ±¸Á¶¸¦ °Ë»çÇÒ ¼ö ÀÖµµ·Ï µµ¿ÍÁÝ´Ï´Ù. ´õ Áß¿äÇÑ°Ç ¿©·¯ºÐµéÀÌ ·Î´õ¸¦ ÀÛ¼ºÇÒ¶§ ¾î¼Àºí¸® ÄÚµåÀÇ tricky bit¸¦ ½ÃµµÇÏ°Ô µÉ °ÍÀÔ´Ï´Ù. ÀϹÝÀûÀÎ ¸µÄ¿¸¦ »ç¿ëÇÒ¶§ÀÇ ÇÑ °¡Áö ´ÜÁ¡Àº ¿©·¯ºÐ ½º½º·Î°¡ °³¹ßÇÑ ½ÇÇà°¡´ÉÇÑ Æ÷¸ËÀ» ¸µÄ¿µéÀÌ Áö¿øÇÏÁö ¸øÇÑ´Ù´Â Á¡ÀÔ´Ï´Ù. ÇÏÁö¸¸ ´ë°³´Â ¿©·¯ºÐ ÀÚ½ÅÀÇ ½ÇÇà°¡´ÉÇÑ Æ÷¸ËÀ» °³¹ßÇÑ Çʿ䰡 º°·Î ¾ø½À´Ï´Ù. ¿Ö³ÄÇϸé ÀÌ¹Ì ¸¹Àº Á¾·ùÀÇ ½ÇÇà°¡´ÉÇÑ Æ÷¸ËÀÌ Àֱ⠶§¹®ÀÌÁÒ. UNIX °è¿­ÀÇ ELF ¿Í Windows °è¿­ÀÇ PE Æ÷¸ËÀº OS °³¹ßÀÚµéÀÌ °¡Àå ¸¹ÀÌ »ç¿ëÇÏ´Â Æ÷¸ËÀÔ´Ï´Ù. ¿Ö³ÄÇÏ¸é ´ëºÎºÐÀÇ ÇöÁ¸ÇÏ´Â ¸µÄ¿µéÀÌ ±× µÎ Æ÷¸ËÀ» ¸Å¿ì Àß Áö¿øÇϱ⠶§¹®ÀÌÁÒ. ELF Æ÷¸ËÀº ¾Æ¸¶Ãò¾î Ä¿³Î¿¡¼­ ÀÚÁÖ »ç¿ëµÇ´Â µ¥, ±× ÀÌÀ¯´Â PE Æ÷¸ËÀÌ ´õ ÁÁÁö¸¸ ELF Æ÷¸ËÀÌ ´Ü¼øÇÏ´Ù´Â ÀÌÀ¯·Î »ç¿ëÇÏ´Â °ÍÀÔ´Ï´Ù. (»ç½Ç PE°¡ ´õ Á»´õ º¹ÀâÇÕ´Ï´Ù.) ±×¸®°í µÑ´Ù ¹®¼­È­´Â Àß µÇ¾î ÀÖ½À´Ï´Ù. COFF Æ÷¸ËÀÌ µ¿Àû ¸µÅ·(dynamic linking)°ú °°Àº ±âº»ÀûÀÎ ±â´É¿¡ ´ëÇÑ Áö¿øÀÌ ºÎÁ·Çϱä ÇÏÁö¸¸ ¸î¸î Ä¿³Î ÇÁ·ÎÁ§Æ®¿¡¼­¸¸ »ç¿ëµÇ°í ÀÖ½À´Ï´Ù. ´Ü¼øÇÑ Ä¿³Î¿¡ ´ëÇØ¼­´Â ¾Æ¹«·± Æ÷¸Ëµµ Á¤ÇÏÁö ¾Ê´Â ¼ø¼öÇÑ ¹ÙÀ̳ʸ® Æ÷¸Ë (Flat Binary Format)À» ¼±ÅÃÇϱ⵵ ÇÕ´Ï´Ù. À̶§ ¸µÄ¿´Â Ãâ·ÂÆÄÀÏ·Î raw code ¿Í raw data ¸¦ ¸¸µé°Ô µÇ°í, ±× °á°ú´Â 64KBÀÇ Çì´õ°¡ ´õ ºÙ¾î ÀÖ´Â MS-DOS ÀÇ .COM Æ÷¸Ë°ú ºñ½ÁÇÏ¸ç ·Î´õ°¡ º¸È£¸ðµå¸¦ Áö¿øÇÑ´Ù´Â °¡Á¤ÇÏ¿¡¼­ 32-bit opcode ¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ¸ðµç IA-32 ±â¹ÝÀÇ ¸ÞÀνºÆ®¸²¿¡ ´ëÇÑ ÄÄÆÄÀÏ·¯ÀÇ ´ÜÁ¡Àº 32-bit flat address °ø°£ÀÌ¶ó °¡Á¤Çϰí CS,DS,ES,SS °¢°¢ÀÌ °°Àº º£À̽º ¾îµå·¹½º¸¦ °®°Ô µÈ´Ù´Â °ÍÀÔ´Ï´Ù. ÀÌÁ¡ÀÌ ¿Ö ¹®Á¦ Àΰ¡Çϸé ÀÌ·±°æ¿ì¿¡ far Æ÷ÀÎÅÍ(48bit seg16:offset32) ¸¦ »ç¿ëÇÒ ¼ö ¾øÀ¸¸ç ... far Æ÷ÀÎÅ͸¦ »ç¿ëÇÒ ¼ö ¾ø°Ô µÇ¸é segmented OS Äڵ带 ÀÛ¼ºÇϱⰡ ¸Å¿ì Èûµé°Ô µÇ±â ¶§¹®ÀÔ´Ï´Ù. C·Î ÀÛ¼ºµÈ Segmented OS ±â¹Ý¿¡¼­ÀÇ ÇÁ·Î±×·¥Àº »ó´çÇÑ ºÎºÐÀ» ¾î¼Àºí¸® Äڵ忡 ÀÇÁ¸ÇÏ°Ô µÇ°í, Flat OS ±â¹Ý¿¡¼­ ÀÛ¼ºµÈ ÇÁ·Î±×·¥ º¸´Ù ´ú È¿À²ÀûÀÔ´Ï´Ù. ±×¸®°í ÀÌ ±ÛÀ» ÀÛ¼ºÇÏ´Â ½ÃÁ¡¿¡ Watcom Àº 32ºñÆ® º¸È£¸ðµåÇÏ¿¡¼­ far Æ÷ÀÎÅ͸¦ Áö¿øÇÒ °ÍÀ¸·Î ÃßÃøµÇ´Â OpenWatcom ÄÄÆÄÀÏ·¯¸¦ ¸±¸®Áî ÇÒ °Í °°½À´Ï´Ù. (% edward : Çö ½ÃÁ¡¿¡¼± ¸±¸®ÁîµÇ¾î ÀÖ´Â °Í °°±º¿ä.) gcc ¿Í ld °¡ ±â´É»óÀ¸·Î ¾î¶°ÇÑ ÄÄÆÄÀÏ·¯³ª ¸µÄ¿ÀÇ ±â´Éµµ Áö¿øÇÒ ¼ö ÀÖÁö¸¸ ÀÌ µÑÀ» »ç¿ëÇÏ°Ô µÉ¶§ À¯ÀÇÇØ¾ß ÇÒ Á¡ÀÌ µÎ°¡Áö ÀÖ½À´Ï´Ù. ù°´Â gcc ´Â ÇÔ¼ö ÄÚµå ¹Ù·Î¾Õ¿¡ ¸®ÅÍ·² ½ºÆ®¸µ(literal string)À» »ðÀÔÇÕ´Ï´Ù. ±×·¸´Ù°í À̰ÍÀÌ ¹®Á¦°¡ µÇ´Â°ÍÀº ¾Æ´ÏÁö¸¸ Á÷Á¢ÀûÀ¸·Î "Hello, world"¸¦ Ãâ·ÂÇϰíÀÚÇÏ´Â »ç¶÷µé¿¡°Õ ¹®Á¦°¡ µË´Ï´Ù. ´ÙÀ½ÀÇ ¿¹¸¦ º¾½Ã´Ù : ============================================================ int main(void) { char *str = "Hello, world", *ch; unsigned short *vidmem = (unsigned short*) 0xb8000; unsigned i; for (ch = str, i = 0; *ch; ch++, i++) vidmem[i] = (unsigned char) *ch | 0x0700; for (;;) ; } ============================================================ À§ÀÇ ÄÚµå´Â ºñµð¿À ¸Þ¸ð¸®¿¡ È­¸é ¿ÞÂÊ »ó´Ü¿¡ Èæ¹éÀ¸·Î "Hello, world" ¶ó´Â ¹®ÀÚ¿­À» Ãâ·ÂÇϰíÀÚ ÇÏ´Â °ÍÀÔ´Ï´Ù. ÇÏÁö¸¸ À§ÀÇ Äڵ尡 ÄÄÆÄÀÏ µÉ¶§, gcc ´Â "Hello, world" ¶ó´Â ¹®ÀÚ¿­À» main ÇÔ¼ö ÄÚµå ºÎºÐ ¹Ù·Î ¾Õ¿¡ »ðÀÔÇÏ°Ô µË´Ï´Ù. ¸¸¾à ÄÄÆÄÀÏµÈ ÆÄÀÏÀÌ ¼ø¼öÇÑ ¹ÙÀ̳ʸ® Æ÷¸Ë(Flat Binary Format)À¸·Î ¸µÅ©µÇ¾î ½ÇÇàµÈ´Ù¸é ÀÌ ¹®ÀÚ¿­·Î ºÎÅÍ ½ÇÇàÀÌ ½ÃÀ۵ǰí, ¸Ó½ÅÀº ÀÌ Äڵ带 ÀÌÇØÇÒ ¼ö ¾øÀ¸¹Ç·Î ¸Ó½ÅÀº ´õ ÀÌ»ó µ¿ÀÛÇÏÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù. À§ÀÇ ¹®Á¦¿¡ ´ëÇØ¼­´Â µÎ°¡Áö ´ë¾ÈÀÌ ÀÖ½À´Ï´Ù : ============================================================ * Çϳª´Â main() ÇÔ¼ö¸¦ È£ÃâÇϰí, ¸ØÃß°Ô µÇ´Â ÇϳªÀÇ ÀÛÀº ÇÔ¼ö¸¦ ÀÛ¼ºÇÏ´Â °ÍÀÔ´Ï´Ù. ÀÌ ¹æ¹ýÀº ÇÁ·Î±×·¥³»ÀÇ Ã¹¹øÂ° ÇÔ¼ö°¡ ¾î¶°ÇÑ ¸®ÅÍ·² ½ºÆ®¸µµµ Æ÷ÇÔÇÏÁö ¾Ê°Ô ÇÏ´Â °ÍÀÌÁÒ. * ´Ù¸¥ ÇϳªÀÇ ¹æ¹ýÀº gcc ¿É¼ÇÀÎ -fwritable-strings ¸¦ »ç¿ëÇØ¼­ ÄÄÆÄÀÏ ÇÏ´Â °ÍÀÔ´Ï´Ù. ±×·¸°Ô Çϸé, gcc ´Â ¸®ÅÍ·² ½ºÆ®¸µÀ» ½ÇÇà°¡´ÉÇÑ µ¥ÀÌÅÍ ¼½¼Ç(data section)¿¡ ³Ö°Ô µÇ°í, ÄÚµå ¼½¼Ç(code section)°ú´Â ¶³¾îÁö°Ô µË´Ï´Ù. ============================================================ ¿©±â¼­´Â ù¹øÂ° ¹æ¹ýÀÌ Á¶±Ý ´õ ¼±È£µË´Ï´Ù. Àú´Â ¾î¼Àºí¸® ¾ð¾î·Î ¿£Æ®¸® Æ÷ÀÎÆ® ÇÔ¼ö¸¦ ÀÛ¼ºÇÏ´Â ¹æ¹ýÀ» ÁÁ¾ÆÇϴµ¥ ÀÌ ¿£Æ®¸® Æ÷ÀÎÆ®¸¦ Àâ¾ÆÁÖ´Â ÇÔ¼ö´Â main ÇÔ¼ö¸¦ È£ÃâÇϱâ Àü¿¡ stack°ú bss ¼½¼ÇÀ» 0 À¸·Î ¸¸µì´Ï´Ù. ¿©·¯ºÐµéÀº Æò¹üÇÑ À¯Àú¸ðµå ÇÁ·Î±×·¥¿¡¼­µµ ÀÌ·±°ÍÀ» ¹ß°ßÇÒ ¼ö Àִµ¥ ½ÇÁ¦ ¿£Æ®¸® Æ÷ÀÎÆ®(entry point)´Â main() ÇÔ¼ö¸¦ È£ÃâÇϱâ Àü¿¡ ±× ÇÁ·Î±×·¥À» µ¿ÀÛ½Ã۱â À§ÇØ È¯°æ ¼³Á¤À» ÇØÁÖ´Â C ¶óÀ̺귯¸®ÀÇ Á¶±×¸¶ÇÑ ·çƾÀÔ´Ï´Ù. ÀÌ ·çƾÀº º¸ÅëÀº crt0 ÇÔ¼ö¶ó°í ÀÔ´Ï´Ù. (% edward : ÀÏÀü¿¡µµ ¸»¾¸µå·ÈµíÀÌ ÀϹÝÀûÀÎ À¯Àú¸ðµå¿¡¼­ µ¿ÀÛÇÏ´Â C ÇÁ·Î±×·¥ÀÌ main() ·Î ºÎÅÍ ½ÃÀÛÇÏ´Â°Ç ¾Æ´Ï¶ø´Ï´Ù. º¸Åë ÇÁ·Î±×·¡¸Ó´Â main ÇÔ¼ö·ÎºÎÅÍ ½ÃÀÛÇÑ´Ù°í »ý°¢ÇÏÁö¸¸ ±× ¾Õ¿¡ ¸î °¡Áö°¡ ÀÖ´ä´Ï´Ù. À¯Àú ÇÁ·Î±×·¥ÀÇ ·ÎÁ÷°ú´Â º°·Î °ü°è°¡ ¾ø´Â ³»¿ëÀÌÁÒ. ±×·¡¼­ main ÇÔ¼ö·ÎºÎÅÍ ½ÃÀÛÇÑ´Ù°í ¸·¿¬È÷ ¾Ë°Ô µÇ´Â °Í °°½À´Ï´Ù.) ¶Ç ´Ù¸¥ ¹®Á¦Á¡Àº ¿ÀºêÁ§Æ® ÆÄÀÏ Æ÷¸Ë°ú °ü·ÃµÈ °ÍÀÔ´Ï´Ù. 32-bit COFF Æ÷¸Ë¿¡´Â µÎ°¡Áö º¯ÇüÀÌ ÀÖ½À´Ï´Ù. Çϳª´Â ¸¶ÀÌÅ©·Î ¼ÒÇÁÆ®ÀÇ Win32 ÅøÀ» »ç¿ëÇßÀ» ¶§ »ý¼ºµÇ´Â COFF Æ÷¸Ë°ú ³ª¸ÓÁö Çϳª´Â ¸¶ÀÌÅ©·Î ¼ÒÇÁÆ®ÀÇ Win32 ÅøÀ» »ç¿ëÇÏÁö ¾Ê°í ¿©Å¸ ´Ù¸¥ ÅøÀ» »ç¿ëÇßÀ» ¶§ »ý¼ºµÇ´Â COFF Æ÷¸ËÀÔ´Ï´Ù. ÀÌ·¸°Ô »ý¼ºµÈ COFF Æ÷¸Ë »çÀÌ¿¡´Â ¹Ì¹¦ÇÑ Â÷À̰¡ Àִµ¥, ´ÙÇེ·´°Ôµµ ¸µÄ¿µéÀº ÇϳªÀÇ Æ÷¸ËÀ» ´Ù¸¥ Æ÷¸ËÀ¸·Î ¸µÅ©ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ÇÏÁö¸¸ ÀÌ µÑÀÇ Â÷ÀÌ´Â ±Ùº»ÀûÀ¸·Î Àç¹èÄ¡(relocation)¿Í °ü·ÃµÇ¾î ÀÖ½À´Ï´Ù. : ¸¸¾à¿¡ ¿©·¯ºÐµéÀÌ NASM À¸·Î Äڵ带 ÀÛ¼ºÇϰí, ±×·¸°Ô ÀÛ¼ºµÈ Äڵ带 Visual C++ ·Î ÄÄÆÄÀÏµÈ ÀÛÀº ¸ðµâ°ú ÇÔ²² ¸¶ÀÌÅ©·Î ¼ÒÇÁÆ®ÀÇ ¸µÄ¿¸¦ »ç¿ëÇØ ¸µÅ©ÇÏ°Ô µÈ´Ù¸é ÃÖÁ¾ÀûÀ¸·Î ¸¸µé¾îÁø °á°ú¹°ÀÇ ÁÖ¼ÒÁ¤º¸µéÀº ¾û¸ÁÀÌ µÇ¾î¹ö¸± °ÍÀÔ´Ï´Ù. ±×·¡¼­ ½ÇÁ¦·Î ÀÛ¾÷ÇÒ¶§´Â À§¿Í °°ÀÌ ÅøµéÀ» ¼¯¾î ¾²Áö´Â ¾ÊÁö¸¸ ´ÙÇེ·´°Ôµµ ¸¶ÀÌÅ©·Î ¼ÒÇÁÆ®ÀÇ PE(portable executable) Æ÷¸ËÀ» Áö¿øÇÏ´Â ´ëºÎºÐÀÇ ÅøµéÀº Win32 Æ÷¸ËÀÇ ÆÄÀÏÀ»À» Ãâ·ÂÇÏ°Ô ²û ÇØÁÖ°í ÀÖ½À´Ï´Ù. : NASM °°Àº °æ¿ì -f win32 ¿Í °°Àº ¿É¼ÇÀ» Á¦°øÇϸç Cygwin Àº pei-i386 Ãâ·Â Æ÷¸ËÀ» Á¦°øÇÑ´ä´Ï´Ù. 4. ·±Å¸ÀÓ ¶óÀ̺귯¸® ¿©·¯ºÐÀÌ OS Äڵ带 ÀÛ¼ºÇÒ ¶§ °¡Àå Áß¿äÇÑ ºÎºÐÀº libc ¶ó ºÒ¸®´Â ·±Å¸ÀÓ ¶óÀ̺귯¸®¸¦ ÀçÀÛ¼ºÇÏ´Â °ÍÀÔ´Ï´Ù. ¿Ö³ÄÇÏ¸é ·±Å¸ÀÓ ¶óÀ̺귯¸®´Â ´ëºÎºÐ ¿î¿µÃ¼Á¦¿¡ ÀÇÁ¸ÀûÀÎ(OS-dependent) ÄÄÆÄÀÏ·¯ ÆÐŰÁöÀ̱⠶§¹®ÀÔ´Ï´Ù. : C ÀÇ ·±Å¸ÀÓ ¶óÀ̺귯¸®(RTL : Run-Time Library)´Â ¿ÜºÎÀûÀÎ ¸é¿¡¼­ À̽ļº ÀÖ´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¼ö ÀÖµµ·Ï ÃæºÐÇÑ ±â´ÉÀ» Á¦°øÇÏÁö¸¸, ³»ºÎÀûÀÎ ÀÛ¾÷Àº OS ¿¡ ÀÇÁ¸ÀûÀÎ ¸éÀÌ ÀÖ½À´Ï´Ù. »ç½Ç, ÄÄÆÄÀÏ·¯ ȸ»ç(vendor)µéÀº °°Àº ¿î¿µÃ¼Á¦ »ó¿¡¼­µµ ¼­·Î ´Ù¸¥ ·±Å¸ÀÓ ¶óÀ̺귯¸®¸¦ »ç¿ëÇϰï ÇÕ´Ï´Ù. : Microsoft Visual C++ Àº µð¹ö±×/¸ÖƼ-¾²·¹µå/DLL ¿¡ ´ëÇØ ¼­·Î ´Ù¸¥ ¶óÀ̺귯¸®¸¦ Á¦°øÇϰí, ¿À·¡µÈ MS-DOS ÄÄÆÄÀÏ·¯´Â 6°¡ÁöÀÇ ´Ù¸¥ ¸Þ¸ð¸® ¸ðµ¨¿¡ ´ëÇÑ ·±Å¸ÀÓ ¶óÀ̺귯¸®¸¦ Á¦°øÇÕ´Ï´Ù. ¿©·¯ºÐµéÀº "ISO C Ç¥ÁØ" ¿¡ µû¶ó ¶óÀ̺귯¸®¸¦ ÀÛ¼ºÇϴµ¥ ÃÊÁ¡À» ¸ÂÃß¾î¾ß Çϴµ¥, ±× ÀÌÀ¯´Â ±×·¸°Ô ¶óÀ̺귯¸®¸¦ ÀÛ¼ºÇÏ´Â °ÍÀÌ ¿©·¯ºÐµéÀÇ OS ·Î ÇÁ·Î±×·¥µéÀ» Æ÷ÆÃÇÏ´Â ÀÛ¾÷À» ¼ö¿ùÇÏ°Ô ¸¸µé±â ¶§¹®ÀÔ´Ï´Ù. ¸¸¾à ¿©·¯ºÐµéÀÌ (ISO C Ç¥ÁؾÈÀ» µû¸£Áö ¾Ê´Â) ºñÇ¥ÁØ ¶óÀ̺귯¸® ¸¦ ÀÛ¼ºÇÏ°Ô µÈ´Ù¸é ¿©·¯ºÐµéÀÌ Æ÷ÆÃÇϰíÀÚ ÇÏ´Â ¾î¶² ¾îÇø®ÄÉÀ̼ÇÀ̵çÁö ´Ù½Ã ÀÛ¼ºÇØ¾ß µÉ °ÍÀÔ´Ï´Ù. : Ç¥ÁØÀûÀÎ ¶óÀ̺귯¸® ÇÔ¼ö¸¦ Á¤ÀÇÇÑ´Ù¸é ¿ÀǼҽº ¾îÇø®ÄÉÀ̼ÇÀ» ¹Ù·Î Æ÷ÆÃÇϱⰡ ´õ ¼ö¿ùÇØ Áú °ÍÀÔ´Ï´Ù. (% edward : Ç¥ÁØÀ̶õ°ÍÀº ³ª¸§´ë·Î Ÿ´çÇÑ ÀÌÀ¯°¡ À־ ¸¸µé¾îÁø °ÍÀÔ´Ï´Ù. º°´Ù¸¥ ÀÌÀ¯°¡ ¾ø´Ù¸é µû¶ó Áִ°ÍÀÌ ÁÁ°ÚÁö¿ä.) ¶óÀ̺귯¸®ÀÇ È¯°æÀÌ ¿©·¯ºÐµéÀÌ °³¹ßÇϰíÀÚ Çϴ ȯ°æ°ú ºñ½ÁÇÏ´Ù¸é ÀÌ¹Ì Á¸ÀçÇÏ´Â ÀÓÇø®¸àÅ×À̼ǿ¡ ´ëÇÑ ¼Ò½ºÄڵ带 ±× ´ë·Î »ç¿ëÇÒ ¼ö ÀÖ°Ô µÇ°í, ÀÌ´Â ¶óÀ̺귯¸® Äڵ带 ÀÛ¼ºÇÏ´Â ÀÏÀ» Á»´õ ¼ö¿ùÇÏ°Ô µÈ´Ù´Â ÀǹÌÀÔ´Ï´Ù. (% edward : ÀÓÇø®¸àÅ×À̼ÇÀ» "±¸Çö"À̶ó°í ¹ø¿ªÇÏÁö ¾Ê¾Ò³Ä°í ¸Ó¶ó°í ÇÑ´Ù¸é ±×°Ô ³ª¸§´ë·Î "±¸Çö"À̶õ ´Ü¾î·Î Ç¥ÇöÇϱ⠾ָÅÇÑ ºÎºÐÀÌ ³Ê¹«³ªµµ ¸¹Àº °Í °°¾Æ¼­ ÀÔ´Ï´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº ISO-C ¾ð¾î Ç¥ÁØ¿¡ °üÇÑ Committee Draft WG14/N869 ¿¡ ÀÖ´Â ¿ë¾îÁ¤¸® ºÎºÐÀ» »ðÀÔ ÇϰڽÀ´Ï´Ù. ISO/IEC 9899:1999 C Language Standard ¹®¼­¸¦ ±¸ÇÒ ¼ö ÀÖ´Ù¸é ÇѹøÂë Àо´Â°Íµµ ±×´ÙÁö ³ª»ÚÁö´Â ¾ÊÀ» µí ½Í³×¿ä. ==================================================================== implementation a particular set of software, running in a particular translation environment under particular control options, that performs translation of programs for, and supports execution of functions in, a particular execution environment ==================================================================== ) ±×¸®°í OS ¿Í Ç÷§Æû¿¡ ´ëÇØ µ¶¸³ÀûÀÎ ¸¹Àº C ÇÔ¼ö°¡ ÀÖ½À´Ï´Ù : ¿¹¸¦µé¸é ¿Í ´Â ¹Ù·Î º¹»çÇØ¼­ ¾µ¼ö°¡ ÀÖÁÒ. ¹Ý´ë·Î ¿©·¯ºÐÀÇ OS ¸¦ Á¦ÀÛÇϴµ¥ ÀÖ¾î ÄÄÆÄÀÏ·¯¿¡¼­ Á¦°øÇØÁÖ¾î¾ß ÇÏÁö¸¸ ±×·¸Áö ¸øÇÑ °æ¿ìÀÇ ÇÔ¼öµéµµ ÀÖ½À´Ï´Ù. : ¿¹¸¦µé¸é ¸¹Àº µµ½º ±â¹ÝÀÇ ÄÄÆÄÀÏ·¯´Â PC ÀÇ BIOS ¿¡ Á¢±ÙÇÒ ¼ö ÀÖ°Ô ÇØÁÖ´Â Çì´õ ÆÄÀÏÀ» Á¦°øÇÕ´Ï´Ù. ¿©·¯ºÐµéÀÌ Ä¿³Î¿¡¼­ VM86 ¸ð´ÏÅ͸¦ ÀÛ¼ºÇÏÁö ¾Ê´Â´Ù¸é BIOS ÇÔ¼ö¸¦ Á÷Á¢ÀûÀ¸·Î È£ÃâÇÒ ¼ö´Â ¾ø½À´Ï´Ù. ÇÏÁö¸¸ ¾î¶² ÇÔ¼öµéÀº C Ç¥ÁØ ¶óÀ̺귯¸®·Î È®ÀåµÈ °ÍÀϼöµµ Àִµ¥, ¿¹¸¦µé¸é "_biosdisk()"¿Í °°ÀÌ ÇÔ¼ö À̸§ ¾Õ¿¡ ¾ð´õ½ºÄÚ¾î(_) ¹®ÀÚ¸¦ Æ÷ÇÔÇÏ´Â °ÍµéÀÌ ±×·¸ÁÒ. ±×·± ÇÔ¼öµéÀÌ ÇÊ¿äÇÏ´Ù¸é ¾ð´õ½ºÄÚ¾î ¹®ÀÚ·Î ½ÃÀÛÇÏ´Â À̸§À» ºÎ¿©ÇÏ¸é µÇ¹Ç·Î ¿©·¯ºÐµéÀÌ ÀÌ·¯ÇÑ È®ÀåÀ» ±¸ÇöÇÒ Àǹ«°¡ Àִ°ÍÀº ¾Æ´ÏÁö¸¸ ¿©·¯ºÐµéÀÌ ¹Ù¶õ´Ù¸é ÀڽŸ¸ÀÇ È®ÀåµÈ ÇÔ¼ö¸¦ ¸¸µé¼öµµ ÀÖ½À´Ï´Ù. ´Ù¸¥ C ¶óÀ̺귯¸® ÇÔ¼ö·Î´Â Ä¿³ÎÀ» Áö¿øÇϴµ¥ ÀÇÁ¸ÀûÀÎ °Íµéµµ ÀÖ½À´Ï´Ù. : ´Â ÇöÀç ÆÄÀÏ ½Ã½ºÅÛÀÇ Æ¯¼º¿¡ ÀÇÁ¸ÇÏ°Ô µÇ¸ç, printf() Á¶Â÷µµ Ãâ·ÂÀ» À§ÇÑ ´ë»óÀÌ ÇÊ¿äÇÏ´Ù. (% edward : Á¦ ±â¾ïÀÌ ¸Â´Ù¸é Ç¥ÁØ Ãâ·ÂÀ̶ó°í¸¸ µÇ¾îÀÖÁö ±×°ÍÀÌ È­¸éÀ¸·Î Ãâ·ÂÇØ¾ß ÇÑ´Ù ¶ó´Â°Ç ¾Æ´Ñ°É·Î ¾Ë°í ÀÖ½À´Ï´Ù.) printf() ¿¡ ´ëÇØ¼­ Á¶±Ý ´õ À̾߱â ÇØº¸ÀÚ¸é ´ëºÎºÐÀÇ ¿ÀǼҽº C ¶óÀ̺귯¸® ÀÓÇø®¸àÅ×À̼Ç(implementation)Àº ÀϹÝÀûÀÎ printf() ¿£ÁøÀ» Á¤ÀÇÇϴµ¥, ¸î¸î ±â´É¿¡ µû¶ó ¼­·Î ´Ù¸¥ ¸¹Àº ÇÔ¼öµéÀÌ ÇÊ¿äÇϱ⠶§¹®ÀÔ´Ï´Ù. ÀÌ ÇÔ¼ö¿¡ ´ëÇÑ ¹öÁ¯¿¡´Â printf(), fprintf(), sprintf(), vprintf(), wprintf(), vwprintf()µîÀÌ ÀÖ½À´Ï´Ù. ¿©·¯ºÐµéÀº ÀÌ common engine ¼Ò½º¸¦ ÀÌ¿ëÇÏ¿© ½º½º·Î¿¡°Ô ÇÊ¿äÇÑ ¿ëµµ·Î »ç¿ëÇØ¾ß Çϰųª common engine À» ¿¡¹Ä·¹ÀÌÆ® ÇØ¾ß ÇÕ´Ï´Ù. : ±×·¯±â À§Çؼ­´Â format string °ú format stringÀÇ Ãâ·ÂÀ» ÇÔ¼ö³ª buffered stream °ú °°Àº Ãß»óÀûÀÎ ÀÎÅÍÆäÀ̽º º¸³»±â À§ÇÑ ¸Å°³º¯¼ö ¸®½ºÆ®¸¦ Áö¿øÇÏ´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇØ¾ß ÇÕ´Ï´Ù. »ç¿ëÀÚ ¾îÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇϰųª Æ÷ÆÃÇÒ ¶§ ¿ÏÀüÇÑ ·±Å¸ÀÓ ¶óÀ̺귯¸®°¡ °¡Àå À¯¿ëÇÑ ¹æ¹ýÀÏ Áö¶óµµ Ä¿³Î¿¡¼­ ·±Å¸ÀÓ ¶óÀ̺귯¸®¸¦ Áö¿øÇÏ´Â°Í ¶ÇÇÑ Æí¸®ÇÑ ¹æ¹ýÀÌ µÉ ¼ö ÀÖ½À´Ï´Ù. strcpy() ³ª malloc() ó·³ ÀϹÝÀûÀ¸·Î »ç¿ëµÇ´Â ·çƾÀ» Æ÷ÇÔÇÏ´Â °ÍÀº Ä¿³Î Äڵ带 ½±°í ºü¸£°Ô ÀÛ¼ºÇÒ ¼ö ÀÖ°Ô µµ¿ÍÁÖ¸ç Ä¿³ÎÀ» ÀÛ°Ô ¸¸µå´Â ÁÁÀº °á°ú¸¦ ³¾ ¼ö ÀÖ½À´Ï´Ù. ¿Ö³ÄÇϸé ÀÚÁÖ »ç¿ëµÇ´Â ·çƾÀº Çѹø¸¸ Æ÷ÇÔÇÏ¸é µÇ´Ï±î¿ä. µå¶óÀ̹ö °³¹ßÀÚ¿¡°Ôµµ ¹ÙÀ̳ʸ®¿¡ ÀÏÀÏÀÌ ÀÚÁÖ »ç¿ëÇÏ°Ô µÇ´Â ·çƾÀ» Æ÷ÇÔÇÏÁö ¾Ê°Ô ÇÒ ¼ö ÀÖ´ä´Ï´Ù. 5. ¿î¿µÃ¼Á¦ ±¸Ã¼Àû Áö¿ø Ä¿³Î°³¹ßÀ» À§ÇÑ ¾ð¾î·Î º¼¶§ C °¡ ¿Ïº®ÇÑ ¾ð¾î´Â ¾Æ´Õ´Ï´Ù. : ¸í¹éÇÏ°Ô µûÁöÀÚ¸é Æ¯Á¤ ¸Ó½ÅÀÇ Æ¯Â¡¿¡ ´ëÇØ¼­ Á¢±ÙÇϱâ À§ÇÑ Ç¥ÁØÀûÀÎ ¹æ¹ýÀÌ ¾ø´Ù´Âµ¥ ±× ÀÌÀ¯°¡ ÀÖ°ÚÁÒ. ÀÌ´Â C ¾ð¾î°¡ Á¾Á¾ ÀζóÀÎ ¾î¼Àºí¸®(inline assembly)¿¡ ÀÇÁ¸ÇÒ Çʿ䰡 ÀÖÀ¸¸ç ¾î¼Àºí¸®ÀÇ ÄÚµåºÎºÐ°ú C ¾ð¾î·Î ÀÛ¼ºµÈ Äڵ带 ÄÄÆÄÀÏÇÏ¿© »ý¼ºµÈ °á°ú¹°µéÀ» ¸µÅ©ÇØ¾ß ÇÏ´Â ¹®Á¦°¡ ÀÖ´Ù´Â °Í ÀÔ´Ï´Ù. ÀζóÀÎ ¾î¼Àºí¸®´Â C ÇÔ¼öÀÇ ºÎºÐ¿¡ ¾î¼Àºí¸® Äڵ带 ÀÛ¼ºÇÏ´Â °ÍÀ» ¸»Çϸç C ÇÔ¼ö¿¡¼­ ¾î¼Àºí¸® ¾ð¾î·Î ÀÛ¼ºµÈ º¯¼öµéÀ» ¿¢¼¼½º ÇÒ ¼ö ÀÖ½À´Ï´Ù : ¿¹¸¦µé¸é ÄÄÆÄÀÏ·¯¿¡ ÀÇÇØ »ý¼ºµÈ ÄÚµå »çÀÌ¿¡ ¿©·¯ºÐµéÀÌ ÀÛ¼ºÇÑ Äڵ带 »ðÀÔ ÇÏ´Â °ÍÀÌ µÇ°ÚÁö¿ä. (% edward : ÀζóÀÎ ¾î¼Àºí¸®¶õ c ¾ð¾î Äڵ峻¿¡ ¾î¼Àºí¸® ¾ð¾î¸¦ »ç¿ëÇÏ¿© ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â °Í ÀÔ´Ï´Ù. Àú´Â ³ª¸§´ë·Î ±×·¸°Ô »ý°¢Çϰí Àִµ¥ ¿ø·¡ ÀúÀÚ°¡ °Å²Ù·Î ½á³õÀº °Å °°¾Æ¼­ ¹Ù·Î Àâ¾Ò½À´Ï´Ù. Ç㳪 Á¦°¡ À߸ø ¾Ë°í ÀÖ´Â °Í ÀÏ ¼öµµ ÀÖÀ¸´Ï ¿À·ù¿¡ ´ëÇØ¼­´Â ¸ÞÀÏÀ» º¸³»ÁÖ¼¼¿ä.) ÀζóÀÎ ¾î¼Àºí¸®´Â ´Ù¾çÇÑ ÄÄÆÄÀÏ·¯¿¡¼­ Áö¿øÀ» ÇÕ´Ï´Ù. ºñ·Ï Intel Syntax ±â¹Ý¿¡¼­´Â Visual C++ À̳ª Borland C++ ÀÌ ´õ ¸¹ÀÌ ¾Ë·ÁÁö±ä ÇßÁö¸¸ ¸¸¾à ¿©·¯ºÐµéÀÌ AT&T Syntax ±â¹ÝÀ» ¼±ÅÃÇÑ´Ù¸é gcc ´Â PC ÄÄÆÄÀÏ·¯ Áß¿¡¼­´Â ÃÖ°íÀÔ´Ï´Ù. Visual C++ À̳ª Borland C++ ÀÇ ÀζóÀÎ ¾î¼Àºí·¯´Â ³ª¸ÓÁö ÄÄÆÄÀÏ·¯¿¡ ´ëÇØ¼­ ¿Ïº®ÇÏ°Ô ÅëÇÕÀûÀÌÁö ¾Ê½À´Ï´Ù. ÇÏÁö¸¸ gcc ÀÇ ´õ ³­ÇØÇÑ Syntax ¸¦ »ç¿ëÇÑ´Ù¸é C ÄÚµå»ó¿¡ ¾î¼Àºí·¯ ºí·°À» »ðÀÔÇѴٰųª ÇÏ´Â µîÀÇ C Ç¥Çöµµ Çã¿ëÇϸç ÀÌ´Â ¾î¶² ȯ°æÀ» À§ÇÑ °á°ú¹° ¶ÇÇÑ ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù. °á°úÀûÀ¸·Î gccÀÇ ¾î¼Àºí¸®´Â Borland ³ª Microsoft ÀÇ ÄÄÆÄÀÏ·¯ º¸´Ù ´õ ÃÖÀûÈ­µÇ°í ÅëÇÕÀûÀÔ´Ï´Ù. : ¿¹¸¦ µç´Ù¸é, gcc ´Â ¾î¼Àºí¸® ºí¶ôÀÇ °á°ú¿¡ µû¶ó ·¹Áö½ºÅ͵éÀ» ¼öÁ¤ÇÏ´Â µîÀÇ Áö¿øÀ» ÇÕ´Ï´Ù. ¸¸¾à Ä¿³Î ½Ã½ºÅÛÄÝÀ» È£ÃâÇϱâ À§ÇØ ¼ÒÇÁÆ®¿þ¾î ÀÎÅÍ·´Æ®¸¦ ÇÑ´Ù¸é À¯Àú¸ðµå¿¡ ´ëÇØ¼­µµ ¾à°£ÀÇ ¾î¼Àºí¸® ÄÚµå´Â ÇÊ¿äÇÕ´Ï´Ù. ±×¸®°í MS-DOS ¶óÀ̺귯¸® ó·³ C ¶óÀ̺귯¸® Äڵ带 Á÷Á¢ÀûÀ¸·Î ÀÎÅÍ·´Æ® È£ÃâÇϰųª Windows NT ÀÇ ntdll.dll ó·³ °¢°¢ÀÇ È£ÃâÀ̳ª ¸µÅ©¸¦ À§ÇÑ ÇÔ¼ö¿Í ºÐ¸®µÈ ¶óÀ̺귯¸®¸¦ ¸¸µé ¶§µµ ÇÊ¿äÇÕ´Ï´Ù. OS ¿¡ ´ëÇØ ÀÇÁ¸ÀûÀÎ ÀÎÅÍÆäÀ̽º¸¦ °®´Â ¾ð¾î¿¡ ´ëÇØ µ¶¸³ÀûÀÎ ¶óÀ̺귯¸®(Language-independent Library)¸¦ ¸¸µé¾î µÐ´Ù¸é °°Àº OS ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ¿© ´Ù¸¥ ¾ð¾î¸¦ »ç¿ëÇÏ¿© ÇÁ·Î±×·¥ ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ÀÌ´Â ¸¹Àº »ç¶÷µéÀÌ C ÀÇ ¹ÙÀεùÀ» Çã¿ëÇÏÁö ¾Ê´Â C °¡ ¾Æ´Ñ ´Ù¸¥¾ð¾î·Î ¿©·¯ºÐµéÀÇ OS ¿¡¼­ µ¿ÀÛÇÏ´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¼ö°¡ ÀÖ°Ô µË´Ï´Ù. (% edward : ÀÌ Á¡Àº OS °³¹ßÀ» »ý°¢Çϰí ÀÖ´Â »ç¶÷À̶ó¸é °¡Àå ½Å°æÀ» ½á¾ß µÉ ºÎºÐÀ̶ó°í »ý°¢ÇÕ´Ï´Ù. ¾Æ¹«¸® Àß ¸¸µé¾îÁø OS ¶óµµ ¾µ¸¸ÇÑ APP °¡ ¾ø´Ù¸é À¯ÀúÀÔÀå¿¡¼­ ±×°Í¸¸Å­ ¾µ¸ð¾ø´Â OS µµ ¾øÀ»Å״ϱî¿ä ...) 6. C++ Ä¿³Î (C++ in the Kernel) C++ ·Î Ä¿³ÎÀ» ÀÛ¼ºÇѴٴµ¥ ´ëÇØ¼­´Â ¸¹Àº °ßÇØ°¡ ÀÖ½À´Ï´Ù. : ¸î¸î »ç¶÷µéÀÌ C++ ·Î ¿î¿µÃ¼Á¦¸¦ ÀÛ¼ºÇϴµ¥ ¹ÝÇØ ´ëºÎºÐÀÇ ¸®´ª½º Ä¿³Î ÄÚ´õµéÀº C++ ¿¡´Â °ü½ÉÀÌ ¾ø¾îº¸ÀÔ´Ï´Ù. Àúµµ °³ÀÎÀûÀ¸·Î´Â C ¾ð¾î¸¦ »ç¿ëÇÕ´Ï´Ù¸¸ ¿©·¯ºÐµéÀÌ C++ À» »ç¿ëÇÒ ¼ö ÀÖ´Ù¸é ¼±ÅÃÇÏÁö ¾ÊÀ» ÀÌÀ¯´Â ¾ø´Ù°í º¸ÀÔ´Ï´Ù. ¿©·¯ºÐµéÀÌ C++ ·Î Ä¿³ÎÀ» ÀÛ¼ºÇϱâ À§Çؼ­´Â framework¸¦ À§ÇÑ Äڵ带 Á¶±Ý ´õ ÀÛ¼ºÇØ¾ß ÇÒ Çʿ䰡 ÀÖ´Ù´Â °ÍÀÔ´Ï´Ù. ±×¸®°í ÇʼöÀûÀ¸·Î Áö¿øÇؾßÇÒ Äڵ带 ÀÛ¼ºÇÒ °ÍÀÌ ¾Æ´Ï¶ó¸é C++ ÀÇ ¸î °¡Áö Ư¼ºÀ» Á¦°ÅÇØ¾ß ÇÕ´Ï´Ù. ¿ì¼±ÀûÀ¸·Î new ¿Í delete µ¿ÀÛÀ» ÇÏ´Â Äڵ尡 ÇÊ¿äÇÕ´Ï´Ù. ÀÌ´Â ÀÌ¹Ì malloc() À̳ª free() ¿¡ ´ëÇØ¼­ Äڵ带 ÀÛ¼ºÇغ¸¾Ò´Ù¸é ½±°Ô ÇØ°áÀÌ °¡´ÉÇÕ´Ï´Ù : new ¿Í delete ´Â °¢°¢ malloc °ú free ¸¦ È£ÃâÇÏ´Â ÇÑ ÁÙÂ¥¸® ÇÔ¼ö°¡ µÉ ¼ö ÀÖ½À´Ï´Ù. ¸¸¾à ¿©·¯ºÐµéÀÌ Å¬·¡½º¿¡ ´ëÇÑ Àü¿ª ÀνºÅϽº¸¦ ÀÌ¿ëÇϱ⸦ ¿øÇÑ´Ù¸é ±×¿¡ ´ëÇÑ °¢°¢ÀÇ »ý¼ºÀÚ¸¦ È£ÃâÇϱâ À§ÇÑ ½ÃÀÛ ·çƾÀ» »ðÀÔÇØ¾ß ÇÒ °ÍÀÔ´Ï´Ù. ÀÌ ¹æ¹ý¿¡ À־´Â ÄÄÆÄÀÏ·¯ ¸¶´Ù ´Ù¸£°Ô µÇ´Âµ¥ ¿©±â¼­ °¡Àå ÁÁÀº ¹æ¹ýÀº ¿©·¯ºÐµéÀÌ »ç¿ëÇÒ ÄÄÆÄÀÏ·¯ÀÇ ·±Å¸ÀÓ ¶óÀ̺귯¸®¿¡¼­ ÀÌ·¯ÇÑ ÀϵéÀ» ¾î¶»°Ô ó¸®Çϰí Àִ°¡ ÇÏ´Â°É ¾Ë¾Æº¸´Â °ÍÀÌ µÇ°ÚÁÒ. ¿¹¸¦ µé¾î crt0.c ¿Í °°Àº À̸§À» °®´Â ÆÄÀÏÀ» ºÐ¼®Çغ¸´Â ÀÏÀ» Çϴ°̴ϴÙ. ¾Æ¸¶µµ atexit() ÇÔ¼ö¿Í ºñ½ÁÇÑ°É ±¸Çö ÇØ¾ß µÉ °ÍÀε¥ ±× ÀÌÀ¯´Â C++ ÄÄÆÄÀÏ·¯´Â ÇÁ·Î±×·¥À» Á¾·áÇÒ¶§ Àü¿ª °´Ã¼¿¡ ´ëÇÑ ¼Ò¸êÀÚ¸¦ È£ÃâÇϱâ À§Çؼ­ atexit() ÇÔ¼ö¸¦ »ç¿ëÇÏ°Ô µÉ µíÇϱ⠶§¹®ÀÔ´Ï´Ù. ¸¸¾à Ä¿³Î¿¡¼­ try/catch ¸¦ »ç¿ëÇϱ⸦ ¹Ù¶õ´Ù¸é ¹Ýµå½Ã ¿©·¯ºÐµéÀÌ »ç¿ëÇÒ ÄÄÆÄÀÏ·¯¿¡¼­ ±×°ÍµéÀ» »ç¿ëÇÒ ¼ö ÀÖ°Ô ²û ÇØÁÖ´Â ±¸ÇöºÎ°¡ ÇÊ¿äÇÒ °ÍÀÔ´Ï´Ù. ÀÌ ÀÛ¾÷Àº »ó´çºÎºÐ ¿©·¯ºÐµéÀÌ »ç¿ëÇϰíÀÚ ÇÏ´Â ÄÄÆÄÀÏ·¯¿¡ ÀÇÁ¸ÀûÀÎ ºÎºÐÀÌ¸ç ¾î¶² ¿î¿µÃ¼Á¦¿¡ ¾î¶² ÄÄÆÄÀÏ·¯¸¦ »ç¿ëÇÏ´À³Ä¿¡ µû¶ó ´Þ¶óÁö°ÚÁÒ. ¿©·¯ºÐµéÀÇ Ä¿³Î °³¹ß¿¡¼­ À§ÀÇ µÎ °¡Áö ¿¹¿Ü ó¸®¿Í °Å´ëÇÑ °¡»ó Ŭ·¡½º¿¡ ´ëÇÑ ºÎºÐÀº ¹èÁ¦ ÇßÀ¸¸é ÇÏ´Â ¹ÙÀÔ´Ï´Ù. ¿¹¿Ü 󸮸¦ ÇÏ·Á¸é ºÒ ÇÊ¿äÇÑ Ãß°¡ÀûÀÎ ÀÛ¾÷µéÀÌ ¸¹¾ÆÁö°í, °¡»óÀûÀÎ ÇÔ¼öµé¿¡ ´ëÇÑ ÀÛ¾÷À» ÇØ¾ßÇϴµ¥ ´Ù¼Ò ÃÖÀûÈ­ ºÎºÐ¿¡¼­´Â ±×´ÙÁö ÁÁÁö ¾Ê½À´Ï´Ù. ±×¸®°í ÀÌÁ¡À» ±â¾ïÇØµÎ¼¼¿ä ... ¿©·¯ºÐµéÀÇ Ä¿³ÎÀº ¾à°£ÀÇ µðÀÚÀÎ ºÎºÐ¿¡¼­ÀÇ ¼Õ½ÇÀ» °¨¼öÇÏ´õ¶óµµ °¡´ÉÇÑÇÑ È¿À²ÀûÀΰÍÀÌ ÁÁ´Ù°í »ý°¢ÇÕ´Ï´Ù. (% edward : Á¦°¡ C++ ¿¡ ´ëÇØ¼­´Â ÀüÇô °øºÎÇØ º» ¹Ù°¡ ¾ø¾î¼­ ¿À·ù°¡ ¸¹À»Áöµµ ¸ð¸£°Ú½À´Ï´Ù. ±×¸®°í ¿øÀúÀÚ°¡ ¸»ÇÑ OS µðÀÚÀΰú È¿À²ÀûÀÎ ¸é¿¡ ´ëÇÑ À̾߱⵵ ±×¸® ¹Ý°¨ÀÌ °¡Áø ¾Ê´Â±º¿ä. MINIX ¿Í LINUX ÀÇ ¿¹¸¦ Àß º¸¸é ±×´ÙÁö À߸øµÈ ³»¿ëµµ ¾Æ´Ï¶ó°í º¾´Ï´Ù. ¸Å¿ì ÀûÀýÇÑ ¿¹´Â ¾Æ´ÒÅ×Áö¸¸¿ä ^^) 7. ±ÛÀ» ¸¶Ä¡¸é¼­ C¿Í °°Àº °í±Þ ¾ð¾î¿¡¼­ OS¸¦ ÀÛ¼ºÇÑ´Ù´Â °ÍÀº ÀüüÀûÀ¸·Î ¾î¼Àºí¸®¿Í °°Àº ¾ð¾î·Î ÄÚµùÇÏ´Â °Í º¸´Ù´Â ÈξÀ ´õ »ý»êÀûÀÎ ¸éÀÌ ÀÖ½À´Ï´Ù. ¹°·Ð ¼Óµµ ¸é¿¡¼­ ¾Õ¼­°¡°íÀÚ ÇÑ´Ù¸é ¾î¼Àºí¸® ¾ð¾î¸¦ »ç¿ëÇϴ°ÍÀÌ ÇϳªÀÇ ¹æ¹ýÀÌ µÉ ¼ö µµ ÀÖ½À´Ï´Ù. (% edward : ´Ã ´çºÎÇÏ´Â ¸»ÀÌÁö¸¸ ¾î¼³Ç assembly ¾ð¾î·Î ÃÖÀûÈ­¸¦ ÇÏ·Á°í Çß´Ù°¡´Â c ¾ð¾î·Î ÀÛ¼ºÇÑ °Í º¸´Ù ¸øÇÑ °æ¿ì°¡ ¸¹À¸´Ï ¾î¼Àºí¸® ¾ð¾î·Î Äڵ带 ÀÛ¼ºÇÒ ½Ã¿¡´Â µÑÀÇ Äڵ带 ºñ±³Çغ¸°í ÆÛÆ÷¸Õ½º Å×½ºÆ®¸¦ ÇØº¸´Â °ÍÀÌ ÇʼöÀÔ´Ï´Ù.) ¶ÇÇÑ ¾î¼Àºí¸®¾ð¾î³ª ´Ù¸¥ ¾ð¾îµé º¸´Ù´Â ¿©·¯°¡Áö ¸é¿¡¼­ »ó´ëÀûÀ¸·Î ½±°Ô Ä¿³ÎÄڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Â gcc °°Àº ÀÚÀ¯·Ó°Ô À̿밡´ÉÇÑ ÄÄÆÄÀÏ·¯µµ ÀÖ½À´Ï´Ù. ±×¸®°í C¸¦ »ç¿ëÇØ OS¸¦ °³¹ßÇϴ°ÍÀº ¿À·£ °³¹ß±â°£µ¿¾È »ó´çÇÑ ÀÌÁ¡ÀÌ ÀÖÀ» °ÍÀÔ´Ï´Ù. ======================================================================== * edward ÀÇ ¹®¼­ ÀÛ¼ºÈıâ À̹ø¿¡µµ ½ÇÆÐÀÛ °°½À´Ï´Ù. -_-; Á˼ÛÇÕ´Ï´Ù. º°·Î µµ¿òÀÌ µÇÁö ¸øÇÏ´Â ¹®¼­ÀÎµí ½Í½À´Ï´Ù. ¹ø¿ªµµ ÀüÇô ¸¶À½¿¡ ¾Èµé±¸¿ä. °Ô´Ù°¡ ´Ü¼øÈ÷ ÀÌ ³»¿ë¸¸ °¡Áö°í´Â Ãʺ¸ÀÚµéÀÌ ÀÌÇØÇÒ ¼ö ¾ø´Â ºÎºÐµµ ²Ï³ª ¸¹Àº °Í °°½À´Ï´Ù. ======================================================================== ======================================================================== * Change Log (bout Documentation) - v 0.0.2 (2000.00.00) ========================================================================