============================================================== Á¦¸ñ : C++ ·Î Ä¿³Î ÀÛ¼ºÇϱ⠿øÀúÀÚ : ÀÛ¼ºÀÚ : edward ÀÛ¼ºÀÏÀÚ : 2003. 12. 21 ºÐ¼®¹×¹ø¿ª: edward_frswz ºÐ¼®¹öÁ¯ : ver 0.0.1 ¶óÀ̼¾½º : GPL ȨÆäÀÌÁö : http://OSx86.ORG ¿ø¹®ÂüÁ¶ : http://www.invalidsoftware.net/os/?the_id=11 ============================================================== ======================================================= - Áغñ¹° DJGPP 2.0.3 NASM 0.98.08 - ¿ä±¸Áö½Ä ±âº»ÀûÀÎ ºÎÆ®·Î´õ ÀÛ¼º¹ý º¸È£¸ðµå¿¡ ´ëÇÑ ±âº»ÀûÀÎ ÀÌÇØ C++ ¾ð¾î¿Í ¾î¼Àºí¸® ¾ð¾îÀÇ ÀÌÇØ - Å×½ºÆ® ȯ°æ Ʋ¸° ³»¿ëÀ̳ª ÀÌ»óÇÑ ³»¿ëÀº ¹Ù·Î ¸ÞÀÏ·Î ¾Ã¾îÁÖ¼¼¿ä. Á¦°¡ °ËÁõ ÈÄ ¹Ù·Î °íÃļ­ ¾÷µ¥ÀÌÆ® ÇϰڽÀ´Ï´Ù. email : osx86@osx86.org ======================================================= 0. edward ÀÇ ¼­¹® ¿ì¼± Á¦°¡ C++ ¿¡ ´ëÇØ¼­´Â ÀüÇô ¸ð¸¥´Ù´Â Á¡À» ¾Ë·Á µå¸³´Ï´Ù. µû¶ó¼­ ÀÌ ±ÛÀÌ ¿À·ù¸¦ ³»Æ÷Çϰí ÀÖÀ»Áöµµ ¸ð¸¨´Ï´Ù. Ȥ½Ã¶óµµ C++À» Àß ¾Ë°í °è½ÅºÐÀÌ ÀÖ´Ù¸é ¹®¼­ÀÇ ¿À·ù¸¦ ÁöÀûÇØ Áֽñ⠹ٶø´Ï´Ù. ±×¸®°í ÀúÀÚÀÇ À̸§Àº ¾Ë ¼ö°¡ ¾ø¾úÁö¸¸ ¸ÞÀÏ ÁּҴ ãÀº °Í °°½À´Ï´Ù. ±Ã±ÝÇÑ Á¡Àº ¾Æ·¡ÀÇ ¸ÞÀÏÁÖ¼Ò·Î Áú¹®ÇϽðųª OSx86 ÀÇ QNA ¶õ¿¡ Áú¹®ÇÏ¿© Áֽñ⠹ٶø´Ï´Ù. whyme_t@invalidsoftware.net A. Åø(Tools)°ú ¸î °¡Áö °¡Á¤ ÀÌ ¹®¼­´Â ´ÙÀ½ÀÇ ÅøµéÀ» »ç¿ëÇÏ°Ô µÉ °ÍÀÔ´Ï´Ù. ================================================================= DJGPP - DOS ±â¹ÝÀÇ Intel 80386 ÀÌ»óÀÇ PC ¿¡¼­ µ¿ÀÛÇÏ´Â ¿ÏÀüÇÑ 32-Bit C/C++ °³¹ß ȯ°æ NASM - ¿ÀÇ ¼Ò½º 80x86 ¾î¼Àºí·¯ (Netwide Assembler Project) ================================================================= ¼Ò½ºÄÚµå´Â Windows XP ȯ°æ¿¡¼­ DJGPP 2.03 °ú NASM 0.98.08 À» »ç¿ëÇÏ¿© Å×½ºÆ® ÇÏ¿´½À´Ï´Ù. ´Ù¸¥ ¹öÁ¯ÀÇ GCC ÇÏ¿¡¼­´Â ¸î°¡Áö ±â¼úÀûÀÎ ¹®Á¦·Î µ¿ÀÛÇÏÁö ¾ÊÀ» ¼öµµ Àֱ⿡ ±¸Ã¼ÀûÀÎ ÄÄÆÄÀÏ·¯ ÀÓÇø®¸àÅ×À̼ÇÀ» ¾Ë·ÁµÎ´Â °ÍÀÔ´Ï´Ù. ÀüÁ¦ : ===================================================================== - ¿©·¯ºÐµéÀÌ Kernel ¸¸µé±â¸¦ óÀ½ ½ÃµµÇÏ´Â »ç¶÷ÀÌ ¾Æ´Ï¶ó°í °¡Á¤ÇÕ´Ï´Ù. (±âÃÊÀûÀÎ ´õ¹Ì Ä¿³ÎÀÌ¶óµµ ¸¸µé¾î º» »ç¶÷À̶ó°í °¡Á¤ ÇϰڽÀ´Ï´Ù.) - ¶ÇÇÑ C++ ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡ ´ëÇØ¼­µµ ÀÌ¹Ì ´É¼÷ÇÏ´Ù°í °¡Á¤ÇÕ´Ï´Ù. - ¸¶Áö¸·À¸·Î ºÎÆ® ·Î´õ¸¦ ÀÌ¹Ì ÀÛ¼ºÇØ º¸¾Ò°Å³ª GRUB °ú °°ÀÌ Ç¥ÁØÀûÀÎ ºÎÆ®·Î´õ¸¦ »ç¿ëÇÏ´Â ¹ýÀ» ¾Ë°í ÀÖ´Ù´Â °¡Á¤ÇÏ¿¡ ÀÌ ±ÛÀ» ¾¹´Ï´Ù. ===================================================================== ¸¸¾à ¿©·¯ºÐµéÀÌ GRUB À» »ç¿ëÇÑ´Ù¸é ¾î¼Àºí·¯ Äڵ尡 ÇÊ¿ä¾øÀ» Áöµµ ¸ð¸£±â ¶§¹®ÀÔ´Ï´Ù. Part 1. "Hello, world!" Ä¿³Î - ·±Å¸ÀÓ Áö¿øÀ» ¹ÞÁö¾Ê´Â C++ Ä¿³Î Part 1-1. ¼Ò°³ ÀÌ °­ÁÂÀÇ ¸ñÇ¥´Â C++ ·Î ¾ÆÁÖ ´Ü¼øÇÑ Ä¿³ÎÀ» ¾î¶»°Ô ±¸ÇöÇÏ´ÂÁö ¾Ë·ÁÁÖ±â À§ÇÑ °ÍÀÔ´Ï´Ù. ÀÌ ³»¿ëÁß¿¡´Â ¿ì¸®ÀÇ Ä¿³ÎÀ» ÃʱâÈ­ ½Ã۱âÀ§Çؼ­ ¾à°£ÀÇ ¾î¼Àºí·¯¸¦ »ç¿ëÇÏ°Ô µÇ¸ç ¸î °¡Áö C++ ·±Å¸ÀÓ Áö¿øÀ» Çϱâ À§ÇØ ¾à°£ÀÇ C ÄÚµå ¶ÇÇÑ »ç¿ëÇÏ°Ô µË´Ï´Ù. ³¡À¸·Î "Hello, world!" ¸¦ Ãâ·ÂÇÏ´Â ¿¹Á¦¸¦ º¸ÀÏ °ÍÀÔ´Ï´Ù. Part 1 ¿¡¼­´Â ·±Å¸ÀÓ Áö¿øÀ» ¹ÞÁö ¾Ê°í °³¹ßÇÏ´Â ºñµð¿À µå¶óÀ̹ö¸¦ ¼Ò°³ÇÕ´Ï´Ù. Part 2 ¿¡¼­´Â Àü¿ª(global) °´Ã¼¿Í Á¤Àû(static) °´Ã¼¸¦ »ç¿ë°¡´ÉÇÏ°Ô ÇÏ´Â ·±Å¸ÀÓ Áö¿ø¿¡ ´ëÇØ¼­ ¼Ò°³ÇÕ´Ï´Ù. Part 3 ¿¡¼­´Â ¸Å¿ì °£´ÜÇÑ std::cout(C++ Ç¥ÁØ ¶óÀ̺귯¸®¿¡¼­ Ç¥ÁØ Ãâ·Â ½ºÆ®¸²)À» ±¸ÇöÇÏ°Ô µË´Ï´Ù. ±×¸®°í ÃÖÁ¾ÀûÀÎ °á°ú¹°Àº ¾Æ·¡¿¡ º¸ÀÌ´Â Andrew Koenig and Barbara E. Moo ÀÇ Àú¼­ÀÎ Accelerated C++ ÀÇ Ã¹¹øÂ° ¿¹Á¦°¡ µÉ °ÍÀÔ´Ï´Ù. ============================================================= // Á¶±×¸¶ÇÑ C++ Ä¿³Î #include int main() { std::cout << "Hello, world!" << std::endl ; return 0 ; } ============================================================= (% edward : Ä¿³ÎÀ̶õ À̸§À» ºÙÀ̱⿡´Â -_-;;; ) Part 4 ¿¡¼­´Â C++ ÀÇ Ä¸½¶È­¸¦ »ç¿ëÇÏ¿© GDT(Global Descriptor Table)°ú IDT(Interrupt Descriptor table) À» ¼³Á¤ÇÕ´Ï´Ù. Part 5 ¿¡¼­´Â °£´ÜÇÑ ÀÎÅÍ·´Æ® µå¸®ºì ¹æ½ÄÀÇ Å°º¸µå µå¶óÀ̹ö¸¦ ¼Ò°³ÇÕ´Ï´Ù. Part 6 ¿¡¼­´Â ¸Å¿ì ´Ü¼øÇÑ std::string ¿¡ ±¸Çö¿¡ ´ëÇØ¼­ ¼Ò°³Çϰí, Part 7 ¿¡¼­´Â ¸Å¿ì ´Ü¼øÇÑ std::cin ÀÇ ±¸Çö¿¡ ´ëÇØ¼­ ¼Ò°³ÇÕ´Ï´Ù. ¿©±â¼­ÀÇ ÃÖÁ¾Àû °á°ú¹°Àº ¾Æ·¡¿¡ º¸ÀÌ´Â Andrew Koenig and Barbara E. Moo ÀÇ Àú¼­ÀÎ Accelerated C++ ÀÇ µÎ¹øÂ° ¿¹Á¦°¡ µÉ °ÍÀÔ´Ï´Ù. ============================================================= // Á¶±×¸¶ÇÑ C++ Ä¿³Î #include #include int main() { // ask for the person's name std::cout << "Please enter your first name: " ; //read name std::string name ; // define name std::cin >> name ; // read into name // write a greeting std::cout << "Hello, " << name << "!" << std::endl ; return 0 ; } ============================================================= C++ Ä¿³ÎÀ» ¿Ã¸®°í µ¿ÀÛ½ÃŰ´Â ÀÏÀº C Ä¿³ÎÀ» ¿Ã¸®°í µ¿ÀÛ½ÃŰ´Â °Í¿¡ ºñÇØ¼­´Â ´õ º¹ÀâÇÏÁö¸¸ ±×·Î ÀÎÇØ »ý±â´Â °á°ú¹°Àº C Ä¿³Îº¸´Ù´Â Á»´õ À¯¿¬ÇÑ °´Ã¼ ÁöÇâÀûÀÎ Ä¿³ÎÀ» °¡Áú ¼ö ÀÖ´Ù´Â °ÅÁÒ. Part 1-2. C++ ·Î Ä¿³ÎÀ» ÀÛ¼ºÇÒ ¶§ÀÇ ÇѰè C++ ÀÇ Ã¢Á¶ÀÚÀÎ Bjarne Stroustrup ÀÇ Àú¼­ÀÎ "The C++ programming language third edition" ÀÇ section 1.3.1 À» ÀοëÇϸé ================================================================ "new, delete, typeid, dynamic_cast ±×¸®°í throw ¿ÀÆÛ·¹ÀÌÅÍ¿Í try-block µîÀ» Á¦¿ÜÇÑ ³ª¸ÓÁö C++ expression °ú statement ´Â ·±Å¸ÀÓ Áö¿øÀÌ ÇÊ¿äÇÏÁö ¾Ê½À´Ï´Ù." ================================================================ * ·±Å¸ÀÓ Áö¿øÀÌ ÇÊ¿äÇÑ 3°¡Áö C++ ÀÇ Æ¯Â¡ ========================================= - ³»Àå ÇÔ¼ö (new, delete) - ·±Å¸ÀÓ Å¸ÀÔ Á¤º¸ - RTTI(typeid, dynamic_cast) - ¿¹¿Ü ó¸®(throw, try-block) ========================================= ±×¸®°í Stroustrup Àº C++ Ç¥ÁØ ¶óÀ̺귯¸®·Î ±¸ÇöÇÑ ¿î¿µÃ¼Á¦ÀÇ C++ Äڵ忡 ´ëÇØ¼­µµ ¾ð±ÞÇß½À´Ï´Ù. ÀÌ´Â À§ÀÇ °ÍµéÀ» Ä¿³Î Á¦ÀÛ¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù´Â À̾߱Ⱑ µÇÁÒ. ¶Ç ÁÁÀº ¼Ò½ÄÀº ´ëºÎºÐÀÇ ÄÄÆÄÀÏ·¯¿¡¼­ À§ÀÇ 3°¡Áö Ư¡µéÀ» disable ½Ãų ¼ö ÀÖÀ¸¸ç Ä¿³Î °³¹ß¿¡ ÀÖ¾î ±ÝÁöµÈ expression °ú statement µéÀ» »ç¿ëÇÏÁö ¾ÊÀ¸¸é µÇ´Â °ÍÀÔ´Ï´Ù. ¿ì¸®°¡ À§ÀÇ 3°¡Áö Ư¡µéÀ» »ç¿ëÇÒ ¼ö ÀÖÀ»¶§ ±îÁö´Â ½º½º·Î Áö¿øÇÒ ¼ö ÀÖ°Ô ÇÏ´Â À¯»çÇÑ Äڵ带 Ãß°¡ÇÏ¿© ¿ì¸®ÀÇ Ä¿³Î¿¡ ±× Äڵ带 ¸µÅ© ½ÃŰ´Â ¼ö ¹Û¿¡ ¾ø½À´Ï´Ù. ==================================================================================== * win32 g++ ÄÄÆÄÀÏ·¯¿¡¼­ À§ÀÇ Æ¯Â¡µéÀ» »ç¿ëÇÏÁö ¾Ê°Ô ÇÏ´Â ¿¹ gxx -c *.cpp -ffreestanding -nostdlib -fno-builtin -fno-rtti -fno-exceptions (gxx - ÄÄÆÄÀÏ·¯ À̸§ ex. gpp ) ¸µÅ© : Options Controlling C++ Dialect (http://gcc.gnu.org/onlinedocs/gcc/C---Dialect-Options.html#C++%20Dialect%20Options) ==================================================================================== (% edward : * ffreestanding ¿É¼ÇÀº freestanding ȯ°æ¿¡ ¸Â°Ô ÄÄÆÄÀÏÀ» ÇÏ°Ô µË´Ï´Ù. freestanding ȯ°æÀ̶õ Ç¥ÁØ ¶óÀ̺귯¸®°¡ Á¸ÀçÇÏÁö ¾ÊÀ¸¸ç ÀÌ È¯°æ¿¡ ¸Â°Ô ÀÛ¼ºµÈ ÇÁ·Î±×·¥Àº ¹Ýµå½Ã main ÇÔ¼ö¿¡¼­ ½ÃÀÛÇÏÁö ¾ÊÀ»Áöµµ ¸ð¸£´Â ±×·± ȯ°æÀ» ¸»ÇÕ´Ï´Ù. freestanding ȯ°æ¿¡ °¡Àå ¾Ë¸ÂÀº ¿¹´Â OS Kernel Á¤µµ°¡ µÇ°Ú½À´Ï´Ù. ±×¸®°í ¹¬½ÃÀûÀ¸·Î -fno-builtin ¿É¼ÇÀ» Æ÷ÇÔÇÕ´Ï´Ù. µû¶ó¼­ built-in function(³»ÀåÇÔ¼ö)¸¦ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù. * nostdlib ¿É¼ÇÀº Ç¥ÁØ ½Ã½ºÅÛÀÇ ½ÃÀÛ ÆÄÀÏ È¤Àº ¶óÀ̺귯¸®¸¦ ¸µÅ·ÇÒ¶§´Â »ç¿ëÇØ¼­´Â ¾ÈµË´Ï´Ù. ÄÄÆÄÀÏ·¯´Â System V(±×¸®°í ISO C) ȯ°æÀÇ memcmp, memset, memcpy ¸¦ È£ÃâÇÏ´Â ºÎºÐÀ̳ª BSD ȯ°æÀÇ bcopy, bzero ¸¦ »ý¼ºÇÒÁöµµ ¸ð¸¨´Ï´Ù. * fno-builtin ¿É¼ÇÀº __builtin_ prefix ·ÎºÎÅÍ ÇØ¼®À» ½ÃÀÛÇÏÁö ¾Ê°Ô ÇÕ´Ï´Ù. ±× ¿Ü¿¡´Â Àú À§ÀÇ ¸µÅ©³ª manpage ¸¦ ÂüÁ¶Çغ¸¼¼¿ä. ) ±×¸®°í ³ª»Û ¼Ò½ÄÀº RTTI ÇÔ¼öµéÀº Ç¥ÁØÀûÀÎ ¹æ¹ýÀÌ ¾Æ´Ï¶ó´Â Á¡°ú EH ´Â ÄÄÆÄÀÏ·¯¿¡ ±¸ÇöµÈÀûÀÌ ÀÖ´Ù´Â Á¡ÀÔ´Ï´Ù. ±×¸®°í °°Àº ÄÄÆÄÀÏ·¯ÀÇ ´Ù¸¥ ¹öÁ¯ Á¶Â÷µµ µ¿ÀÛÀÌ ´Ù¸¨´Ï´Ù. Part 2 ¿¡¼­´Â ÀÌ ¹®Á¦¿¡ ´ëÇØ¼­ Á» ´õ »ó¼¼ÇÏ°Ô ´Ù·ïº¸µµ·Ï ÇÒ °ÍÀ̹ǷΠ±×·¯´Ï Áö±ÝÀº disable Çϱâ·Î ÇϰڽÀ´Ï´Ù. ÄÄÆÄÀÏ·¯¿¡¼­ Á¦°øÇÏ´Â ·±Å¸ÀÓÀÇ Áö¿øÀ» disable ½ÃŰ°í ³ª¸é ÄÄÆÄÀÏ ÀÛ¾÷ ½Ã ÄÄÆÄÀÏ·¯ÀÇ ¸î°¡Áö ±â´ÉÀÌ Á¦¿ÜµË´Ï´Ù. ÄÄÆÄÀÏ·¯´Â ÀϹÝÀûÀ¸·Î main() ÇÔ¼ö¸¦ È£ÃâÇϱâ Àü, ±×¸®°í main() ÇÔ¼ö¿¡¼­ return ÇÑ ÈÄ¿¡ µÎ °¡Áö ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù. ÀüÇüÀûÀ¸·Î main() ÇÔ¼ö¸¦ È£ÃâÇϱâ Àü¿¡´Â _main() À̶õ ÇÔ¼ö¸¦ È£ÃâÇÏ°Ô µÇ°í, return ÇÑ ÈÄ¿¡´Â _atexit() ¶ó´Â ÇÔ¼ö¸¦ È£ÃâÇÏ°Ô µÇÁÒ. ÀÌ ÇÔ¼öµéÀº global object ¶Ç´Â static object »ý¼ºÀÚ¿Í ¼Ò¸êÀÚ¸¦ ó¸®ÇÕ´Ï´Ù. global object ³ª static object µµ Áö¿øÇϱâ À§ÇØ ÇÊ¿äÇÑ Äڵ带 Ãß°¡ÇÒ ¶§ ±îÁö´Â »ç¿ëÇÒ ¼ö°¡ ¾ø½À´Ï´Ù. ¿ä¾àÇØº¸¸é C++ Ư¡Áß ±× Ư¡À» »ç¿ëÇϱâ À§ÇØ ¿ì¸®°¡ Ưº°È÷ Äڵ带 Ãß°¡ÇÏÁö ¾Ê´Â ÀÌ»ó »ç¿ëÇÒ ¼ö ¾ø´Â Ư¡µéÀº ¾Æ·¡¿Í °°½À´Ï´Ù. =================================================== - Built in functions (³»ÀåÇÔ¼ö) - Run Time Type Information(RTTI) - Exception handling(¿¹¿Üó¸®) - The C/C++ standard library (C++ Ç¥ÁØ ¶óÀ̺귯¸®) - global / static objects =================================================== Part 1-3. ÄÚµå ¿ì¸®°¡ ÀÛ¼ºÇÏ°Ô µÉ Ä¿³ÎÀÇ main ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ±â´ÉÀ» ÇÏ´Â ASM ÄÚµå·Î ºÎÅÍ ½ÃÀÛÇØº¾½Ã´Ù. ³ªÁß¿¡ ÀÌ ÄÚµå´Â _main()°ú _atexit() ¿Í °°Àº ¿ì¸®ÀÇ ·±Å¸ÀÓ Áö¿øÀ» À§Çؼ­µµ È£ÃâÇÏ°Ô µÉ °ÍÀÔ´Ï´Ù. # source : Loader.asm ======================================================= ; Loader.asm [BITS 32] ; protected mode [global start] [extern _main] ; this is in our C++ code start: call _main ; call int main(void) from our C++ code cli ; interrupts could disturb the halt hlt ; halt the CPU ======================================================= ÀÌÁ¦ ¿ì¸®ÀÇ C++ Ä¿³Î¿¡¼­ Video ¶ó´Â °£´ÜÇÑ ºñµð¿À µå¶óÀ̹ö ¿ªÇÒÀ» ÇÏ°Ô µÉ Ŭ·¡½º¸¦ ÀÛ¼ºÇÕ´Ï´Ù. ´ÙÀ½ Äڵ尡 Ä¿³ÎÀ» À§ÇÑ Àüü ÄÚµå ÀÔ´Ï´Ù. # source : Video.h ============================================================================= // Video.h #ifndef VIDEO_H #define VIDEO_H // Video.h ÀÇ Áߺ¹ ¼±¾ðÀ» ¸·±â À§Çؼ­ class Video { public: Video(); ~Video(); void clear(); void write(char *cp); void put(char c); private: unsigned short *videomem; // ºñµð¿À ¸Þ¸ð¸®¸¦ À§ÇÑ Æ÷ÀÎÅÍ unsigned int off; // y ÁÂÇ¥·Î »ç¿ë ÇÒ offset unsigned int pos; // x ÁÂÇ¥·Î »ç¿ë ÇÒ position }; // ¼¼¹ÌÄÝ·ÐÀ» ÀØÁö¸¶¼¼¿ä. #endif ============================================================================= # source : Video.cpp ============================================================================= // Video.cpp #include "Video.h" Video::Video() { pos=0; off=0; videomem = (unsigned short*) 0xb8000; } Video::~Video() {} void Video::clear() { unsigned int i; for(i=0; i<(80*25); i++) { videomem[i] = (unsigned char) ' ' | 0x0700; } pos=0; off=0; } void Video::write(char *cp) { char *str = cp, *ch; for (ch = str; *ch; ch++) { put(*ch); } } void Video::put(char c) { if(pos>=80) { pos=0; off += 80; } if(off>=(80*25)) { clear(); // È­¸éÀ» ½ºÅ©¸¦ ÇØ¾ßÇÏÁö¸¸ Áö±ÝÀº ±×³É clear } videomem[off + pos] = (unsigned char) c | 0x0700; pos++; } ============================================================================= # source : Kernel.cpp ============================================================================= //Kernel.cpp #include "Video.h" int main(void) { Video vid; // local (global º¯¼ö´Â ·±Å¸ÀÓ Áö¿ø Äڵ尡 ÇÊ¿äÇϱ⠶§¹®¿¡...) vid.write("Hello, world!"); } ============================================================================= Part 1-4. ÄÄÆÄÀÏ ÀÛ¾÷ Video.cpp °ú Kernel.cpp À» ÄÄÆÄÀÏÇϱâ À§Çؼ­´Â C++ ÄÄÆÄÀÏ·¯°¡ ÇÊ¿äÇÕ´Ï´Ù. ±×¸®°í ¿ì¸®°¡ À§¿¡¼­ ¾ð±ÞÇß¾ú´ø Ä¿³Î¿¡¼­ »ç¿ëÇÒ ¼ö ¾ø´Â C++ ÀÇ ¸î °¡Áö Ư¡µéÀ» ÄÄÆÄÀÏ °úÁ¤¿¡¼­ disable ½ÃŰ´Â °Íµµ ÀØÁö ¸»¾ÆÁÖ¼¼¿ä. ¿©·¯ºÐÀÇ C++ ÄÄÆÄÀÏ·¯·Î ºÎÅÍ ³ª¿Â °á°ú¹°Àº Video.o ±×¸®°í Kernel.o ó·³ ¿ÀºêÁ§Æ® ÆÄÀÏ(object file)À̾î¾ß ÇÕ´Ï´Ù. Loader.asm ÆÄÀÏÀº ¾î¼Àºí·¯¸¦ »ç¿ëÇÏ¿© ¾î¼Àºí °úÁ¤À» °ÅÃÄ¾ß ÇÏ¸ç ¿©·¯ºÐµéÀÌ »ç¿ëÇÏ°Ô µÉ ¾î¼Àºí·¯·Î ºÎÅÍ ³ª¿Â °á°ú¹° ¶ÇÇÑ Loader.o ¶ó´Â ¿ÀºêÁ§Æ® ÆÄÀÏÀ̾î¾ß ÇÕ´Ï´Ù. DJGPP ÀÇ gxx(C++ ÄÄÆÄÀÏ·¯) ¿Í NASM(¾î¼Àºí·¯)¸¦ »ç¿ëÇÏ¿© ÄÄÆÄÀÏ ÇÏ´Â ¿¹´Â ¾Æ·¡¿Í °°½À´Ï´Ù. ================================================================================= gxx -c Video.cpp -ffreestanding -nostdlib -fno-builtin -fno-rtti -fno-exceptions gxx -c Kernel.cpp -ffreestanding -nostdlib -fno-builtin -fno-rtti -fno-exceptions nasm -f aout Loader.asm -o Loader.o ================================================================================= Part 1-5. ¸µÅ© ÀÛ¾÷ ÀÌÁ¦ ¿ì¸®´Â À§¿¡¼­ ¸¸µé¾îÁø 3°³ÀÇ ¿ÀºêÁ§Æ® ÆÄÀÏ(Video.o, Kernel.o, Loader.o)µéÀ» °¡°øµÇÁö ¾ÊÀº ¼ø¼öÇÑ ¹ÙÀ̳ʸ®(flat binary)·Î ¸µÅ©ÇÏ¿© Kernel.bin À̶ó´Â ÆÄÀÏÀ» ¸¸µé¾î¾ß ÇÕ´Ï´Ù. ¸µÅ© ÀÛ¾÷Àº ¸Å¿ì ÀÚÁÖ ÇÏ°Ô µÇ¹Ç·Î ¸µÄ¿ ½ºÅ©¸³Æ®(linker script)¸¦ »ç¿ëÇϱ⸦ ¹Ù¶ø´Ï´Ù. part 2 ¿¡¼­´Â ¸µÄ¿ ½ºÅ©¸³Æ®¸¦ ÀÛ¼ºÇÏ¿© »ç¿ëÇÏ°Ô µÉ°Ì´Ï´Ù. ¾Æ·¡´Â ld(¸µÄ¿)¸¦ »ç¿ëÇÒ ¶§ÀÇ ¸µÄ¿ ½ºÅ©¸³Æ®ÀÔ´Ï´Ù. ================================================ /* Link.ld */ OUTPUT_FORMAT("binary") ENTRY(start) SECTIONS { .text 0x100000 : { code = .; _code = .; __code = .; *(.text) . = ALIGN(4096); } .data : { data = .; _data = .; __data = .; *(.data) . = ALIGN(4096); } .bss : { bss = .; _bss = .; __bss = .; *(.bss) . = ALIGN(4096); } end = .; _end = .; __end = .; } ================================================ ÀÌÁ¦, À§ÀÇ ¸µÄ¿ ½ºÅ©¸³Æ®¸¦ »ç¿ëÇÏ¿© ld ¸µÄ¿·Î ¾Æ·¡¿Í °°ÀÌ ¸µÅ© ÀÛ¾÷À» ÇÒ ¼ö ÀÖ½À´Ï´Ù. ====================================================== ld -T Link.ld -o Kernel.bin Loader.o Kernel.o Video.o ====================================================== Part 1-6. °á·Ð ¿©·¯ºÐµéÀÇ C++ Ä¿³Î(Kernel.bin)Àº ¾î¶°ÇÑ ¿¡·¯µµ ¾øÀÌ ÄÄÆÄÀÏµÇ°í ¸µÅ©µÇ¾î¾ß ÇÕ´Ï´Ù. ±×·¸°Ô µÇ¾ú³ª¿ä ? ÃàÇÏÇÕ´Ï´Ù. (% edward : ÀÌ°Ô ¹«½¼ °á·ÐÀ̶ó°í -_-;;;) Part 2. C++ ÀÇ Global Object ¿Í Static Object Áö¿ø ÇÏ¿¡ µ¿ÀÛÇÏ´Â "Hello, world!" Ä¿³Î Part 2-1. Compiler Specific - Warning * ÇØ°áÃ¥ 1 - .ctor ¿Í .dtor ¼½¼Ç ÀÌ ¹æ¹ýÀº ¿ÀºêÁ§Æ® ÆÄÀÏÀ» À§ÇÑ .ctor ¿Í .dtor ¶ó´Â 2 °³ÀÇ ¼½¼ÇÀ» ÄÄÆÄÀÏ·¯¿¡ Ãß°¡ÇÏ´Â ¹æ¹ýÀÔ´Ï´Ù. ¸¸¾à¿¡ ¿©·¯ºÐµéÀÌ ÀÌ ÇØ°áÃ¥À» »ç¿ëÇÏ·Á ÇÑ´Ù¸é ¾Æ·¡ÀÇ 4 Step À» Âü°íÇϽñ⠹ٶø´Ï´Ù. ////////////////////////////////////////////////////////////// Step 1 - local scope ¿¡¼­ global scope ·Î Video ¿ÀºêÁ§Æ® ¿Å±â±â ////////////////////////////////////////////////////////////// ================================================ //Kernel.cpp #include "Video.h" Video vid ; //global variable int main(void) { vid.write("Hello, world!") ; } ================================================ ////////////////////////////////////////////////////////////// Step 2 - Kernel.cpp À» ·±Å¸ÀÓ Áö¿øÀ̳ª Ç¥ÁØ ¶óÀ̺귯¸® ¾øÀÌ freestanding ȯ°æ¿¡¼­ ÄÄÆÄÀÏ Çϱâ ////////////////////////////////////////////////////////////// ================================================ gxx -c Kernel.cpp -ffreestanding -nostdlib -fno-builtin -fno-rtti -fno-exceptions ================================================ (% edward : ¿É¼ÇÀº ÀüºÎ ÇÑ ¶óÀο¡ ÀÔ·ÂÇØ¾ß ÇÕ´Ï´Ù. ¹®¼­¿¡´Â Áö¸é»ó µÎ ¶óÀÎÀ¸·Î Ç¥±âÇß¾î¿ä.^^) ////////////////////////////////////////////////////////////// Step 3 - ¼½¼ÇÀÇ ³»¿ëÀ» º¸±âÀ§ÇÑ ¿ÀºêÁ§Æ® ´ýÇÁ Åø »ç¿ëÇϱâ ////////////////////////////////////////////////////////////// ================================================ objdump -h Kernel.o > Kernel.dis ================================================ (objdump ÀÇ °á°ú¸¦ Kernel.dis ¶ó´Â ÆÄÀÏ·Î ¸®´ÙÀÌ·º¼Ç) ////////////////////////////////////////////////////////////// Step 4 - ÅØ½ºÆ® ¿¡µðÅ͸¦ »ç¿ëÇÏ¿© Kernel.dis ÆÄÀÏ ¿­¾îº¸±â ////////////////////////////////////////////////////////////// ÆÄÀÏÀ» ¿­¾îº¸¸é ¾Æ·¡¿Í ºñ½ÁÇÑ ³»¿ëÀÌ ³ª¿À°Ô µÉ °Ì´Ï´Ù. ================================================= 7 .ctors 00000004 000000f4 000000f4 00000294 2**2 CONTENTS, ALLOC, LOAD, RELOC, DATA 8 .dtors 00000004 000000f8 000000f8 00000298 2**2 CONTENTS, ALLOC, LOAD, RELOC, DATA. ================================================= Part 2-2. ÄÚµå(The code) ÀÌÁ¦ ¿ì¸®´Â _main() ÇÔ¼ö¿Í _atexit() ÇÔ¼ö¸¦ ±¸ÇöÇÏ°Ô µÉ°Ì´Ï´Ù. ±×¸®°í ¿ì¸®ÀÇ ¸µÄ¿ ½ºÅ©¸³Æ®¿¡¼­ .ctor ¼½¼Ç¿¡ »ý¼ºÀÚ Æ÷ÀÎÅÍ ¸®½ºÆ®¸¦ »ý¼ºÇϰí, .dtor ¼½¼Ç¿¡´Â ¼Ò¸êÀÚ Æ÷ÀÎÅÍ ¸®½ºÆ®¸¦ »ý¼ºÇÒ °Í ÀÔ´Ï´Ù. ¾Ë¸² - ¸®½ºÆ®´Â ¿ì¼±¼øÀ§ ¼øÀ¸·Î Á¤·ÄµÇÁö ¾Ê½À´Ï´Ù. # source : Support.c ============================================================= //Support.c void _main() { // Walk and call the constructors in the ctor_list // the ctor list is defined in the linker script extern void (*_CTOR_LIST__)() ; //hold current constructor in list void (**constructor)() = &_CTOR_LIST__ ; //the first int is the number of constructors int total = *(int *)constructor ; //increment to first constructor constructor++ ; while(total) { (*constructor)() ; total-- ; constructor++ ; } } void _atexit() { //Walk and call the deconstructors in the dtor_list //the dtor list is defined in the linker script extern void (*_DTOR_LIST__)() ; //hold current deconstructor in list void (**deconstructor)() = &_DTOR_LIST__ ; //the first int is the number of deconstructors int total = *(int *)deconstructor ; //increment to first deconstructor deconstructor++ ; while(total) { (*deconstructor)() ; total-- ; deconstructor++ ; } } ============================================================= ============================================================= ; Loader.asm [BITS 32] ; protected mode [global start] [extern _main] ; this is in our C++ code [extern __main] ; this is in our C support code [extern __atexit] ; this is in our C support code start: call __main call _main ; call int main(void) from our C++ code call __atexit cli ; interrupts could disturb the halt hlt ; halt the CPU /* Link.ld */ OUTPUT_FORMAT("binary") ENTRY(start) SECTIONS { .text 0x100000 : { code = .; _code = .; __code = .; *(.text) . = ALIGN(4096); } .data : { __CTOR_LIST__ = .; LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) *(.ctors) LONG(0) __CTOR_END__ = .; __DTOR_LIST__ = .; LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) *(.dtors) LONG(0) __DTOR_END__ = .; data = .; _data = .; __data = .; *(.data) . = ALIGN(4096); } .bss : { bss = .; _bss = .; __bss = .; *(.bss) . = ALIGN(4096); } end = .; _end = .; __end = .; } ============================================================= Part 2-3. °á·Ð ÄÄÆÄÀϰú ¸µÅ©´Â Part 1¿¡¼­ Çß´ø°Í°ú µ¿ÀÏÇÕ´Ï´Ù. ¿©·¯ºÐÀº ÀÌÁ¦ºÎÅÍ ¿©·¯ºÐµéÀÌ ÀÛ¼ºÇÒ C++ Ä¿³Î¿¡¼­ Global °´Ã¼¿Í Static °´Ã¼¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. Part 3 ¿¡¼­´Â namespace std ¿¡ ÀÖ´Â ´Ü¼øÇÑ OStream Ŭ·¡½ºÀÇ ±¸Çö¿¡ ´ëÇØ º¸°Ô µÉ °ÍÀÔ´Ï´Ù. ±×¸®°í OStreamÀÇ global ÀνºÅϽº(instance) ÀÎ cout À» »ç¿ëÇÒ °ÍÀÔ´Ï´Ù. ======================================================================== * edward ÀÇ ¹®¼­ ÀÛ¼ºÈıâ À½ -_-;; ±×³É °£¸¸¿¡ Ä˽ŠTV ÆÇÀ» º¸´Ù°¡ ÇÒ ÁþÀÌ ¾ø¾î¼­ ... ³¢Àû ³¢Àû ÀÛ¾÷Çß½À´Ï´Ù. ÆÄÆ® 3 ºÎÅÍ´Â ¾îµ÷´ÂÁö ¾Èº¸ÀÌ´õ¶ó±¸¿ä ÀÛ¾÷ÇÏ´Ù°¡ ¸»¾Ò´ÂÁö º¸ÀÌÁú ¾Ê¾Æ¼­ ¿©±â±îÁö¸¸ Çß¾î¿ä. ¶Ç ½Ã°£ÀÌ ³ª¸é Àúµµ ¹®¼­¿¡ ´ëÇÑ Á»´õ ¼¶¼¼ÇÑ °ËÁõ ÀÛ¾÷À» ÇϰÚÁö¸¸ Àú´Â C++ À» µü Çѹø ¸¸Á®ºÃ½À´Ï´Ù... ´©±º°¡ÀÇ ºÎŹÀ» ¹Þ¾Æ¼­ °£´ÜÇÑ C++ ÇÁ·Î±×·¥À» ÀÛ¼ºÇغÃÀ»»Ó ±× ¿Ü¿¡´Â ¾Æ´Â ¹Ù°¡ ÀüÇô ¾øÀ¸¹Ç·Î ¿À·ù°¡ ÀÖÀ» ¼öµµ ÀÖ½À´Ï´Ù. ¿À·ù°¡ ÀÖ´Â ºÎºÐÀº ¸ÞÀÏ·Î º¸³» ÁÖ½Ã¸é °¨»çÇϰڽÀ´Ï´Ù. ======================================================================== ======================================================================== * Change Log (bout Documentation) - v 0.0.2 (2000.00.00) ========================================================================