¸¸¾à ¿©·¯ºÐÀÌ C ¿Í ¾î¼Àºí¸®°¡ È¥ÇÕµÈ ÇÁ·ÎÁ§Æ®¸¦ ¼öÇàÇϰí ÀÖ´Ù¸é, Áö±Ý ¼Ò°³ÇϰíÀÚ ÇÏ´Â ¹æ¹ýÀ» ÃßõÇϰíÀÚ ÇÑ´Ù. ¸®´ª½º Ä¿³Î¿¡¼ .S ÀÇ È®ÀåÀÚ¸¦ °¡Áø ÆÄÀϵé Áß¿¡¼, gas °¡ ó¸®ÇÏ´Â (as86 ÀÌ Ã³¸®ÇÏ´Â ÆÄÀÏÀÌ ¾Æ´Ô!) ÆÄÀϵéÀ» ÅëÇØ¼ À¯¿ëÇÑ ¿¹Á¦¸¦ ¹ß°ßÇÒ ¼ö ÀÖ´Ù.
32ºñÆ®ÀÇ argument µéÀº ½ºÅÿ¡ Ǫ½ÃµÉ ¶§, 32ºñÆ®ÀÇ ±Ù°Å¸® ¹Ýȯ ÁÖ¼Ò (32-bit near return address) ÀÇ ÀºÎºÐ¿¡ ¿ª¼øÀ¸·Î Ǫ½ÃµÇ¾îÁø´Ù. µû¶ó¼, ±×°ÍµéÀÌ pop µÉ ¶§¿¡´Â ¿Ã¹Ù¸¥ ¼ø¼·Î pop µÇ¾îÁø´Ù. %ebp, %esi, %edi, %ebx ·¹Áö½ºÅ͵éÀº ÇÇÈ£ÃâÀÚ°¡ ÀúÀåÇÏ°Ô µÇ°í, ´Ù¸¥ ·¹Áö½ºÅ͵éÀº È£ÃâÀÚ°¡ ÀúÀåÇÏ°Ô µÈ´Ù. %eax ´Â °á°ú°¡ 32ºñÆ® À϶§ °á°ú¸¦ ÀúÀåÇÏ´Â ¿ëµµ·Î »ç¿ëµÇ¾îÁö°í, ¸¸¾à, °á°ú°¡ 64ºñÆ®¶ó¸é, ±×¶§´Â %edx:%eax ·¹Áö½ºÅÍ ½ÖÀÌ °á°ú¸¦ ÀúÀåÇϴµ¥ »ç¿ëµÈ´Ù.
FP stack ¿¡ ´ëÇØ¼´Â È®½ÇÇØ Àß ¸ð¸£°ÚÁö¸¸, ÀúÀÚ´Â °á°ú°¡ st(0) ¿¡ ÀúÀåµÇ°í, ½ºÅà Àüü°¡ È£ÃâÀÚ°¡ ÀúÀåÇÏ´Â ¿ëµµ·Î ¾²ÀÎ´Ù°í »ý°¢ÇÑ´Ù.
GCC °¡ ·¹Áö½ºÅ͵éÀÇ ¿ëµµ¸¦ ¹Ì¸® ÁöÁ¤Çؼ À§¿¡¼ ¼³¸íÇÑ È£Ãâ ±ÔÄ¢À» ¼öÁ¤ÇÏ´Â ¿É¼ÇÀ» °¡Áö°í ÀÖ´Ù´Â °ÍÀ» ÀØÁö ¾Êµµ·Ï Ç϶ó. ÀÚ¼¼ÇÑ ³»¿ëÀº i386 .info ÆäÀÌÁö¸¦ ÂüÁ¶Ç϶ó.
¿©·¯ºÐÀº GCC ÀÇ Ç¥ÁØ ÇÔ¼ö È£Ãâ ±ÔÄ¢À» µû¸£´Â ÇÔ¼ö¸¦ À§Çؼ cdecl À̳ª regparm(0) attribute ¸¦ ¼±¾ðÇØ¾ß¸¸ ÇÑ´Ù´Â °ÍÀ» ±â¾ïÇ϶ó. GCC info ÆäÀÌÁöÀÇ C Extensions::Extended Asm:: ¼½¼ÇÀ» ÂüÁ¶Ç϶ó. ¶ÇÇÑ, Linux °¡ asmlinkage ¸ÅÅ©·Î¸¦ ¾î¶»°Ô Á¤ÀÇÇϰí ÀÖ´ÂÁöµµ ÂüÁ¶Ç϶ó.
¸î¸î C ÄÄÆÄÀÏ·¯µéÀº ¹ØÁÙ ¹®ÀÚ¸¦ ´Ù¸¥ ½Éº¼µé º¸´Ù ¸ÕÀú È®ÀåÇÑ´Ù. ´Ù¸¥ ÄÄÆÄÀÏ·¯´Â ±×·¸°Ô ÇÏÁö ¾ÊÁö¸¸ (¿ªÀÚ ÁÖ : ¿ø¹®ÀÇ ³»¿ëÀº Some C compilers prepend an underscore before every symbol, while others do not. ÀÔ´Ï´Ù)
Linux ÀÇ a.out GCC ´Â ±×·¯ÇÑ È®ÀåÀ» ÇÑ´Ù. ±×·¸Áö¸¸, ELF GCC ´Â ÇÏÁö ¾Ê´Â´Ù.
¿©·¯ºÐÀÌ ±×·¯ÇÑ Æ¯¼ºÀ» ±Øº¹ÇÒ Çʿ䰡 ÀÖ´Ù¸é, ÇöÁ¸ÇÏ´Â ÆÐŰÁöµéÀº ¾î¶»°Ô ÇÏ´ÂÁö¸¦ ÂüÁ¶Ç϶ó. ¿¹¸¦ µé¾î, ¿À·¡µÈ ¸®´ª½ºÀÇ ¼Ò½ºÆ®¸®³ª, ȤÀº Elk, qthreads, OCaml µî°ú °°Àº ÆÐŰÁö¸¦ ±¸Çؼ »ìÆìº¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
¿©·¯ºÐÀº ¶ÇÇÑ, ´ÙÀ½°ú °°Àº ¹®ÀåÀ» »ðÀÔÇÔÀ¸·Î½á ÇÔÃàµÈ(implicit) C -> asm ÀÇ renaming ±ÔÄ¢À» override ÇÒ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù.
void foo asm("bar") (void); |
binutils ÆÐŰÁöÀÇ objcopy À¯Æ¿¸®Æ¼°¡ ¿©·¯ºÐÀÇ a.out ¿ÀºêÁ§Æ®¸¦ ELF Çü½ÄÀÇ ¿ÀºêÁ§Æ® ÆÄÀÏ·Î º¯È¯ÇØ ÁÙ ¼ö ÀÖÀ½À» ÁÖ¸ñÇ϶ó. ±×¸®°í, ±× ¹Ý´ëÀÇ Àϵµ °¡´ÉÇÒ °ÍÀÌ´Ù. º¸´Ù ÀϹÝÀûÀ¸·Î À̾߱âÇÏÀÚ¸é, ±× À¯Æ¿¸®Æ¼´Â ´õ ¸¹Àº ÇüÅÂÀÇ ÆÄÀÏ Çü½Ä º¯È¯µµ ÇØ ÁÙ °ÍÀÌ´Ù.
¿©·¯ºÐÀº Á¾Á¾ C library (libc) ¸¦ »ç¿ëÇÏ´Â °ÍÀÌ À¯ÀÏÇÑ ¹æ¹ýÀ̸ç, Á÷Á¢ÀûÀÎ ½Ã½ºÅÛ ÄÝÀº º°·Î ÁÁÁö ¾Ê´Ù´Â ¸»À» µéÀ» °ÍÀÌ´Ù. À̰ÍÀº »ç½ÇÀÌ´Ù. ±×·¯³ª ÀϹÝÀûÀ¸·Î ¿©·¯ºÐÀº libc °¡ ½Å¼º½ÃµÇ°í ÀÖÁö ¾Ê´Ù´Â °Í°ú, ´ëºÎºÐÀÇ °æ¿ì libc ´Â ¸î°¡Áö üũ¸¸ Çϰí, Ä¿³ÎÀ» È£ÃâÇÑ ÈÄ, errno º¯¼ö¸¦¼¼ÆÃÇÒ »ÓÀ̶ó´Â °ÍÀ» ¾Ë¾Æ¾ß ÇÑ´Ù. ¿©·¯ºÐÀº ¿©·¯ºÐÀÇ ÇÁ·Î±×·¥¿¡¼µµ ÀÌ¿Í °°Àº °ÍÀ» ½±°Ô ÇÒ ¼ö ÀÖ´Ù (¸¸¾à ¿©·¯ºÐÀÌ ±×°ÍÀ» ÇÊ¿ä·Î ÇÑ´Ù¸é). ±×¸®°í ¿©·¯ºÐÀÌ °øÀ¯ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù´Â ÀÌÀ¯¸¸À¸·Îµµ ¿©·¯ºÐÀÇ ÇÁ·Î±×·¥Àº ¸î½Ê¹è ´õ Å©±â°¡ ÁÙ¾îµé °ÍÀ̸ç, ¼öÇ༺´É ¶ÇÇÑ ´õ ÁÁ¾ÆÁú °ÍÀÌ´Ù. libc À» ¾î¼Àºí¸® ÇÁ·Î±×·¡¹Ö¿¡¼ »ç¿ëÇϰųª ÇÏÁö ¾Ê°Å³ª ÇÏ´Â ¹®Á¦´Â ½Ç¿ëÀûÀÎ ¹®Á¦¶ó±â º¸´Ù´Â ±âÈ£³ª ½Å³ä¿¡ °üÇÑ ¹®Á¦ÀÌ´Ù. Linux ´Â POSIX ȣȯÀ» ¸ñÇ¥·Î Çϰí ÀÖ´Ù´Â °ÍÀ» ±â¾ïÇ϶ó. ±×¸®°í, libc ´Â ±×·¯ÇÑ ¸ñÇ¥¸¦ ¸¸Á·ÇÑ´Ù. À̰ÍÀº libc system call ÀÇ °ÅÀÇ ¸ðµç ¹®¹ýÀÌ Ä¿³ÎÀÇ ½Ã½ºÅÛ ÄÝÀÇ ½ÇÁ¦ ¹®¹ý°ú Á¤È®È÷ ÀÏÄ¡ÇÑ´Ù´Â ¶æÀÌ´Ù. ±×·¯³ª GNU libc(glibc) ´Â ¹öÁ¯¾÷ÀÌ µÇ¾î °¥¼ö·Ï ´õ ´À·ÁÁö°í ÀÖ´Ù. ¶ÇÇÑ ¸Þ¸ð¸®µµ ´õ ¸¹ÀÌ Àâ¾Æ¸Ô¾î °¡°í ÀÖ´Ù. ±×·¡¼ Á÷Á¢ÀûÀÎ ½Ã½ºÅÛ ÄÝÀÌ ²Ï³ª ½Ç¿ëÀûÀÎ °ÍÀÌ µÇ¾î°¡°í ÀÖ´Ù. ±×·¸Áö¸¸... libc ¸¦ »ç¿ëÇÏÁö ¾ÊÀ½À¸·Î½á »ý±â´Â ÁÖµÈ ºÎÀÛ¿ë(?, drawback) Àº ¾Æ¸¶µµ ¿©·¯ºÐÀÌ ¸î¸îÀÇ libc ÀÇ Æ¯Á¤ ÇÔ¼öµé(½Ã½ºÅÛ ÄÝ wrapper °¡ ¾Æ´Ñ)À» Á÷Á¢ ±¸ÇöÇÒ Çʿ䰡 »ý±æÁöµµ ¸ð¸¥´Ù´Â °ÍÀÌ´Ù. (À̸¦Å׸é, printf() °ú °°Àº...) ±×¸®°í, ¿©·¯ºÐÀÌ libc ¸¦ »ç¿ëÇÏÁö ¾Ê±â·Î °áÁ¤Çß´Ù¸é, ´ç¿¬È÷ ¿©·¯ºÐÀº ±×·¸°Ô ÇÒ °¢¿À(?)°¡ µÇ¾î ÀÖ´Â °ÍÀÌ´Ù. ±×·¸Áö ¾ÊÀº°¡?
¿©±â¿¡ Á÷Á¢ÀûÀÎ ½Ã½ºÅÛ ÄÝÀ» ÇÏ´Â °ÍÀÇ µæ°ú ½ÇÀÌ ³ª¿µÇ¾î ÀÖ´Ù :
À̵æ:
°¡´ÉÇÑÇÑ ÄÚµåÀÇ Å©±â¸¦ ÁÙÀÏ ¼ö ÀÖ´Ù
°¡´ÉÇÑ ÃÖ´ëÀÇ ¼Óµµ¸¦ ³¾ ¼ö ÀÖ´Ù.
¿©·¯ºÐÀÇ ÇÁ·Î±×·¥À̳ª ¶óÀ̺귯¸®¸¦ ¿©·¯ºÐÀÌ »ç¿ëÇϴ ƯÁ¤ ¾ð¾î³ª ¸Þ¸ð¸® ¿ä±¸»çÇ× µî ¾î¶² °Í¿¡µµ Àû¿ëÇÒ ¼ö ÀÖ´Ù. Áï, full control À» ¾òÀ» ¼ö ÀÖ´Ù.
libc cruft ¿¡ ÀÇÇÑ °øÇذ¡ ¾ø´Ù(? ¿ø¹® : no pollution by libc cruft)
C ÀÇ ÇÔ¼ö È£Ãâ ±ÔÄ¢À¸·Î ÀÎÇÑ °øÇذ¡ ¾ø´Ù (¿ø¹® : no pollution by C calling conventions) (¸¸¾à ¿©·¯ºÐÀÌ ¿©·¯ºÐ ÀÚ½ÅÀÇ ¾ð¾î³ª ȤÀº ȯ°æÀ» °³¹ßÇϰí ÀÖ´Ù¸é)
Á¤Àû ¹ÙÀ̳ʸ®µéÀº ¿©·¯ºÐÀ» libc ¾÷±×·¹À̵峪 Å©·¡½¬¿Í ¹«°üÇÏ°Ô ÇØ ÁÙ °ÍÀÌ´Ù. ȤÀº, ½©ÀÇ #! ÀÎÅÍÇÁ¸®ÅÍ ÆÐ½º¿Íµµ ¹«°üÇÏ°Ô ÇØ ÁÙ °ÍÀÌ´Ù.
¿ø¹® : static binaries make you independent from libc upgrades or crashes, or from dangling #! path to an interpreter (and are faster)
Àç¹ÌÀÖ´Ù. (¿ø¹® : just for the fun out of it (don't you get a kick out of assembly programming?)
¼ÕÇØ:
¸¸¾à ¿©·¯ºÐÀÇ ÄÄÇ»ÅÍÀÇ ´Ù¸¥ ÇÁ·Î±×·¥ Áß libc ¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥ÀÌ ÀÖ´Ù¸é, libc ÀÇ Äڵ带 µÎ°³¾¿À̳ª °¡Áö´Â ÀÏÀº ¿©·¯ºÐÀÇ ¸Þ¸ð¸®¸¦ ³¶ºñÇÒ »ÓÀÌ´Ù.
¿©·¯ Á¤Àû ¹ÙÀ̳ʸ®¿¡¼ ºÒÇÊ¿äÇÏ°Ô ±¸ÇöµÈ ¼ºñ½ºµé ¿ª½Ã ¸Þ¸ð¸®ÀÇ ³¶ºñÀÏ µû¸§ÀÌ´Ù. ±×·¯³ª ¿©·¯ºÐÀÈ ¿©·¯ºÐÀÇ libc ´ëüǰÀ» ¸¸µé¾î¼ °øÀ¯ ¶óÀ̺귯¸®·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù.
¸ðµç°ÍÀ» ¾î¼Àºí¸®·Î ¸¸µå´Â °Í ´ë½Å, ¹ÙÀÌÆ®Äڵ峪 ¿öµåÄÚµå ȤÀº, structure interpreter ¿Í °°Àº °ÍÀ» »ç¿ëÇÔÀ¸·Î½á ÄÚµåÀÇ Å©±â°¡ °ý¸ñÇÒ ¸¸Å ÁÙ¾îµé °ÍÀÌ´Ù. (ÀÎÅÍÇÁ¸®ÅÍ ÀÚü´Â C ·Î ¸¸µéµç, ¾î¼Àºí¸®·Î ¸¸µéµç »ó°ü ¾ø´Ù.) ¿©·¯°³ÀÇ ¹ÙÀ̳ʸ®µéÀ» ÀÛ°Ô À¯ÁöÇÏ´Â ÃÖ»óÀÇ ¹æ¹ýÀº, ¿©·¯°³ÀÇ ¹ÙÀ̳ʸ® ÆÄÀÏÀ» À¯ÁöÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó, #! µî°ú °°Àº ½© ÀÎÅÍÇÁ¸®Å͸¦ »ç¿ëÇØ¼ ÀÎÅÍÇÁ¸®ÅÍ ÇÁ·Î¼¼½º¸¦ Çϳª ¸¶·ÃÇÏ´Â °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ¹æ¹ýÀ¸·Î OCaml Àº ¿öµåÄÚµå ¸ðµå (ÃÖÀûÈµÈ native code mode ¿Í ¹Ý´ë¸») ¿¡¼ µ¿ÀÛÇÑ´Ù. ¶ÇÇÑ, ±×·¸°Ô ÇÏ´Â °ÍÀº libc ¸¦ »ç¿ëÇÏ´Â °Í°úµµ ȣȯ¼ºÀÌ ÀÖ´Ù. ÀÌ ¹æ¹ýÀº Tom Christiansen ÀÌ Perl PowerTools ¿¡¼ À¯´Ð½º À¯Æ¿¸®Æ¼µéÀ» »õ·Î ±¸ÇöÇÑ ¹æ¹ýÀÌ´Ù. ¸¶Áö¸·À¸·Î, ÇϵåÄÚµåµÈ °æ·Î¿¡ ÀÇÇÑ ¿ÜºÎ ÆÄÀÏ¿¡ ÀÇÁ¸ÇÏÁö ¾Ê°í¼ ÄÚµåÀÇ Å©±â¸¦ ÁÙÀÌ´Â ¹æ¹ýÀ¸·Î, ´ÜÁö ÇϳªÀÇ ¹ÙÀ̳ʸ® ÆÄÀϸ¸ À¯ÁöÇϰí, ±× ÆÄÀÏ¿¡ ´ëÇÑ ¿©·¯°¡Áö À̸§ÀÇ hard ȤÀº soft ¸µÅ©¸¦ À¯ÁöÇÏ´Â ¹æ¹ýÀÌ ÀÖ´Ù : µ¿ÀÏÇÑ ¹ÙÀ̳ʸ® ÆÄÀÏÀº ÃÖÀûÀÇ °ø°£¿¡¼ ¿©·¯ºÐÀÌ ¿øÇÏ´Â ¸ðµç°ÍÀ» Á¦°øÇÒ °ÍÀ̸ç, ±×°Í¿¡´Â ºÒÇÊ¿äÇÑ ¼ºê·çƾÀ̳ª ȤÀº ÇÊ¿ä¾ø´Â ¹ÙÀ̳ʸ® Çì´õµµ ¾øÀ» °ÍÀÌ´Ù. ¹ÙÀ̳ʸ®´Â argv[0] ¿¡ ÀÇÇØ¼¸¸ ÇൿÀ» °áÁ¤ÇÒ °ÍÀÌ´Ù. ƯÁ¤ À̸§À¸·Î È£ÃâµÇÁö ¾ÊÀº °æ¿ì¿¡´Â µðÆúÆ®·Î ½©ÀÌ µÉ ¼öµµ ÀÖÀ¸¸ç, ¾Æ¸¶µµ ÀÎÅÍÇÁ¸®ÅÍ·Î µ¿ÀÛÇÏÁö ¾ÊÀ»¼öµµ ÀÖ´Ù.
(¿ø¹®À» ÇÔ²² °³Á¦ÇÕ´Ï´Ù : Finally, one last way to keep things small, that doesn't depend on an external file with a hardcoded path, be it library or interpreter, is to have only one binary, and have multiply-named hard or soft links to it: the same binary will provide everything you need in an optimal space, with no redundancy of subroutines or useless binary headers; it will dispatch its specific behavior according to its argv[0]; in case it isn't called with a recognized name, it might default to a shell, and be possibly thus also usable as an interpreter!
¿©·¯ºÐÀº ¸®´ª½º ½Ã½ºÅÛ ÄÝ À̿ܿ¡µµ libc °¡ Á¦°øÇÏ´Â ¸¹Àº ±â´ÉµéÀ» À¯¿ëÇÏ°Ô »ç¿ëÇÒ ¼ö ¾ø´Ù : Áï, ¸ÇÆäÀÌÁö ¼½¼Ç 3 ¿¡ ³ª¿À´Â ¿©·¯°¡Áö ±â´Éµé, À̸¦Å׸é, malloc, threads, locale, password, high-level network management µî°ú °°Àº °ÍÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù´Â À̾߱âÀÌ´Ù.
µû¶ó¼, ¿©·¯ºÐÀº libc ÀÇ ´ëºÎºÐÀ» »õ·Î ±¸ÇöÇØ¾ß ÇÒÁöµµ ¸ð¸£´Ù. Áï, printf() ·ÎºÎÅÍ malloc() °ú gethostbyname ±îÁöµµ Á÷Á¢ ±¸ÇöÇØ¾ß ÇÒ °ÍÀÌ´Ù. ±×·¸°Ô ÇÏ´Â °ÍÀº ºÒÇÊ¿äÇÑ ÀÏÀ̸ç, ¶§¶§·Î ¸Å¿ì Áö·çÇÑ ÀÛ¾÷ÀÌ µÉ ¼öµµ ÀÖ´Ù. ¸î¸î »ç¶÷µéÀÌ ¹ú½á "light" ¹öÁ¯ÀÇ libc ¸¦ ±¸ÇöÇØ µÎ¾ú´Ù´Â °Í¿¡ ÁÖ¸ñÇϰí, ±×·¯ÇÑ ÀÛ¾÷ÀÇ °á°ú¹°À» Ã¼Å©ÇØ º¸µµ·Ï Ç϶ó. (·¹µåÇÞÀÇ minilibc : Rick Hohensee's libsys, Felix von Leitner's dietlibc, Christian Fowelin's libASM, asmutils ÀÌ ÇÁ·ÎÁ§Æ®´Â ¼ø¼ö ¾î¼Àºí¸® libc ¸¦ °¡Áö°í ÀÛ¾÷Çϰí ÀÖ´Ù.)
Á¤Àû ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ¸é ¿©·¯ºÐÀº libc ¾÷±×·¹À̵峪 zlibc ÆÐŰÁö (gzip À¸·Î ¾ÐÃàµÈ ÆÄÀϵ鿡 ´ëÇØ¼ Åõ¸íÇÑ ¾ÐÃàÇ®±â¸¦ ¼öÇàÇØ ÁÖ´Â) ¿Í °°Àº libc add-on µé·ÎºÎÅÍ À̵æÀ» ¾òÀ» ¼ö ¾ø°Ô µË´Ï´Ù.
libc ¿¡ ÀÇÇØ¼ Ãß°¡µÈ ¸î¸î ÀνºÆ®·°¼ÇÀº ½Ã½ºÅÛ Äݰú ºñ±³Çؼ ¹Ï±âÁö ¾ÊÀ»¸¸Å ÀûÀº ¼ÓµµÀÇ ¿À¹öÇìµå¸¦ °¡Áø´Ù. ¸¸¾à ¼öÇà¼Óµµ°¡ Áß¿äÇÑ ¹®Á¦¶ó¸é, ¿©·¯ºÐÀÇ ÁÖµÈ ¹®Á¦´Â ¿©·¯ºÐÀÌ ½Ã½ºÅÛ ÄÝÀ» »ç¿ëÇϴµ¥ ÀÖÀ» °ÍÀ̸ç, ¿©·¯ºÐÀÌ »ç¿ëÇÏ´Â wrapper °¡ ±¸ÇöµÈ ¹æ½Ä¿¡´Â ¹®Á¦°¡ ¾øÀ» °ÍÀÌ´Ù.
L4Linux ¿Í °°Àº micro-kernel ¸®´ª½º ¹öÁ¯À» »ç¿ëÇÒ ¶§¿¡´Â ½Ã½ºÅÛ ÄÝÀÇ Ç¥ÁØ ¾î¼Àºí¸® API ¸¦ »ç¿ëÇÏ´Â °ÍÀÌ libc ÀÇ API ¸¦ »ç¿ëÇÏ´Â °Í º¸´Ù ÈξÀ ´À¸± ¼ö ÀÖ´Ù. ±×·¯ÇÑ ¸¶ÀÌÅ©·Î Ä¿³Î ¸®´ª½º ¹öÁ¯Àº ÀڽŸ¸ÀÇ º¸´Ù ºü¸¥ È£Ãâ ±ÔÄ¢À» °¡Áö°í ÀÖÀ¸¸ç, Ç¥ÁØ È£Ãâ ±ÔÄ¢À» »ç¿ëÇÏ´Â °æ¿ì ¸Å¿ì ³ôÀº convention translation (È£Ãâ ±ÔÄ¢ º¯È¯) ¿À¹öÇìµå°¡ °É¸± ¼ö ÀÖ´Ù. (L4Linux ´Â ±×¿¡ ¸Â´Â syscall API ¸¦ ÀÌ¿ëÇØ¼ ÀçÄÄÆÄÀÏµÈ libc ¿Í ÇÔ²² Á¦°øµÈ´Ù : ¹°·Ð, ¿©·¯ºÐÀº ¿©·¯ºÐÀÇ Äڵ带 Á¦°øµÈ API ¸¦ ÀÌ¿ëÇØ¼ ´Ù½Ã ÄÄÆÄÀÏ ÇØ¾ß ÇÒÁöµµ ¸ð¸¥´Ù)
¾Õ¼ ´Ù·ç¾ú´ø ÀϹÝÀûÀÎ ¼Óµµ ÃÖÀûÈ¿¡ ´ëÇÑ ÅäÀǸ¦ ÂüÁ¶Ç϶ó.
¸¸¾à¿¡ ½Ã½ºÅÛ ÄÝÀÌ ¿©·¯ºÐÀÌ º¸±â¿¡ ³Ê¹« ´À·Á º¸Àδٸé, ¿©·¯ºÐÀº userland ¿¡ ¸Ó¹°±âº¸´Ù´Â Ä¿³Î ¼Ò½º¸¦ Á÷Á¢ ÇØÅ·ÇØ¼ ¿øÇÏ´Â °á°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù.
¸¸¾à ¿©·¯ºÐÀÌ ¹æ±Ý ¾ð±ÞÇÑ µæ½ÇµéÀ» ½É»ç¼÷°í ÇßÀ¸¸ç, ±×·¡µµ ¿©ÀüÈ÷ direct ½Ã½ºÅÛ ÄÝÀ» »ç¿ëÇϱ⸦ ¿øÇÑ´Ù¸é, ¾Æ·¡¿¡ ¸î°¡Áö Á¶¾ðÀ» ÷ºÎÇØ ÁÖ°Ú´Ù :
¿©·¯ºÐÀº ¿©·¯ºÐÀÇ ½Ã½ºÅÛ ÄÝ ÇÔ¼öµéÀ» asm/unistd.h À» include Çϰí, Á¦°øµÈ ¸ÅÅ©·ÎµéÀ» »ç¿ëÇÔÀ¸·Î½á C ·Î Æ÷ÅͺíÇϰÔ(¾î¼Àºí¸®¸¦ »ç¿ëÇÑ Æ÷ÅͺíÇÏÁö ¾ÊÀº ÇüÅÂ¿Í ¹Ý´ëµÇ´Â) ±¸ÇöÇÒ ¼ö ÀÖ´Ù.
¿©·¯ºÐÀÌ ±×°ÍÀ» ´ëüÇÏ·Á°í Çϱ⠶§¹®¿¡, libc ¼Ò½º Äڵ带 ±¸Çؼ, ±×°ÍÀ» ÇØÅ·ÇØ º¸¶ó (and grok them) (±×¸®°í, ¸¸¾à ¿©·¯ºÐÀÌ ´õ Àß ÇÒ ¼ö ÀÖ´Ù°í »ý°¢ÇÑ´Ù¸é, libc ÀúÀڵ鿡°Ô Çǵå¹éÀ» ÇÒ ¼ö ÀÖµµ·Ï Ç϶ó!)
¿©·¯ºÐÀÌ ¿øÇÏ´Â ¸ðµç°ÍÀ» ÇØ ÁÖ´Â ¼ø¼ö ¾î¼Àºí¸® ÄÚµåÀÇ ¿¹Á¦·Î½á, ÀÌ ¹®¼ÀÇ µÞºÎºÐ¿¡ ³ª¿À´Â ¸®¼Ò½º ¸ñ·ÏÀ» ÂüÁ¶Ç϶ó.Linux assembly resources.
±âº»ÀûÀ¸·Î, ½Ã½ºÅÛ ÄÝÀº int 0x80 ÀνºÆ®·°¼ÇÀ» __NR_ ½Ã½ºÅÛ ÄÝ ¹øÈ£ ¸¦ (asm/unistd.h ÆÄÀϷκÎÅÍ.) eax ·¹Áö½ºÅÍ¿¡ ³Ö°í, ÆÄ¶ó¹ÌÅ͵é (six°³ ±îÁö) Àº °¢°¢ ebx, ecx, edx, esi, edi, ebp ·¹Áö½ºÅÍ¿¡ ³Ö¾î¼ È£ÃâÇÑ´Ù.
¸®ÅϰªÀº eax ·¹Áö½ºÅÍ¿¡ ´ã°ÜÁö°Ô µÇ¸ç, À½¼öÀÇ ¸®ÅϰªÀº ¿¡·¯°¡ ÀÖÀ½À» ³ªÅ¸³½´Ù. libc °¡ errno º¯¼ö¿¡ Áý¾î³Ö´Â °ª°ú ´ëÀÀµÇ´Â °ªÀÌ´Ù. »ç¿ëÀÚ ¿µ¿ªÀÇ ½ºÅÃÀº ¿µÇâÀ» ¹ÞÁö ¾Ê´Â´Ù. ±×·¡¼ ¿©·¯ºÐÀº ½Ã½ºÅÛ ÄÝÀ» ÇàÇÒ µ¿¾È¿¡ À¯È¿ÇÑ °ÍÀ» °¡Áú ÇÊ¿ä´Â ¾ø´Ù(?)
¿ø¹® : Result is returned in eax, negative result being an error, whose opposite is what libc would put into errno. The user-stack is not touched, so you needn't have a valid one when doing a syscall.
Âü°í: ebp ·¹Áö½ºÅÍ¿¡ ¿©¼¸¹øÂ° ÆÄ¶ó¹ÌÅ͸¦ ´ã¾Æ¼ ³Ñ°ÜÁÖ´Â °ÍÀº Linux 2.4 ¿¡¼ºÎÅÍ º¼ ¼ö ÀÖ´Ù. ±× ÀÌÀüÀÇ ¸®´ª½º ¹öÁ¯µéÀº ·¹Áö½ºÅÍ¿¡ ´ã±â´Â ´Ù¼¸°³ÀÇ ÆÄ¶ó¹ÌÅ͸¸ ÀνÄÇÑ´Ù.
Linux Kernel Internals, ¹®¼ÀÇ How System Calls Are Implemented on i386 Architecture? ÀåÀº ¿©·¯ºÐ¿¡°Ô º¸´Ù È®½ÇÇÑ °³³äÀ» Á¦°øÇÒ °ÍÀÌ´Ù.
ÇÁ·Î¼¼½º¸¦ óÀ½ ½ÃÀÛÇÒ ¶§ ³Ñ°ÜÁö´Â ÀÎÀڵ鿡 ´ëÇØ¼´Â, ÀϹÝÀûÀÎ ¿øÄ¢Àº ½ºÅÃÀÌ ÀÎÀÚÀÇ °¹¼ö¸¦ ÀúÀåÇÏ´Â argc ÀÇ °ª°ú, *argc ¸¦ ±¸¼ºÇÏ´Â Æ÷ÀÎÅÍÀÇ ¸®½ºÆ®¿Í NULL-terminated µÇ´Â variable=value ÀÇ È¯°æº¯¼ö (environ) °ªµéÀÇ ¸®½ºÆ®¸¦ ÀúÀåÇÑ´Ù´Â °ÍÀÌ´Ù.
¿ø¹® : As for the invocation arguments passed to a process upon startup, the general principle is that the stack originally contains the number of arguments argc, then the list of pointers that constitute *argv, then a null-terminated sequence of null-terminated variable=value strings for the environment.
º¸´Ù ÀÚ¼¼ÇÑ Á¤º¸¸¦ ¿øÇÑ´Ù¸é, ¸®¼Ò½º ¸®½ºÆ®¸¦ ÂüÁ¶Çؼ (: Linux assembly resources) libc ÀÇ C ½ºÅ¸Æ®¾÷ ÄÚµåÀÇ ¼Ò½º¸¦ ÀÐ¾î º¸¾Æ¶ó. (crt0.S or crt1.S) ȤÀº ¸®´ª½º Ä¿³ÎÀÇ ¼Ò½º¸¦ ÂüÁ¶Ç϶ó . (exec.c and binfmt_*.c in linux/fs/).
¿©·¯ºÐÀÌ ¸®´ª½º¿¡¼ Á÷Á¢ I/O Æ÷Æ®¿¡ÀÇ ÀÔÃâ·ÂÀ» ¼öÇàÇϰíÀÚ ÇÑ´Ù¸é, OS ÀÇ ÁßÀ縦 ÇÊ¿ä·Î ÇÏÁö ¾Ê´Â ¸Å¿ì °£´ÜÇÑ ÀÏÀÌ¾î¼ IO-Port-Programming ¹Ì´Ï ÇÏ¿ìÅõ¸¦ ÂüÁ¶ÇÏ¸é µÉ Á¤µµÀ̰ųª ¾Æ´Ï¸é Ä¿³Î µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ÇÊ¿ä·Î ÇØ¼ ¿©·¯ºÐÀÌ Ä¿³Î ÇØÅ·À̳ª µð¹ÙÀ̽º µå¶óÀ̹ö °³¹ßÀ̳ª, Ä¿³Î ¸ðµâ°ú °°Àº °Íµé¿¡ ´ëÇØ¼ ´õ ¸¹Àº °ÍÀ» ½ÀµæÇؾ߸¸ ÇÏ´Â °æ¿ìÀ̰ųª µÑÁß ÇϳªÀÇ °æ¿ìÀÏ °ÍÀÌ´Ù. (Ä¿³Î ¸ðµâÀ̳ª µð¹ÙÀ̽º µå¶óÀ̹ö¿¡ ´ëÇÑ °ÍµéÀº LDP ¿¡ ¸Å¿ì ÈǸ¢ÇÑ ÇÏ¿ìÅõµéÀÌ Á¸ÀçÇÑ´Ù.)
Ȥ½Ã ¿©·¯ºÐÀÌ ¿øÇÏ´Â °ÍÀÌ ±×·¡ÇÈ ÇÁ·Î±×·¡¹ÖÀÎ °æ¿ì, ´ÙÀ½ÀÇ ÇÁ·ÎÁ§Æ®µéÀ» ÂüÁ¶Ç϶ó : GGI ȤÀº XFree86 ÇÁ·ÎÁ§Æ®
¾î¶² »ç¶÷µéÀº ÀÛ°í, °ß°íÇÑ XFree86 µå¶óÀ̹öµéÀ» interperted domain-specific language ÀÎ GAL, ·Î °³¹ßÇÔÀ¸·Î½á º¸´Ù È¿°úÀûÀÎ °á°ú¸¦ ¾ò¾ú´Ù.
¿ø¹® : Some people have even done better, writing small and robust XFree86 drivers in an interpreted domain-specific language, GAL, and achieving the efficiency of hand C-written drivers through partial evaluation (drivers not only not in asm, but not even in C!). The problem is that the partial evaluator they used to achieve efficiency is not free software. Any taker for a replacement?
¾î·°Å³ª, ÀÌ ¸ðµç °æ¿ì¿¡µµ, ¿©·¯ºÐÀº linux/asm/*.h ¿¡ ÀÖ´Â GCC ÀζóÀÎ ¾î¼Àºí¸®¿Í ¸ÅÅ©·Î¸¦ »ç¿ëÇÔÀ¸·Î½á Àüü¸¦ ¾î¼Àºí¸®·Î ÄÚµùÇÏ´Â °Íº¸´Ù È¿À²ÀûÀ¸·Î ÀÏÀ» ¼öÇàÇÒ ¼ö ÀÖ´Ù.
±×·¯ÇÑ ÀϵéÀº ÀÌ·ÐÀûÀ¸·Î °¡´ÉÇÏ´Ù (Áõ¸í : DOSEMU °¡ ÇÁ·Î±×·¥µé¿¡°Ô ¼±ÅÃÀûÀ¸·Î Çϵå¿þ¾î Æ÷Æ® Á¢±Ù ±ÇÇÑÀ» ÁÖ´Â ¹æ¹ýÀ» º¸¶ó) ±×¸®°í, ÀúÀÚ´Â ¾îµò°¡ÀÇ ´©±º°¡°¡ ½ÇÁ¦·Î ±×·¯ÇÑ ÀÏÀ» Çß´Ù´Â ¼Ò¹®À» µé¾ú´Ù. (PCI µå¶óÀ̹ö¿¡¼Àΰ¡? ¾Æ´Ï¸é, VESA µå¶óÀ̹ö¿¡¼Àΰ¡... À½... ISA PnP ¿´´ø°¡... Àß ¸ð¸£°Ú´Ù) ¸¸¾à ¿©·¯ºÐÀÌ º¸´Ù Á¤È®ÇÑ Á¤º¸¸¦ °¡Áö°í ÀÖ´Ù¸é ȯ¿µÇÑ´Ù. (¿ªÀÚÁÖ : ¸ÞÀÏÀ» ´Þ¶ó´Â ¶æÀεí) ¾î·µç, Á¤º¸¸¦ ã±â ¸Å¿ì ÁÁÀº °÷Àº ¸®´ª½ºÀÇ Ä¿³Î ¼Ò½º¿Í DOSEMU ÀÇ ¼Ò½ºÀÌ´Ù. (±×¸®°í, DOSEMU repository ÀÇ ´Ù¸¥ ¸¹Àº ÇÁ·Î±×·¥µéÀÌ´Ù.) ¶ÇÇÑ, ¿©·¯°¡ÁöÀÇ ¸®´ª½ºÀÇ low-level ÇÁ·Î±×·¥µéÀÇ ¼Ò½ºµéµµ µµ¿òÀÌ µÉ °ÍÀÌ´Ù. (perhaps GGI if it supports VESA)
±âº»ÀûÀ¸·Î ¿©·¯ºÐÀº 16ºñÆ® º¸È£¸ðµå³ª ȤÀº vm86 ¸ðµå¸¦ ÀÌ¿ëÇØ¾ß¸¸ ÇÒ °ÍÀÌ´Ù.
ÀüÀÚ(16ºñÆ® º¸È£¸ðµå) ´Â ¼Â¾÷Àº ºñ±³Àû ½¬¿ì³ª ¼¼±×¸ÕÆ® Á¶ÀÛÀ̳ª Àý´ë ¼¼±×¸ÕÆ® ÁÖ¼ÒÁöÁ¤(segment 0 À» ÁÖ¼ÒÁöÁ¤ÇÏ´Â °Í°ú°°Àº) ÀÌ ¾ø´Â Àß µ¿ÀÛÇÏ´Â Äڵ带 ¸¸µé¾î¾ß¸¸ µ¿ÀÛÇÑ´Ù. ¿ì¿¬ÀÌ¶óµµ ¸ðµç »ç¿ëÇÏ´Â ¼¼±×¸ÕÆ®°¡ LDT(¿ªÀÚÁÖ : Local Descriptor Table, ÀÎÅÚ ¾ÆÅ°ÅØÃÄ¿¡¼ ¼¼±×¸ÕÆ®¿Í ³í¸® ÁÖ¼Ò, ¹°¸® ÁÖ¼ÒµéÀ» º¯È¯ÇÏ´Â µ¥ »ç¿ëµÇ´Â ÀڷᱸÁ¶) ¸¦ ¸¶¸® ¼Â¾÷ÇØ ¹ö¸®Áö ¾Ê´Â ÇÑÀº ±×·¯ÇÏ´Ù
¿ø¹® : The first is simpler to setup, but only works with well-behaved code that won't do any kind of segment arithmetics or absolute segment addressing (particularly addressing segment 0), unless by chance it happens that all segments used can be setup in advance in the LDT.
ÈÄÀÚ(vm86 ¸ðµå) ´Â 'vanilla 16-bit ȯ°æ' ¿¡¼ º¸´Ù ¸¹Àº ȣȯ¼ºÀ» Á¦°øÇϱâ´Â ÇÏÁö¸¸, ´õ º¹ÀâÇÑ Çڵ鸵ÀÌ ÇÊ¿äÇÏ´Ù.
µÎ °æ¿ì ¸ðµÎ ¿©·¯ºÐÀÌ 16ºñÆ® Äڵ带 »ç¿ëÇϱâ Àü¿¡ ¹Ýµå½Ã ÇØ¾ß ÇÒ ÀϵéÀÌ ÀÖ´Ù :
16ºñÆ® Äڵ忡¼ »ç¿ëµÉ Àý´ë ÁÖ¼ÒµéÀ» /dev/mem À¸·ÎºÎÅÍ ¿©·¯ºÐÀÇ ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò °ø°£À¸·Î ¸Þ¸ð¸® ¸Ê Ç϶ó. (À̸¦Å׸é, ROM À̳ª, ºñµð¿À ¹öÆÛ, DMA Ÿ°Ùµé, ±×¸®°í, memory-mapped I/O ¿Í °°Àº °Íµé)
LDT ¿Í(³ª) vm86 ¸ðµåÀÇ ¸ð´ÏÅ͸¦ ¼Â¾÷Ç϶ó (setup the LDT and/or vm86 mode monitor)
ÀûÀýÇÑ I/O Á¢±Ù ±ÇÇÑÀ» Ä¿³Î·ÎºÎÅÍ È¹µæÇ϶ó(À§ÀÇ ¼½¼ÇÀ» ÂüÁ¶Ç϶ó)
´Ù½ÃÇѹø DOSEMU ÇÁ·ÎÁ§Æ®ÀÇ ¼Ò½ºµé¿¡ ³ª¿À´Â ³»¿ëµéÀ» ÁÖÀDZíÀÌ Àеµ·Ï ÇÏ¿©¶ó. ƯÈ÷, ¸®´ª½º/i386 ¿¡¼ ELKS ¿Í °£´ÜÇÑ .COM ÇÁ·Î±×·¥µéÀ» µ¹¸± ¼ö ÀÖ´Â mini-emulator µéÀÇ ¼Ò½º¸¦ ÀÚ¼¼È÷ º¸µµ·Ï Ç϶ó.