· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
XIP »ìÆ캸±â

eXecute In Place (XIP) »ìÆ캸±â

ÀúÀÚ: Phil Wilshire <philwil AT earthlink.net>
¹ø¿ª: ±è³²Çü <namhyung AT gmail.com>


1. XIP (eXecute In Place)

XIP ´Â uClinux »ó¿¡¼­ È°¿ëÇÒ ¼ö ÀÖ´Â À¯¿ëÇÑ ¿É¼Ç ÁßÀÇ ÇϳªÀÌ´Ù. XIP ÀÇ ÀåÁ¡Àº µ¿ÀÏÇÑ ÇÁ·Î±×·¥À» ¿©·¯¹ø ½ÇÇàÇÒ ¶§ ÅؽºÆ® ¼¼±×¸ÕÆ®¸¦ º¹»çÇÒ ÇÊ¿ä°¡ ¾ø´Ù´Â °ÍÀÌ´Ù. ½ÇÁ¦·Î ÅؽºÆ® ¼¼±×¸ÕÆ®´Â Ç÷¡½Ã ¸Þ¸ð¸® »ó¿¡ Á¸ÀçÇÒ ¼ö Àֱ⠶§¹®¿¡ ½Ã½ºÅÛÀÇ RAM ¿¡ º¹»çµÉ ÇÊ¿ä°¡ ÀüÇô ¾ø´Ù. ÀÌ°ÍÀº Ä¿´Ù¶õ ÄÚµå ¿µ¿ªÀ» °¡Áö´Â ÇÁ·Î±×·¥ÀÌ ½Ã½ºÅÛ »ó¿¡ ¿©·¯ °³ÀÇ ÀνºÅϽº·Î ½ÇÇàµÇ´Â ŽºÅ©¿¡¼­ À¯¿ëÇÏ´Ù.

ÀÌ °æ¿ì °¢°¢ÀÇ ÇÁ·Î¼¼½º¿¡ ´ëÇؼ­ ¿ÀÁ÷ ½ºÅÃ, BSS, µ¥ÀÌÅÍ ¼¼±×¸ÕÆ®¸¸ÀÌ »õ·Î »ý¼ºµÉ ÇÊ¿ä°¡ ÀÖ´Ù. ±×¸®°í ÅؽºÆ® ¼¼±×¸ÕÆ® ¿µ¿ªÀº Ç÷¡½Ã ¸Þ¸ð¸®¿¡ Á¸ÀçÇϰųª, ¼º´ÉÀÌ ¹®Á¦°¡ µÇ´Â °æ¿ì ÆÄÀÏ ½Ã½ºÅÛÀÇ ³»¿ëÀ» RAM ¿¡ º¹»çÇÑ ÈÄ¿¡ ·¥ µð½ºÅ©·Î ¸¶¿îÆ®µÉ ¼ö ÀÖ´Ù. ¸¸¾à ÆÄÀÏ ½Ã½ºÅÛ ³»ÀÇ ½ÇÇà ÆÄÀÏÀÌ XIP ¸¦ Áö¿øÇϵµ·Ï ÄÄÆÄÀÏ µÇ¾ú°í Çì´õ ÆÄÀÏ¿¡¼­ XIP Ç÷¡±×¸¦ ¼³Á¤ÇÏ¿´À¸¸é ¿ÀÁ÷ ÇϳªÀÇ ÅؽºÆ® ¼¼±×¸ÕÆ®¸¸ÀÌ ·ÎµåµÇ¾î ½ÇÇàµÈ´Ù.


2. XIP ¿Í Ä¿³Î

Ä¿³ÎÀº Ç×»ó "XIP" ·Î µ¿ÀÛÇÑ´Ù. ¿©±â¼­ °¡Áú ¼ö ÀÖ´Â ´Ü ÇÑ°¡Áö Àǹ®Á¡Àº ¸¸¾à Ä¿³ÎÀÌ ½ÇÇàµÇ±â Àü¿¡ RAM À¸·Î º¹»çµÇ´Â °æ¿ì¿¡ ´ëÇÑ °ÍÀÌ´Ù. ÀÌ°ÍÀº ´ÙÀ½°ú °°Àº ¿©·¯°¡Áö Àϵ鿡 ÀÇÁ¸ÇÑ´Ù:

  • Ä¿³ÎÀÌ ÅؽºÆ® ¼½¼Ç¿¡ ÀÖ´Â º¯¼ö¸¦ »ç¿ëÇϴ°¡?
  • Ä¿³Î ¸µÅ© ¸ÊÀÌ ROM ³»ÀÇ Ä¿³ÎÀÇ º£À̽º·Î Á¤ÀǵǾî Àִ°¡?
  • Ä¿³Î ½ºÅ¸Æ® ¾÷ ÄÚµå (Ä¿³Î ¼Ò½º Æ®¸® ³»ÀÇ head.S ȤÀº crt0.s ÆÄÀÏ) °¡ Ä¿³ÎÀ» RAM À¸·Î Àç¹èÄ¡ (relocate) Çϵµ·Ï ¿ä±¸Çϴ°¡?

Àϼ³¿¡ µû¸£¸é ARM Ä¿³ÎÀÇ ¾î¶² º¯¼ö°¡ ÅؽºÆ® ¼¼±×¸ÕÆ® ³»¿¡ Àֱ⠶§¹®¿¡ ARM Ä¿³ÎÀ» ROM ¿¡¼­ ½ÇÇà½ÃÅ°±â ¾î·Æ´Ù°í ÇÑ´Ù. (TODO: ½Ã¹Ä·¹ÀÌÅ͸¦ ÅëÇØ È®ÀÎÇØ º¼ °Í!)

68K (Dragonball) ¿Í Coldfire Ä¿³ÎÀº ROM ¿¡¼­ ½ÇÇàµÉ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ¸ðµç ÃʱâÈ­ ÄÚµå´Â ³ªÁß¿¡ ¿©±â¿¡ »ç¿ëµÈ ¸Þ¸ð¸®¸¦ ´Ù½Ã »ç¿ëÇÒ ¼ö ÀÖ°Ô Çϱâ À§Çؼ­ RAM »ó¿¡ Á¸ÀçÇϵµ·Ï ÇØ¾ß ÇÑ´Ù (¾Æ´Ï¸é ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÏÁö ¾Êµµ·Ï ÇÑ´Ù).


3. XIP ¿Í »ç¿ëÀÚ Å½ºÅ©

»ç¿ëÀÚ Å½ºÅ©µµ XIP ·Î µ¿ÀÛÇϵµ·Ï Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. ÀÌ °æ¿ì ¿ÀÁ÷ µ¥ÀÌÅÍ, BSS, Àç¹èÄ¡ Á¤º¸¿Í ½ºÅà ¸¸ÀÌ °¢ ŽºÅ© °íÀ¯ÀÇ RAM ¿µ¿ª¿¡ Á¸ÀçÇÑ´Ù. ½ºÅà ¿µ¿ªÀÇ Å©±â°¡ Áõ°¡µÉ ¼ö ¾øÀ½¿¡ ÁÖÀÇÇ϶ó. ÀÌ Å©±â´Â elf2flt °¡ µ¿ÀÛÇÒ ¶§ °íÁ¤µÈ´Ù. ÀÌ°ÍÀº elf2flt ÇÁ·Î±×·¥À» ´Ù½Ã ½ÇÇàÇϰųª flthdr (¾Æ·¡ ÂüÁ¶)¸¦ »ç¿ëÇؼ­ º¯°æÇÒ ¼ö ÀÖ´Ù.

/!\ ÁÖÀÇ: ÀÌ Ç÷¡±×?¸¦ ÀÌ¿ëÇؼ­ XIP °¡ ¾Æ´Ñ Äڵ带 XIP ÄÚµå·Î º¯°æÇÒ ¼ö´Â ¾ø´Ù. ÇÏÁö¸¸ XIP Äڵ尡 (¿©·¯ ÀνºÅϽº°¡ ½ÇÇàµÉ ¶§) ÅؽºÆ® ¼½¼ÇÀ» °­Á¦·Î ·ÎµåÇϵµ·Ï ÇÒ ¼ö´Â ÀÖ´Ù.

¸ðµç flat ÆÄÀÏÀ» ·ÎµåÇÏ´Â Ä¿³Î ÄÚµå´Â ¿©±â¿¡ ÀÖ´Ù: linux-2.04.x/fs/binfmt_flat.c

±× Áß ÇÊ¿äÇÑ RAM ¿µ¿ªÀ» ÇÒ´çÇÏ´Â ºÎºÐÀÇ ÄÚµå´Â ´ÙÀ½°ú °°´Ù.

extra = MAX(bss_len + stack_len, relocs * sizeof(unsigned long));
 
down_write(&t->mm->mmap_sem);
realdatastart = do_mmap(0, 0, data_len + extra +
                        MAX_SHARED_LIBS * sizeof(unsigned long),
                        PROT_READ|PROT_WRITE|PROT_EXEC, 0, 0);
up_write(&t->mm->mmap_sem);


4. Flat ÆÄÀÏ Àç¹èÄ¡

·Î´õ ÇÁ·Î¼¼½º´Â µ¥ÀÌÅÍ ¼¼±×¸ÕÆ®°¡ ÇÒ´çµÈ ¿µ¿ªÀÌ º¯°æµÊ¿¡ µû¶ó ÇÊ¿äÇÑ ÀÛ¾÷µéÀ» ó¸®ÇØ¾ß ÇÑ´Ù. ÀÌ°ÍÀº MMU °¡ ¾ø±â ¶§¹®¿¡ ¹ß»ýÇÏ´Â ¹®Á¦ÀÌ´Ù. ¿ì¸®´Â ´Ü¼øÈ÷ "ÀûÀýÇÑ °÷¿¡ ¸Þ¸ð¸®°¡ Á¸ÀçÇϵµ·Ï" ÇÒ ¼ö ¾ø´Ù. Àç¹èÄ¡ ¸ñ·ÏÀº elf ÆÄÀÏÀÌ flat ÆÄÀÏ·Î º¯È¯µÉ ¶§ elf2flt ÇÁ·Î±×·¥¿¡ ÀÇÇØ Á¤ÇØÁø´Ù.

°í·ÁÇØ º¼ ¸¸ÇÑ µÎ°¡Áö Á¾·ùÀÇ Àç¹èÄ¡ ¹æ¹ýÀÌ ÀÖ´Ù.

4.1. Global Offset Table (GOT)

ÀÌ°ÍÀº »ç½Ç ÀÌ ¹®¼­¿¡¼­ ´Ù·ê ³»¿ëÀº ¾Æ´ÏÁö¸¸ ¾ð±ÞÇÒ °¡Ä¡°¡ ÀÖÀ¸¹Ç·Î ¾ê±âÇÏ°íÀÚ ÇÑ´Ù. ¸¸ÀÏ ÄÄÆÄÀϽà ¿É¼ÇÀ¸·Î GOT¸¦ È°¼ºÈ­ ½ÃÄ×´Ù¸é µ¥ÀÌÅÍ ¼¼±×¸ÕÆ®´Â GOT ¿µ¿ª¿¡¼­ ½ÃÀÛÇÏ°Ô µÈ´Ù. ÀÌ Å×ÀÌºí¿¡ ÀÖ´Â ÁÖ¼Ò °ªµéÀº µ¥ÀÌÅÍ ¼½¼ÇÀÇ ½ÇÁ¦ ÁÖ¼Ò¸¦ ¹Ý¿µÇÏ¿© Àç¹èÄ¡µÉ ÇÊ¿ä°¡ ÀÖ´Ù. GOT Å×À̺íÀÇ ¸¶Áö¸·Àº (Á¸ÀçÇÏ´Â °æ¿ì) -1 (0xFFFFFFFF) °ªÀ» °¡Áø´Ù.

¾Æ·¡ÀÇ ÄÚµå´Â binfmt_flat.c ÀÇ ³»¿ëÀ¸·Î GOT Å×À̺íÀ» ¾÷µ¥ÀÌÆ®ÇÏ´Â ºÎºÐÀÌ´Ù.

if (flags & FLAT_FLAG_GOTPIC) {
    for (rp = (unsigned long *)datapos; *rp != 0xffffffff;rp++) {
        unsigned long addr;
        if (*rp) {
            addr = calc_reloc(*rp, libinfo, id, 0);
            if (addr == RELOC_FAILED)
                return -ENOEXEC;
            *rp = addr;
        }
    }
}


4.2. ÄÚµå Àç¹èÄ¡ (Code RELOCS)

ÀÌ ¹æ¹ýÀº elf2flt ÇÁ·Î¼¼½º¿¡ ÀÇÇØ »ý¼ºµÈ Àç¹èÄ¡ Å×À̺íÀ» »ç¿ëÇÑ´Ù. ÁÖÀÇÇÒ Á¡Àº, ¸¸¾à ÆÄÀÏÀÌ XIP ·Î µ¿ÀÛÇϵµ·Ï µÇ¾î ÀÖ´Ù¸é ¿©·¯ °³ÀÇ ½ÇÇà ÆÄÀÏ¿¡¼­ °øÀ¯µÇ±â À§ÇØ ÅؽºÆ® ¼¼±×¸ÕÆ® ¿µ¿ªÀº ¿µÇâÀ» ÁÖÁö ¾Ê´Â´Ù´Â °ÍÀÌ´Ù.

Å×À̺íÀÇ °¢ ¿£Æ®¸®´Â Àç¹èÄ¡µÉ ÇÊ¿ä°¡ ÀÖ´Â ¿µ¿ªÀÇ ÁÖ¼Ò¸¦ ³ªÅ¸³½´Ù. Àç¹èÄ¡ÇÒ ¿µ¿ª ÀÚü°¡ Àç¹èÄ¡µÇ±â ¶§¹®¿¡ ÀÌ ¿µ¿ªÀÇ ÁÖ¼Ò°¡ ¸ÕÀú ¼öÁ¤µÇ¾î¾ß ÇÑ´Ù. ÀÏ´Ü º¯°æµÈ ÁÖ¼Ò°¡ °è»êµÇ¸é ±× ÁÖ¼Ò°¡ °¡¸®Å°´Â ¿µ¿ªÀÇ ³»¿ëÀº °áÁ¤µÇ¸ç ÇØ´ç ¿µ¿ª¿¡´Â »õ·Î¿î ÁÖ¼Ò°¡ Àû¿ëµÈ´Ù.

Áּҵ鰣¿¡ ´Ù¸¥ ¹ÙÀÌÆ® ¿À´õ¸µ Çü½Ä (little/big endian) ÀÌ »ç¿ëµÈ´Ù¸é º¹ÀâÇÑ ¹®Á¦°¡ ¹ß»ýµÇ¸ç Àç¹èÄ¡µÇ´Â ½ÇÁ¦ ÁÖ¼Ò´Â Á¤·ÄµÇÁö ¾ÊÀ» ¼ö ÀÖ´Ù.

´Ù½Ã Çѹø binfmt_flat.c ÆÄÀÏÀ» »ìÆì º¸ÀÚ. ¾Æ·¡ÀÇ ÄÚµå´Â Àç¹èÄ¡¸¦ ¼öÇàÇÏ´Â ºÎºÐÀ» ³ªÅ¸³½´Ù.

for (i=0; i < relocs; i++) {
    unsigned long addr;
 
    /* Àç¹èÄ¡µÉ Æ÷ÀÎÅÍÀÇ ÁÖ¼Ò¸¦ ¾ò¾î¿Â´Ù.
       (¹°·Ð ¸ÕÀú ÀÌ ÁÖ¼Ò¸¦ Àç¹èÄ¡ ÇØ¾ß ÇÑ´Ù) */
    rp = (unsigned long *)calc_reloc(ntohl(reloc[i]), libinfo, id, 1);
    if (rp == (unsigned long *)RELOC_FAILED)
        return -ENOEXEC;
 
    /* Æ÷ÀÎÅÍ°¡ °¡¸®Å°´Â ³»¿ëÀ» °¡Á® ¿Â´Ù. */
    addr = get_unaligned (rp);
 
    if (addr != 0) {
        /*
         * Àç¹èÄ¡¸¦ ¼öÇàÇÑ´Ù.
         * µ¥ÀÌÅÍ ¼½¼ÇÀÇ PIC Àç¹èÄ¡´Â ÀÌ¹Ì Å¸°ÙÀÇ ¹ÙÀÌÆ® ¿À´õ·Î µÇ¾î ÀÖ´Ù.
         */
        addr = calc_reloc( (flags & FLAT_FLAG_GOTPIC) ? addr : ntohl(addr),
                          libinfo, id, 0);
        if (addr == RELOC_FAILED)
            return -ENOEXEC;

        /* Àç¹èÄ¡µÈ Æ÷ÀÎÅ͸¦ ±â·ÏÇÑ´Ù(write back).  */
        put_unaligned (addr, rp);
    }
}


5. ¿¬°á

À§¿¡ »ìÆ캸¾ÒµíÀÌ ÀÌ°ÍÀÌ µ¿ÀÛÇϱâ À§Çؼ­´Â ¿©·¯ ½Ã½ºÅÛµéÀÌ ÇÔ²² ÀûÀýÈ÷ µ¿ÀÛÇØ¾ß ÇÑ´Ù.

  • bitfmt_flat.c ´Â elf2flt ÀÇ Ãâ·ÂÀ» ÀÌÇØÇØ¾ß ÇÑ´Ù.
  • elf2flt ´Â (ƯÈ÷) Àç¹èÄ¡ ¿µ¿ª¿¡ ´ëÇÑ ÀûÀýÇÑ Ãâ·ÂÀ» »ý¼ºÇØ¾ß ÇÑ´Ù.
  • ÄÄÆÄÀÏ·¯´Â ¿Ã¹Ù¸¥ GOT Á¤º¸¿Í PIC Äڵ带 »ý¼ºÇØ¾ß ÇÑ´Ù.
  • crt0.o °ú °°Àº ¶óÀ̺귯¸® ¿ä¼Ò´Â À§ÀÇ ¸ðµç °Íµé°ú Àß µ¿ÀÛÇØ¾ß ÇÑ´Ù.

ÀÌ ¸ðµç ¿ä¼ÒµéÀÌ ÇÔ²² °ü¸®µÇ±â À§ÇØ ¸®ºñÀü ¹øÈ£°¡ »ý¼ºµÇ¾ú´Ù.


6. Flathdr - flat ÆÄÀÏ ¸Å´ÏÀú

ÀÌ ÇÁ·Î±×·¥Àº elf2flt ¿¡ ÀÇÇØ »ý¼ºµÈ flat ÆÄÀÏ ³»ÀÇ flat Çì´õÀÇ ³»¿ëÀ» Á¶»çÇϰųª º¯°æÇϱâ À§ÇØ »ç¿ëµÈ´Ù.

»ç¿ë ¹æ¹ýÀº ¾Æ·¡¿Í °°´Ù

/usr/local/bin/flthdr romfs/bin/boa
romfs/bin/boa
    Magic:        bFLT
    Rev:          4
    Entry:        0x50
    Data Start:   0x11980
    Data End:     0x13d40
    BSS End:      0x15604
    Stack Size:   0x2000
    Reloc Start:  0x13d40
    Reloc Count:  0x4f
    Flags:        0x2 ( Has-PIC-GOT )flt.

»ç¿ëÇÒ ¼ö ÀÖ´Â ¿É¼ÇÀº ¾Æ·¡¿Í °°´Ù.

    -p      : print current settings
    -z      : compressed flat file
    -d      : compressed data-only flat file
    -Z      : un-compressed flat file
    -r      : ram load
    -R      : do not RAM load
    -s size : stack size
    -o file : output-file
              (default is to modify input file)

¾Æ·¡´Â flthdr À» »ç¿ëÇÏ¿© ¾ÐÃàµÈ flat ÆÄÀÏÀ» »ý¼ºÇÏ´Â ¿¹Á¦ÀÌ´Ù.

/usr/local/bin/flthdr -z romfs/bin/boa -o romfs/bin/boaz  


±×¸®°í ±× °á°ú´Â ¾Æ·¡¿Í °°´Ù

/usr/local/bin/flthdr -p romfs/bin/boaz
romfs/bin/boaz
    Magic:        bFLT
    Rev:          4
    Entry:        0x50
    Data Start:   0x11980
    Data End:     0x13d40
    BSS End:      0x15604
    Stack Size:   0x2000
    Reloc Start:  0x13d40
    Reloc Count:  0x4f
    Flags:        0x6 ( Has-PIC-GOT Gzip-Compressed )

ls -l romfs/bin/boa*
-rwxr--r--    1 philw    philw       81532 Jul 18 04:22 romfs/bin/boa
-rw-rw-r--    1 philw    philw       40261 Jul 18 04:16 romfs/bin/boaz

load to ram ºñÆ®´Â -r ȤÀº -R ¿É¼Ç¿¡ ÀÇÇØ º¯°æµÉ ¼ö ÀÖ´Ù.

/usr/local/bin/flthdr -r romfs/bin/boa 


°á°ú´Â ¾Æ·¡¿Í °°´Ù

/usr/local/bin/flthdr -p romfs/bin/boa
romfs/bin/boa
    Magic:        bFLT
    Rev:          4
    Entry:        0x50
    Data Start:   0x11980
    Data End:     0x13d40
    BSS End:      0x15604
    Stack Size:   0x2000
    Reloc Start:  0x13d40
    Reloc Count:  0x4f
    Flags:        0x3 ( Load-to-Ram Has-PIC-GOT )

½ºÅÃÀÇ Å©±â´Â -s ¿É¼ÇÀ» ÀÌ¿ëÇÏ¿© º¯°æÇÒ ¼ö ÀÖ´Ù.

/usr/local/bin/flthdr  -s 16384 romfs/bin/boa 


°á°ú´Â ¾Æ·¡¿Í °°´Ù
usr/local/bin/flthdr -p romfs/bin/boa
romfs/bin/boa
    Magic:        bFLT
    Rev:          4
    Entry:        0x50
    Data Start:   0x11980
    Data End:     0x13d40
    BSS End:      0x15604
    Stack Size:   0x4000
    Reloc Start:  0x13d40
    Reloc Count:  0x4f
    Flags:        0x2 ( Has-PIC-GOT )


7. ÄÄÆÄÀÏ Ç÷¡±×

ÀÌ ºÎºÐÀÌ ÀÌ ¹®¼­ÀÇ ÇÙ½ÉÀÌ´Ù. °¢°¢ÀÇ ½Ã½ºÅÛ¿¡¼­ XIP ·Î µ¿ÀÛ½ÃÅ°±â À§ÇÑ ÄÄÆÄÀÏ Ç÷¡±×´Â ¹«¾ùÀϱî? ´ÙÀ½ Å×À̺íÀ» »ìÆ캸¸é µµ¿òÀ» ¾òÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù. (TODO: È®ÀÎÇÏ°í Å×ÀÌºí ¿Ï¼ºÇϱâ) GOT ¿É¼ÇÀº..??

¾ÆÅ°ÅØó »ç¿ëÀÚ ÇÁ·Î±×·¥ Ä¿³Î
M68K (Dragonball) -msep_data -DMAGIC_ROM_PTR
Coldfire -msep_data -DMAGIC_ROM_PTR
ARM -DPIC -fpic -msingle-pic-base (-DPIC ´Â ÀӽùæÆíÀÌ´Ù)
SH3 ` ` ` `
Mips -G 0 -mabicalls -fpic -G0 -mno-abicalls -fno-pic
Sparc ` ` ` `
Etrax (cris) ` ` ` `

8. ÀúÀÚ

ÀÌ ¹®¼­ÀÇ ÀúÀÚ´Â Phil Wilshire À̸ç [http]System Design & Consulting Services (SDCS) ÀÇ Æ®·¹ÀÌ´× ÇÁ·Î±×·¥ÀÇ ÀϺηΠ»ç¿ëµÇ¾ú´Ù.


Please see: uClinux





sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2006-11-21 15:38:31
Processing time 0.0090 sec