¿©±â¼ -Ttext 0x0¿¡ ´ëÇØ Á» ¾Ë¾Æº¸ÀÚ.
.text
.global -start
-start:
test-val: .long test-data
nop
test-data: .word 0xaa55 |
À§¿Í °°Àº Äڵ带 'gcc -E -traditional -o test.s test.S'·Î ÄÄÆÄÀÏ Çϸé
# 1 "test.S"
.text
.global -start
-start:
test-val: .long test-data
nop
test-data: .word 0xaa55 |
ÀÌ·¸°Ô µÇ°í À̸¦ ´Ù½Ã 'as -o test.o test.s'·Î ¾î¼ÀºíÇϴµ¥ -a¸¦ »ç¿ëÇØ Áß°£ ÆÄÀÏÀ» ¾òÀ¸¸é
´ÙÀ½°ú °°´Ù.
GAS LISTING test.s page 1
1 # 1 "test.S"
2 .text
3
4 .global -start
5 -start:
6 0000 05000000 test-val: .long test-data
7 0004 90 nop
8 0005 55AA test-data: .word 0xaa55
9 0007 90
AS LISTING test.s page 2
DEFINED SYMBOLS
test.s:5 .text:00000000 -start
test.s:6 .text:00000000 test-val
test.s:8 .text:00000005 test-data
NO UNDEFINED SYMBOLS |
test-val¿¡ ÀúÀåµÈ °ªÀº test-dataÀÇ .textÀÇ ½ÃÀÛÁ¡¿¡¼ ºÎÅÍÀÇ offsetÀÌ´Ù.
ÇÁ·Î±×·¥ÀÇ ½ÃÀÛÀÎ 0¿¡¼ ºÎÅÍ 5¹øÂ°¿¡ ÀÖ´Ü ¼Ò¸®´Ù.
ÃÖÁ¾ÀûÀ¸·Î 'ld -m elf-i386 -s --oformat binary test.o -o test.1'ÇÑ °á°ú¸¦ hex·Î
»ìÆìº¸¸é ´ÙÀ½°ú °°´Ù.
00000000 05 80 04 08 90 55 aa 90 |
0x90˼
nop(no operation)À» ÀǹÌÇÑ´Ù.
±×¸®°í 'ld -m elf-i386 -Ttext 0x0 -s --oformat binary test.o -o test.2'ÇÑ °á°ú´Â ´ÙÀ½°ú °°´Ù.
00000000 05 00 00 00 90 55 aa 90 |
µÑ »çÀÌÀÇ Â÷ÀÌÁ¡Àº -Ttext 0x0°¡ ÀÖ°í ¾ø°íÀÇ Â÷ÀÌ´Ù. ¹ÙÀ̳ʸ® Æ÷¸ËÀÇ °æ¿ì .text¸¦ ÁöÁ¤ÇØ ÁÖÁö
¾ÊÀ¸¸é ½ÃÀÛ ¹øÁö¸¦ ¸¾´ë·Î Á¤Çعö¸®¹Ç·Î .text¸¦ ÁöÁ¤ÇÏÁö ¾ÊÀº test.1¿¡¼´Â ½ÃÀÛÀÌ 0x09048000À¸·Î
¼³Á¤µÇ¾î ÀÖ´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ¾û¶×ÇÑ °÷ÀÇ °ªÀ» »ç¿ëÇϵµ·Ï ¸¸µé±â ¶§¹®¿¡ ¹ÙÀ̳ʸ®¸¦ »ç¿ëÇÒ ¶©
Á¦´ë·ÎµÈ ÁÖ¼Ò°¡ µé¾î°¡µµ·Ï .text¸¦ ÇÊ¿äÇÑ °÷À¸·Î ÁöÁ¤ÇØÁÙ Çʿ䰡 ÀÖ´Ù.
¶Ç .textÀÇ ½ÃÀÛÀ» 0x02·Î ÇßÀ» ¶§ÀÇ ¹ÙÀ̳ʸ®´Â ´ÙÀ½°ú °°´Ù.
00000000 90 90 09 00 00 00 90 55 aa 90 |
À§¿¡¼ º¸µíÀÌ 0xaa55´Â offsetÀÌ 7ÀÌÁö¸¸ ½ÇÁ¦ ÁöÁ¤µÈ °ÍÀº 9·Î .text°¡ 2ºÎÅÍ ½ÃÀÛÇϱ⠶§¹®ÀÌ´Ù.
¸¸¾à ÀÌ ¹ÙÀ̳ʸ®¸¦ ¸Þ¸ð¸®¿¡ ±×´ë·Î ¿Ã·Á ³õ´Â´Ù¸é Á¦´ë·Î µÈ °ªÀ» ÀÐÁö ¸øÇÒ ¼öµµ ÀÖ´Ù. ÀÌ °æ¿ì¿£
.text°¡ 2¿¡¼ ½ÃÀÛÇÏ´Â °ÍÀ» ¿°µÎ¿¡ µÎ°í ¸Þ¸ð¸®¿¡ ÀûÀçÇØ¾ß Á¦´ë·Î µ¿ÀÛÇÒ ¼ö ÀÖ´Ù.
½±°Ô Çϱâ À§Çؼ± .text¸¦ 0¿¡¼ ½ÃÀÛÇÏ°Ô ÇÏ¸é ¹ÙÀ̳ʸ®°¡ ¸Þ¸ð¸®ÀÇ ¾î´À À§Ä¡¿¡ ÀÖ´ø »ó°ü¾øÀÌ
Àß µ¿ÀÛÇÒ ¼ö ÀÖ°Ô µÈ´Ù.
2.4Àý¿¡¼ »ìÆìº» °Í°ú °°Àº °¢ ´Ü°è¸¶´Ù ÀÚ¼¼ÇÑ ³»¿ëÀ»
»ìÆì º»´Ù. ÀÌ ÀýÀÌ ³¡³ª¸é ÀÌÁ¦ ¸®´ª½º Ä¿³ÎÀÌ ¾î¶»°Ô ¸¸µé¾îÁö°í ¾î¶² ±¸Á¶¸¦ °®´ÂÁö ¿ÏÀüÈ÷
¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.
1 ~ 12 ´Ü°è´Â vmlinux¸¦ ¸¸µé±â À§ÇÑ ÇѰèÀ̰í Ä¿³Î ¼³Á¤À» ¾î¶»°Ô Çߴ°¡¿¡ µû¶ó ´Þ¶óÁö¹Ç·Î
¿©±â¼´Â ´Ù·çÁö ¾Ê´Â´Ù. ¶Ç 17, 18 ´Ü°èµµ bvmlinux¸¦ ¸¸µé±â À§ÇØ ÇÊ¿äÇÑ ´Ü°èÀ̹ǷΠ»ý·«ÇÑ´Ù.
ÇÊ¿äÇÑ ³»¿ëÀº 2.4ÀýÀ» ÂüÁ¶Çϰųª
°¢ÀÚ log¸¦ ¸¸µé¾î »ìÆìº¸±â ¹Ù¶õ´Ù.
vmlinux
(1)
ld -m elf-i386 -T /usr/src/linux-2.4.16/arch/i386/vmlinux.lds -e stext arch/i386/kernel/head.o arch/i386/kernel/init-task.o init/main.o init/version.o \
--start-group \
arch/i386/kernel/kernel.o arch/i386/mm/mm.o kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o \
drivers/acpi/acpi.o drivers/char/char.o drivers/block/block.o drivers/misc/misc.o drivers/net/net.o drivers/media/media.o drivers/char/agp/agp.o drivers/char/drm/drm.o drivers/ide/idedriver.o drivers/cdrom/driver.o drivers/sound/sounddrivers.o drivers/pci/driver.o drivers/pcmcia/pcmcia.o drivers/net/pcmcia/pcmcia-net.o drivers/pnp/pnp.o drivers/video/video.o drivers/md/mddev.o \
net/network.o \
/usr/src/linux-2.4.16/arch/i386/lib/lib.a /usr/src/linux-2.4.16/lib/lib.a /usr/src/linux-2.4.16/arch/i386/lib/lib.a \
--end-group \
-o vmlinux
(2)
nm vmlinux | grep -v '\(compiled\)\|\(\.o$\)\|\( [aUw] \)\|\(\.\.ng$\)\|\(LASH[RL]DI\)' | sort > System.map |
- (1)
- vmlinux´Â Ä¿³Î ÀÚü¸¦ ÀǹÌÇÑ´Ù. ±×·¡¼ ¸µÅ©µÇ´Â ¿ÀºêÁ§Æ® µéÀÌ Ä¿³Î ¼³Á¤¿¡¼
»ç¿ëÇϰڴٰí ÇÑ °Íµé°ú ¼±ÅÃµÈ ¾ÆÅ°ÅØÃÄ¿¡ °ü°èµÈ °ÍµéÀÌ ¹¶ÃÄÁ® ÇϳªÀÇ ÆÄÀÏÀ» ¸¸µé¾î
³½´Ù.
»ç¿ëµÈ ¿É¼ÇÀº ´ÙÀ½°ú °°´Ù.
-o vmlinux
Ãâ·Â¹°Àº vmlinux·Î ÁöÁ¤
¸µÅ©¿¡ »ç¿ëµÈ ½ºÅ©¸³Æ®(vmlinux.lds)´Â ¾Æ·¡¿Í °°´Ù.
/* ld script to make i386 Linux kernel
* Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>;
*/
(1)
OUTPUT-FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
OUTPUT-ARCH(i386)
ENTRY(-start)
SECTIONS
{
(2)
. = 0xC0000000 + 0x100000;
-text = .; /* Text and read-only data */
(3)
.text : {
*(.text)
*(.fixup)
*(.gnu.warning)
} = 0x9090
.text.lock : { *(.text.lock) } /* out-of-line lock text */
-etext = .; /* End of text section */
.rodata : { *(.rodata) *(.rodata.*) }
.kstrtab : { *(.kstrtab) }
. = ALIGN(16); /* Exception table */
--start---ex-table = .;
--ex-table : { *(--ex-table) }
--stop---ex-table = .;
--start---ksymtab = .; /* Kernel symbol table */
--ksymtab : { *(--ksymtab) }
--stop---ksymtab = .;
(4)
.data : { /* Data */
*(.data)
CONSTRUCTORS
}
-edata = .; /* End of data section */
(5)
. = ALIGN(8192); /* init-task */
.data.init-task : { *(.data.init-task) }
. = ALIGN(4096); /* Init code and data */
--init-begin = .;
.text.init : { *(.text.init) }
.data.init : { *(.data.init) }
. = ALIGN(16);
--setup-start = .;
.setup.init : { *(.setup.init) }
--setup-end = .;
--initcall-start = .;
.initcall.init : { *(.initcall.init) }
--initcall-end = .;
. = ALIGN(4096);
--init-end = .;
(6)
. = ALIGN(4096);
.data.page-aligned : { *(.data.idt) }
. = ALIGN(32);
.data.cacheline-aligned : { *(.data.cacheline-aligned) }
--bss-start = .; /* BSS */
.bss : {
*(.bss)
}
-end = . ;
(7)
/* Sections to be discarded */
/DISCARD/ : {
*(.text.exit)
*(.data.exit)
*(.exitcall.exit)
}
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
} |
- (1)
- vmlinuxÀÇ Æ÷¸Ë°ú ¾ÆÅ°ÅØÃĸ¦ ÁöÁ¤Çϰí ÇÁ·Î±×·¥ ½ÃÀÛÁ¡À» ÁöÁ¤ÇÑ´Ù.
- (2)
- vmlinuxÀÇ ½ÃÀÛ ¹øÁö¸¦ ÁöÁ¤ÇÑ´Ù. 0x100000Àº offsetÀÌ°í ¾ÕÀÇ 0xc0000000Àº gdt³»¿¡
µé¾î°¥ ¶§ ÇÊ¿äÇÑ °ªÀ¸·Î ¹°¸®ÀûÀ¸·Î´Â 0x100000 ¹øÁö¸¦ ÀǹÌÇÑ´Ù.
¿©±â¼ ºÎÅÍ´Â ´Ù¸¥ ºÎºÐ°ú ´Þ¸® gdtµîÀÌ ¼³Á¤µÈ »óÅÂÀÎ ÇÁ·ÎÅØÆ¼µå ¸ðµå¿¡¼ µ¿ÀÛ
ÇϹǷΠ¸Þ¸ð¸® °ü·ÃµÈ °ÍÀ» ½ÇÁ¦ ¾îµå·¹½º¸¦ »ç¿ëÇÏ¸é ¾ÈµÈ´Ù.
- (3)
- Ä¿³Î Äڵ尡 À§Ä¡ÇÒ °÷ÀÌ´Ù. 0x9090Àº ºó°ø°£¿¡ ä¿ö³Ö±â ÇÒ ¶§ 0x9090À» »ç¿ëÇ϶õ ¸»ÀÌ´Ù.
- (4)
- Ưº°È÷ ÁöÁ¤µÇÁö ¾ÊÀº ¸ðµç µ¥ÀÌŸ´Â ¿©±â¿¡ À§Ä¡ÇÑ´Ù. CONSTRUCTOR´Â C++ constructor Á¤º¸¸¦
¿©±â¿¡ ±â·ÏÇ϶õ ¸»ÀÌ´Ù.
- (5)
- arch/i386/kernel/init-task.c¿¡ ÁöÁ¤µÇ¾îÀÖ°í ÇÁ·Î¼¼½º ½ºÅÃÀ» ´Ù·ç´Â ¹æ½Ä ¶§¹®¿¡
8192 bytes ´ÜÀ§·Î Á¤·ÄµÇ¾ßÇÑ´Ù.
- (6)
- arch/i386/traps.c¿¡ Á¤ÀǵǾî ÀÖ°í Pentium F0 0F ¹ö±×¸¦ ÇÇÇϱâ À§ÇÑ °£´ÜÇÑ ¹æ¹ýÀ¸·Î
ÆäÀÌÁö Á¤·ÄÀ» »ç¿ëÇÑ´Ù(ÆäÀÌÁö´Â 4096 bytes¸¦ ÀǹÌÇÑ´Ù).
- (7)
- ¹«½ÃµÇ°í »ç¿ëµÇÁö ¾Ê´Â ¼½¼ÇÀ¸·Î vmlinux¿¡ Æ÷ÇÔµÇÁö ¾Ê´Â´Ù. Ä¿³ÎÀÌ exitÇÒ ÀÏÀº ¾ø±â
¶§¹®ÀÌ´Ù.
- (2)
- nmÀº ¿ÀºêÁ§Æ® ÆÄÀÏ¿¡¼ ½Éº¼À» ÃßÁÙÇØ ÁÖ´Â ÇÁ·Î±×·¥ÀÌ´Ù. Ä¿³Î À̹ÌÁö ÆÄÀÏ¿¡¼ ¸ðµç ½Éº¼À»
ÃßÃâÇØ³»°í ÀÌ Áß¿¡ ÇÊ¿äÇÑ ºÎºÐ¸¸À» Ãß·Á System.mapÀ» ¸¸µç´Ù. grep¿¡ »ç¿ëµÈ -v´Â µÚ¿¡
³ª¿À´Â °æ¿ì¸¦ Á¦¿ÜÇÑ °Í µéÀ» ã¾ÆÁØ´Ù. Ä¿³Î ÄÄÆÄÀÏÀÌ ³¡³ ÈÄ 'nm vmlinux > test.map'¸¸
ÇÑ °á°ú¿Í System.mapÀ» ºñ±³ÇØ º¸¸é grep¿¡¼ ã´Â °ÍµéÀÌ ¾î¶² °ÍÀÎÁö ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.
System.mapÀº óÀ½ ºÎÆÃ ¶§ ¸Þ¸ð¸®¿¡ ÀÐÇô ¿Ã·ÁÁö°í µå¶óÀ̹öµîÀÌ Ä¿³Î ½Éº¼À» ãÀ» ¶§ »ç¿ëÇÑ´Ù.
bbootsect
gcc -E -D--KERNEL-- -I/usr/src/linux-2.4.16/include -D--BIG-KERNEL-- -traditional -DSVGA-MODE=NORMAL-VGA bootsect.S -o bbootsect.s
as -o bbootsect.o bbootsect.s
ld -m elf-i386 -Ttext 0x0 -s --oformat binary bbootsect.o -o bbootsect |
bbootsect.s´Â bootsect.S¸¦ ÄÄÆÄÀÏÇØ ¸¸µéµÇ --BIG-KERNEL--À» Á¤ÀÇÇØ ¸¸µç´Ù. bootsect.S¸¦ »ìÆìº¸¸é
ÀÌ¿Í °ü·ÃµÈ °÷ÀÌ ÇÑ ±ºµ¥ ÀÖ´Â °ÍÀ» ¹ß°ßÇÒ ¼ö ÀÖ´Ù.
ld¿¡ »ç¿ëµÈ ¿É¼ÇÀº ´ÙÀ½°ú °°´Ù.
-m elf-i386
elf-i386¸¦ ¿¡¹Ä·¹À̼Ç
-Ttext 0x0
text ¼¼±×¸ÕÆ®ÀÇ ½ÃÀÛÀ» 0x0À¸·Î ÁöÁ¤
-s
¸ðµç µð¹ö±ë Á¤º¸¸¦ ¾ø¾Ø´Ù
-oformat binary
bbootsectÀÇ Æ÷¸ËÀº ¹ÙÀ̳ʸ®
bsetup
gcc -E -D--KERNEL-- -I/usr/src/linux-2.4.16/include -D--BIG-KERNEL-- -D--ASSEMBLY-- -traditional -DSVGA-MODE=NORMAL-VGA setup.S -o bsetup.s
as -o bsetup.o bsetup.s
ld -m elf-i386 -Ttext 0x0 -s --oformat binary -e begtext -o bsetup bsetup.o |
bbootsect¿Í °°Àº ¹æ¹ýÀ» ¸¸µç´Ù.
arch/i386/boot/compressed/piggy.o
tmppiggy=-tmp-$$piggy; \
rm -f $tmppiggy $tmppiggy.gz $tmppiggy.lnk; \
objcopy -O binary -R .note -R .comment -S /usr/src/linux-2.4.16/vmlinux $tmppiggy; \
gzip -f -9 < $tmppiggy > $tmppiggy.gz; \
echo "SECTIONS { .data : { input-len = .; LONG(input-data-end - input-data) input-data = .; *(.data) input-data-end = .; }}" > $tmppiggy.lnk; \
ld -m elf-i386 -r -o piggy.o -b binary $tmppiggy.gz -b elf32-i386 -T $tmppiggy.lnk; \
rm -f $tmppiggy $tmppiggy.gz $tmppiggy.lnk |
piggy.o´Â $(TOPDIR)/vmlinux¸¦ ¾ÐÃàÇØ ¸¸µç´Ù. ¿ì¼± vmlinux¿¡¼ ½Éº¼°ú ÇÊ¿ä ¾ø´Â ¼½¼ÇÀ» ¾ø¾Ö°í
¹ÙÀ̳ʸ® ÇüÅ·Π¸¸µç´ÙÀ½ gzipÀ» ÀÌ¿ëÇØ ¾ÐÃàÇÑ´Ù. ¾ÐÃàµÈ °ÍÀ» ´Ù½Ã elf-i386 ÇüÅ·Π¸¸µé¾î ³õ´Â´Ù.
ld¿¡ »ç¿ëµÈ ¿É¼ÇÀº ´ÙÀ½°ú °°´Ù.
-m elf-i386
elf-i386¸¦ ¸Þ¹Ä·¹À̼Ç
-b binary $tmppiggy.gz
$tmppiggy.gzÀº ¹ÙÀ̳ʸ® Çü½Ä
-b elf32-i386
piggy.o´Â elf32-i386 Çü½Ä
-T $tmppiggy.lnk
$tmppiggy.lnk¸¦ »ç¿ëÇØ ¸µÅ©ÇÑ´Ù.
$tmppiggy.lnkÀÇ ³»¿ëÀº ´ÙÀ½°ú °°´Ù.
SECTIONS
{
.data : {
input-len = .;
LONG(input-data-end - input-data)
input-data = .;
*(.data)
input-data-end = .;
}
} |
¾ÐÃàµÈ vmlinux´Â .data¿¡ µé¾î°¡°Ô µÇ°í *(.data)·Î Ç¥½ÃµÈ °÷¿¡ µé¾î°¡°Ô µÈ´Ù.
±× ÀüÈÄ¿¡ LONG(input-data-end - input-data)·Î ¾ÐÃàµÈ Ä¿³ÎÀÇ Å©±â¸¦ ÀúÀåÇÑ´Ù.
arch/i386/boot/compressed/bvmlinux
ld -m elf-i386 -Ttext 0x100000 -e startup-32 -o bvmlinux head.o misc.o piggy.o |
bvmlinux´Â ¾ÐÃàµÈ Ä¿³Î°ú head.o, misc.o¸¦ ÇÕÃÄ ¸¸µç´Ù. head.o´Â ¸Þ¸ð¸® ¼¼ÆÃÀ̶ó°í º¸¸éµÇ°í
misc.o´Â ¾ÐÃàÀ» Ç®±â À§ÇÑ Äڵ尡 µé¾îÀÖ´Ù. ld¿¡ »ç¿ëµÈ ¿É¼ÇÀº $(TOPDIR)/vmlinux¸¦ ¸¸µé ¶§¿Í °ÅÀÇ
Èí»çÇÏ´Ù. ´Ü textÀÇ ½ÃÀÛ ¹øÁö´Â 0x100000ÀÌ´Ù.
ºÎÆÃÇÒ ¶§ bvmlinux´Â ¹Ýµå½Ã 0x100000¿¡ ¿Ã·ÁÁ®¼ ½ÇÇàµÇ¾ßÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é Á¦´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â´Ù.
¾ÐÃàµÈ Ä¿³ÎÀÇ Å©±â¸¦ piggy.o¿¡ ÀúÀåÇØ ³õ¾Ò±â ¶§¹®¿¡ ¸Þ¸ð¸®ÀÇ ¾î´À À§Ä¡¿¡¼ piggy.o°¡ ³¡³ª´ÂÁö
¾Ë¼ö ÀÖ´Ù. À̵ڿ¡ ¾ÐÃàÀ» Ç®¾î ³õ°í ¾ÐÃàÀÌ Ç®¸° Ä¿³ÎÀ» ´Ù½Ã 0x100000À¸·Î ¿Å°Ü¿Í ½ÇÇàÇÑ´Ù.
build
gcc -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -o tools/build tools/build.c -I/usr/src/linux-2.4.16/include |
build´Â 2.3.5Àý¿¡¼¿Í °°ÀÌ µ¿ÀÛÇϵµ·Ï ¸¸µé¾îÁø´Ù.
bvmlinux.out
objcopy -O binary -R .note -R .comment -S compressed/bvmlinux compressed/bvmlinux.out |
bvmlinux¿¡¼ ÇÊ¿ä ¾ø´Â °ÍÀ» Á¦¿ÜÇÏ°í ¹ÙÀ̳ʸ®·Î ¸¸µç´Ù.
bzImage
tools/build -b bbootsect bsetup compressed/bvmlinux.out CURRENT > bzImage
Root device is (3, 1)
Boot sector 512 bytes.
Setup is 4768 bytes.
System is 899 kB |
build¸¦ »ç¿ëÇØ bzImage¸¦ ¸¸µç´Ù. ÁöÁ¤µÈ ·çÆ® µð¹ÙÀ̽º, ºÎÆ®¼½ÅÍ Å©±â, setupÀÇ Å©±â ±×¸®°í Ä¿³ÎÀÇ
Å©±â¸¦ Ç¥½ÃÇØ ÁØ´Ù. buildÀÇ µ¿ÀÛÀº 2.3.5ÀýÀ» ÂüÁ¶
¹Ù¶õ´Ù.