5.1. Linux

5.1.1. GCC ·ÎÀÇ ¸µÅ· : Linking to GCC

¸¸¾à ¿©·¯ºÐÀÌ 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 ¸ÅÅ©·Î¸¦ ¾î¶»°Ô Á¤ÀÇÇϰí ÀÖ´ÂÁöµµ ÂüÁ¶Ç϶ó.

5.1.2. ELF ¿Í a.out ¹®Á¦

¸î¸î 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);
±×·¸°Ô Çϸé, foo() C ÇÔ¼ö´Â ½ÇÁ¦·Î ¾î¼Àºí¸®¿¡¼­´Â bar À̶ó°í ºÒ¸®¿ì°Ô µÉ °ÍÀÌ´Ù.

binutils ÆÐŰÁöÀÇ objcopy À¯Æ¿¸®Æ¼°¡ ¿©·¯ºÐÀÇ a.out ¿ÀºêÁ§Æ®¸¦ ELF Çü½ÄÀÇ ¿ÀºêÁ§Æ® ÆÄÀÏ·Î º¯È¯ÇØ ÁÙ ¼ö ÀÖÀ½À» ÁÖ¸ñÇ϶ó. ±×¸®°í, ±× ¹Ý´ëÀÇ Àϵµ °¡´ÉÇÒ °ÍÀÌ´Ù. º¸´Ù ÀϹÝÀûÀ¸·Î À̾߱âÇÏÀÚ¸é, ±× À¯Æ¿¸®Æ¼´Â ´õ ¸¹Àº ÇüÅÂÀÇ ÆÄÀÏ Çü½Ä º¯È¯µµ ÇØ ÁÙ °ÍÀÌ´Ù.

5.1.3. Direct Linux syscalls

¿©·¯ºÐÀº Á¾Á¾ C library (libc) ¸¦ »ç¿ëÇÏ´Â °ÍÀÌ À¯ÀÏÇÑ ¹æ¹ýÀ̸ç, Á÷Á¢ÀûÀÎ ½Ã½ºÅÛ ÄÝÀº º°·Î ÁÁÁö ¾Ê´Ù´Â ¸»À» µéÀ» °ÍÀÌ´Ù. À̰ÍÀº »ç½ÇÀÌ´Ù. ±×·¯³ª ÀϹÝÀûÀ¸·Î ¿©·¯ºÐÀº libc °¡ ½Å¼º½ÃµÇ°í ÀÖÁö ¾Ê´Ù´Â °Í°ú, ´ëºÎºÐÀÇ °æ¿ì libc ´Â ¸î°¡Áö üũ¸¸ Çϰí, Ä¿³ÎÀ» È£ÃâÇÑ ÈÄ, errno º¯¼ö¸¦¼¼ÆÃÇÒ »ÓÀ̶ó´Â °ÍÀ» ¾Ë¾Æ¾ß ÇÑ´Ù. ¿©·¯ºÐÀº ¿©·¯ºÐÀÇ ÇÁ·Î±×·¥¿¡¼­µµ ÀÌ¿Í °°Àº °ÍÀ» ½±°Ô ÇÒ ¼ö ÀÖ´Ù (¸¸¾à ¿©·¯ºÐÀÌ ±×°ÍÀ» ÇÊ¿ä·Î ÇÑ´Ù¸é). ±×¸®°í ¿©·¯ºÐÀÌ °øÀ¯ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù´Â ÀÌÀ¯¸¸À¸·Îµµ ¿©·¯ºÐÀÇ ÇÁ·Î±×·¥Àº ¸î½Ê¹è ´õ Å©±â°¡ ÁÙ¾îµé °ÍÀ̸ç, ¼öÇ༺´É ¶ÇÇÑ ´õ ÁÁ¾ÆÁú °ÍÀÌ´Ù. libc À» ¾î¼Àºí¸® ÇÁ·Î±×·¡¹Ö¿¡¼­ »ç¿ëÇϰųª ÇÏÁö ¾Ê°Å³ª ÇÏ´Â ¹®Á¦´Â ½Ç¿ëÀûÀÎ ¹®Á¦¶ó±â º¸´Ù´Â ±âÈ£³ª ½Å³ä¿¡ °üÇÑ ¹®Á¦ÀÌ´Ù. Linux ´Â POSIX ȣȯÀ» ¸ñÇ¥·Î Çϰí ÀÖ´Ù´Â °ÍÀ» ±â¾ïÇ϶ó. ±×¸®°í, libc ´Â ±×·¯ÇÑ ¸ñÇ¥¸¦ ¸¸Á·ÇÑ´Ù. À̰ÍÀº libc system call ÀÇ °ÅÀÇ ¸ðµç ¹®¹ýÀÌ Ä¿³ÎÀÇ ½Ã½ºÅÛ ÄÝÀÇ ½ÇÁ¦ ¹®¹ý°ú Á¤È®È÷ ÀÏÄ¡ÇÑ´Ù´Â ¶æÀÌ´Ù. ±×·¯³ª GNU libc(glibc) ´Â ¹öÁ¯¾÷ÀÌ µÇ¾î °¥¼ö·Ï ´õ ´À·ÁÁö°í ÀÖ´Ù. ¶ÇÇÑ ¸Þ¸ð¸®µµ ´õ ¸¹ÀÌ Àâ¾Æ¸Ô¾î °¡°í ÀÖ´Ù. ±×·¡¼­ Á÷Á¢ÀûÀÎ ½Ã½ºÅÛ ÄÝÀÌ ²Ï³ª ½Ç¿ëÀûÀÎ °ÍÀÌ µÇ¾î°¡°í ÀÖ´Ù. ±×·¸Áö¸¸... libc ¸¦ »ç¿ëÇÏÁö ¾ÊÀ½À¸·Î½á »ý±â´Â ÁÖµÈ ºÎÀÛ¿ë(?, drawback) Àº ¾Æ¸¶µµ ¿©·¯ºÐÀÌ ¸î¸îÀÇ libc ÀÇ Æ¯Á¤ ÇÔ¼öµé(½Ã½ºÅÛ ÄÝ wrapper °¡ ¾Æ´Ñ)À» Á÷Á¢ ±¸ÇöÇÒ Çʿ䰡 »ý±æÁöµµ ¸ð¸¥´Ù´Â °ÍÀÌ´Ù. (À̸¦Å׸é, printf() °ú °°Àº...) ±×¸®°í, ¿©·¯ºÐÀÌ libc ¸¦ »ç¿ëÇÏÁö ¾Ê±â·Î °áÁ¤Çß´Ù¸é, ´ç¿¬È÷ ¿©·¯ºÐÀº ±×·¸°Ô ÇÒ °¢¿À(?)°¡ µÇ¾î ÀÖ´Â °ÍÀÌ´Ù. ±×·¸Áö ¾ÊÀº°¡?

¿©±â¿¡ Á÷Á¢ÀûÀÎ ½Ã½ºÅÛ ÄÝÀ» ÇÏ´Â °ÍÀÇ µæ°ú ½ÇÀÌ ³ª¿­µÇ¾î ÀÖ´Ù :

À̵æ:

¼ÕÇØ:

¸¸¾à ¿©·¯ºÐÀÌ ¹æ±Ý ¾ð±ÞÇÑ µæ½ÇµéÀ» ½É»ç¼÷°í ÇßÀ¸¸ç, ±×·¡µµ ¿©ÀüÈ÷ direct ½Ã½ºÅÛ ÄÝÀ» »ç¿ëÇϱ⸦ ¿øÇÑ´Ù¸é, ¾Æ·¡¿¡ ¸î°¡Áö Á¶¾ðÀ» ÷ºÎÇØ ÁÖ°Ú´Ù :

±âº»ÀûÀ¸·Î, ½Ã½ºÅÛ ÄÝÀº 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/).

5.1.4. ¸®´ª½º¿¡¼­ÀÇ Çϵå¿þ¾î ÀÔÃâ·Â

¿©·¯ºÐÀÌ ¸®´ª½º¿¡¼­ Á÷Á¢ 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 ÀζóÀÎ ¾î¼Àºí¸®¿Í ¸ÅÅ©·Î¸¦ »ç¿ëÇÔÀ¸·Î½á Àüü¸¦ ¾î¼Àºí¸®·Î ÄÚµùÇÏ´Â °Íº¸´Ù È¿À²ÀûÀ¸·Î ÀÏÀ» ¼öÇàÇÒ ¼ö ÀÖ´Ù.

5.1.5. Accessing 16-bit drivers from Linux/i386

±×·¯ÇÑ ÀϵéÀº ÀÌ·ÐÀûÀ¸·Î °¡´ÉÇÏ´Ù (Áõ¸í : 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ºñÆ® Äڵ带 »ç¿ëÇϱâ Àü¿¡ ¹Ýµå½Ã ÇØ¾ß ÇÒ ÀϵéÀÌ ÀÖ´Ù :

´Ù½ÃÇѹø DOSEMU ÇÁ·ÎÁ§Æ®ÀÇ ¼Ò½ºµé¿¡ ³ª¿À´Â ³»¿ëµéÀ» ÁÖÀDZíÀÌ Àеµ·Ï ÇÏ¿©¶ó. ƯÈ÷, ¸®´ª½º/i386 ¿¡¼­ ELKS ¿Í °£´ÜÇÑ .COM ÇÁ·Î±×·¥µéÀ» µ¹¸± ¼ö ÀÖ´Â mini-emulator µéÀÇ ¼Ò½º¸¦ ÀÚ¼¼È÷ º¸µµ·Ï Ç϶ó.