· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
32bit ¿¡¼­ 64bit·Î ¼Ò½ºÈ£È¯À» À§ÇÑ °í·Á»çÇ× Á¤¸®

32bit ¿¡¼­ 64bit·Î ¼Ò½ºÈ£È¯À» À§ÇÑ °í·Á»çÇ× Á¤¸®

  • ÀÛ¼ºÀÚ
    Á¶ÀçÇõ (Mminzkn@minzkn.com)

  • °íÄ£°úÁ¤
    2007³â 6¿ù 17ÀÏ : óÀ½¾¸

°³¿ä

ÀÌ ³»¿ëÀº Á¦°¡ ±âÁ¸¿¡ ¸¸µé¾ú´ø ¿©·¯ ¼Ò½º(mzapi) µéÀ» 64bit ¿¡¼­ µ¿ÀÛÇϵµ·Ï Æ÷ÆÃÇϸ鼭 ¹ß»ýÇß´ø °í·Á»çÇ×µéÀ» Á¤¸®ÇÕ´Ï´Ù.

º¯¼öÇüÀÇ Å©±â´Â ¾î¶»°Ô ´Þ¶óÁö´Â°¡? 32bit ȯ°æ¿¡¼­ 64bit ȯ°æÀ¸·Î ¿Å°Ü°¡¸é¼­ ´Þ¶óÁø º¯¼öÇüÀº ´ÙÀ½°ú °°½À´Ï´Ù.

  1. int ÇüÀº 32bit ¸¦ À¯ÁöÇÕ´Ï´Ù.
  2. short ÇüÀº 16bit ¸¦ À¯ÁöÇÕ´Ï´Ù.
  3. long ÇüÀº 32bit¿¡¼­ 64bit·Î È®ÀåµË´Ï´Ù.
  4. long long ÇüÀº 64bit ¸¦ À¯ÁöÇÕ´Ï´Ù.
  5. pointer ÇüÀº 32bit ¿¡¼­ 64bit·Î È®Àåµö´Ï´Ù.
  6. long double ÇüÀÌ 12bytes ¿¡¼­ 16bytes·Î È®ÀåµË´Ï´Ù.
  7. size_t°ú ssize_t ÇüÀÌ 32bit ¿¡¼­ 64bit ·Î È®ÀåµË´Ï´Ù.
  8. ÀÌ¿Í °ü·ÃµÈ typedef ¹® ¿ª½Ã È®ÀåµË´Ï´Ù.

64bit linux platforms

 Architecture    | uname -m | Size | Endian | Libpath | Miscellaneous
 ----------------+----------+------+--------+---------+--------------------------------
 Alpha           | alpha    | LP64 | little | lib     |
 AMD64           | x86_64   | LP64 | little | lib64   | executes x86 code natively
 IPF             | ia64     | LP64 | little | lib     | executes x86 code via emulation
 MIPS64          | mips64   | LP64 | both   | lib64   | executes MIPS code natively
 PowerPC64       | ppc64    | LP64 | big    | lib64   | executes PowerPC code natively
 Sparc64         | sparc64  | LP64 | big    | lib64   | executes Sparc code natively
 PA-RISC64       | parisc64 | LP64 | big    | -       | only kernel support, no 64-bit
                 |          |      |        |         | executes 32-bit PA-RISC code
 zSeries (s390x) | s390x    | LP64 | big    | lib64   | executes s390 code natively


¹®Á¦°¡ µÇ´Â ÄÚµåµé

Å©±â°¡ ´Ù¸¥ º¯¼öÇü¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ »ç¿ëÇÑ °æ¿ì (½ºÅúر«°¡ ¿ì·ÁµÇ´Â °æ¿ì)

getsockoptÀÇ sizeÀÎÀÚ°¡ socklen_t ·Î Á¤ÀǵǴ °æ¿ì ¾Æ·¡ÀÇ ÄÚµå´Â s_socklen º¯¼ö¸¦ int·Î Á¤ÀÇÇÑ°Í¿¡¼­ ¹®Á¦°¡ ¹ß»ýÇÒ¼ö ÀÖ½À´Ï´Ù.
int s_socklen;
s_result = getsockopt(s_socket, s_level, s_optname, &s_optval, &s_socklen);


ÀÌ°ÍÀº ´ÙÀ½°ú °°ÀÌ º¯°æµÇ¾î¾ß ÇÕ´Ï´Ù. ÀÌ°ÍÀº int¿Í socklen_t ´Â Å©±â°¡ ´Ù¸£±â ¶§¹®ÀÔ´Ï´Ù.
socklen_t s_socklen;
s_result = getsockopt(s_socket, s_level, s_optname, &s_optval, &s_socklen);


Á¶°Ç½ÄÀ» int ·Î ¹Þ´Â ÇÔ¼ö¿¡ Æ÷ÀÎÅ͸¦ ³Ñ°ÜÁÙ°æ¿ì (ÄÄÆÄÀÏ·¯ °æ°í) ÀϹÝÀûÀ¸·Î ´ÙÀ½°ú °°Àº ÇÔ¼ö°¡ ÀÖÀ»¶§
void my_assert(int s_expression)
{
 if(!s_expression)return;
 (void)fprintf(stderr, "assert....\n");
}


À§¿Í °°Àº ÇÔ¼ö¿¡ Á¶°Ç¹®À» »ç¿ëÇÒ¶§
void *s_ptr = NULL;
my_assert(s_ptr);


´ÙÀ½°ú °°ÀÌ º¯°æÇÏ¿©¾ß ÇÕ´Ï´Ù. ÀÌ°ÍÀº Æ÷ÀÎÅÍ°¡ int Çü°ú ´Ù¸¥ Å©±âÀ̹ǷΠÆ÷ÀÎÅÍ´Â int·Î casting µÇ¸é¼­ À߸®°Ô µÇ°í NULLÆ÷ÀÎÅÍ°¡ ¾Æ´Ô¿¡µµ ÇÏÀ§ 32bit°¡ 0Àΰæ¿ì my_assert ´Â ÀǵµÇÏÁö ¾ÊÀº µ¿ÀÛÀ» ÇÒ¼ö Àֱ⠶§¹®ÀÔ´Ï´Ù.
void *s_ptr = NULL;
my_assert(s_ptr != NULL);


dword Á¤ÀÇ (¸¸¾à ÀÌ·¸°Ô ½á¿Ô´Ù¸é..)

´ÙÀ½°ú °°ÀÌ my_DWORD¸¦ Á¤ÀÇÇÏ¿© »ç¿ëÇß´Ù¸é
#define my_DWORD unsigned long int

´ÙÀ½°ú °°ÀÌ º¯°æÇÏ¿©¾ß ÇÕ´Ï´Ù.
#define my_DWORD unsigned int


x86°è¿­ ¾î¼Àºí¸® ȣȯ¼º (¾È¹Ù²ãµµ µ¿ÀÛÇÑ´Ù.)

¿¹¸¦ µé¾î¼­ atomic exchange ¸¦ ´ÙÀ½°ú °°ÀÌ CÇÔ¼ö·Î ±¸ÇöÇß´Ù¸é ÀüÇô ¼öÁ¤ÇÒ ÇÊ¿ä¾øÀÌ ±×´ë·Î ÄÄÆÄÀÏ °¡´ÉÇÕ´Ï´Ù. ÇÏÁö¸¸ intÇüÀÌ ¾Æ´Ñ long ÇüÀ» »ç¿ëÇß´Ù¸é register ´Â eax, ebx, .. °¡ ¾Æ´Ñ rax, rbx, ... ·Î º¯°æÀ» °í·ÁÇØ¾ß ÇÕ´Ï´Ù.
int my_atomic_exchange(int * volatile s_to, int s_value)
{
 __asm volatile ("xchgl (%2), %0\n\t" : "=r"(s_value) : "0"(s_value), "r"(s_to) : "memory");
 return(s_value);
}


implementation ÇÔ¼öÀÇ À߸øµÈ °í·Á (size_t µîÀÇ Àǹ̸¦ ÀüÇô È°¿ëÇÏÁö ¸øÇÑ°æ¿ì Æ÷ÆÃÀÌ ½±Áö ¾ÊÀ»¼ö ÀÖÀ½.)

¿¹¸¦ µé¾î¼­ memcpy ¸¦ Çѹø °¨½Î¼­ ´ÙÀ½°ú °°ÀÌ ÀڽŸ¸ÀÇ ÇÔ¼ö¸¦ ¸¸µé¾ú´Ù¸é
void *my_memcpy(void *s_to, const void *s_from, int s_size)
{
 return(memcpy(s_to, s_from, s_size));
}


´ç¿¬È÷ s_size º¯¼ö´Â 64bit¸¦ ´ãÀ»¼ö ¾ø´Â ±×¸©À¸·Î Àü´ÞµÇ±â ¶§¹®¿¡ ¿øÇÏÁö ¾ÊÀº °á°ú¸¦ ¹ß»ýÇÒ¼ö ÀÖ½À´Ï´Ù. ¶§¹®¿¡ ´ÙÀ½°ú °°ÀÌ º¯°æµÇ¾î¾ß ÇÕ´Ï´Ù.
void *my_memcpy(void *s_to, const void *s_from, size_t s_size)
{
 return(memcpy(s_to, s_from, s_size));
}


size_t, ssize_t ÀÇ ¿ëµµ¸¦ ÀüÇô Áß¿äÇÏ°Ô »ý°¢Áö ¾ÊÀº °³¹ßÀÚ¶ó¸é ÀÌ ¹®Á¦·Î 64bit Æ÷Æÿ¡ ÁÂÀýÀ» °ÞÀ»¼öµµ ÀÖ½À´Ï´Ù. °í·ÁÇÏÁö ¾ÊÀº °³¹ßÀںеéÀº À§ÀÇ ¿¹Á¦Ã³·³ memcpy ¿¡¼­º¸´Ù´Â memory offset ¿¬»ê¿¡¼­ ÈÄȸÇÒ¼ö ÀÖ½À´Ï´Ù.

Á¤·Ä

±âÁ¸¿¡´Â ±¸Á¶Ã¼ÀÇ sizeof() ¿¡ ÀÇÇÑ Á¤·ÄµÈ °ªÀÌ º¸Åë 4byte align·Î »ç¿ëµÇ¾úÀ¸³ª ÀÌ°ÍÀº ÀÌÁ¦ ±âº»°ªÀ¸·Î ¹ÏÀ»¼ö ¾ø½À´Ï´Ù. ÀÌÁ¦´Â º¸Åë 8byte align ÀÌ ±âº»°ªÀ¸·Î »ç¿ëµË´Ï´Ù. ¶§¹®¿¡ ¹Ýµå½Ã ÀǵµÀûÀ¸·Î alignÀ» ÇØ¾ß µÇ´Â °æ¿ì¶ó¸é ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºµÇ¾î¾ß ÇÕ´Ï´Ù. (ÀÌ°ÍÀº »·ÇÑ ³»¿ëÀÌÁö¸¸ ±×°ÍÀ» À̾߱â ÇÏ·Á°í ÇÑ°ÍÀÌ ¾Æ´Ï°í ½ÅÁßÇÑ library °³¹ßÀÚ¶ó¸é ¸ðµç ±¸Á¶Ã¼´Â ¸í½ÃÀûÀ¸·Î align À» ÁöÁ¤ÇØÁà¾ß µÉ¼ö ÀÖ´Ù´Â °ÍÀ» ¸»ÇÕ´Ï´Ù.)
#pragma pack(push,8)
struct ts_my_struct
{
 unsigned char b;
 unsigned short w;
 unsigned int d;
 unsigned long d;
 unsigned long long q;
 long double paragraph;
}
#pragma pack(pop)

predefine À¸·Î 64bit ¸¦ °ËÃâ

°¢ architecture º° predefineÀÇ Á¾·ù°¡ ¸¹¾Æ¼­ °£´ÜÇÏ°Ô °ËÃâÇÒ¼ö ÀÖ´Â ³»¿ëÀº ¾Æ´ÏÁö¸¸ Á¦°¡ Áö±Ý±îÁö Æ÷ÆÃÇÑ architecture´Â ´ÙÀ½°ú °°ÀÌ ÇÏ¿© °ËÃâÇÏ¿´½À´Ï´Ù. »ç½Ç ÀÌ°ÍÀÌ ¸ðµÎ ¿Ïº®ÇÏ°Ô °ËÃâÇÑ´Ù°í ÇÒ¼ö´Â ¾ø½À´Ï´Ù. µé¾îº¸Áöµµ ¸øÇÑ architectureµµ ¸¹À¸´Ï±î..
#if defined(__x86_64__) || defined(__ia64__) || defined(_M_AMD64) || defined(_M_IA64) || defined(_WIN64) || defined(__alpha__) || defined(__s390__) /* ... */
 /* ¿À~ ³ª 64bit ¿¡¼­ ÄÄÆÄÀÏ µÇ³×.. ¾îÇã ¿ä·¸°Ô ó¸®ÇÏÀÚ~ */
#endif


ij½¬(cache) Á¶Á¤

gcc »ç¿ëÀÚ¶ó¸é 64bit ¿¡¼­ º¸´Ù ³ôÀº ¼º´ÉÀ» À§ÇÏ¿© __builtin_expect((long)(m_expression),(long)(m_value)) ³»ÀåÇÔ¼öµµ Çѹø °ËÅäÇغ¸½Ã¸é ÁÁÀ»°Í °°½À´Ï´Ù. ÀÌ°ÍÀº Á¶°Ç½ÄÀÌ °ÅÀÇ ½ÇÇàµÇÁö ¾ÊÀ» È®·ü ¶Ç´Â ½ÇÇàµÉ È®·üÀ» Á¶Á¤ÇÔÀ¸·Î½á ÄÄÆÄÀÏ·¯·Î ÇÏ¿©±Ý Cache ÀÇ ÃÖÀû»ç¿ëÀ» À§ÇÑ ÃÖÀûÈ­°¡ °¡´ÉÇØÁöµµ·Ï À¯µµµÉ¼ö ÀÖ½À´Ï´Ù. 64bit ±â°è¾î Äڵ带 º¸½Ã¸é ÀÌ·¯ÇÑ Cache ¸¦ È¿°úÀûÀ¸·Î »ç¿ëÇÒ¼ö ÀÖµµ·Ï ÇÏ´Â ¹æ¹ýÀÌ Á¦°øµÇ±â ¶§¹®¿¡ À߸¸ »ç¿ëÇÏ¸é ¼º´ÉÀÌ ±Ø´ëÈ­ µÉ°ÍÀ¸·Î »ý°¢µË´Ï´Ù.

ID
Password
Join
He who has imagination without learning has wings but no feet.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2008-06-25 16:00:37
Processing time 0.0046 sec