4.3. ARM ¸®´ª½º Makefile ºÐ¼®

2Àå¿¡¼­ ºÐ¼®ÇÑ °Í°ú °°ÀÌ ARM ¸®´ª½ºÀÇ Makefileµµ i386ÀÇ °Í°ú ºñ½ÁÇÏ´Ù. ±×·¯³ª ºÎÆÃÇÏ´Â °úÁ¤ µîÀÇ ÀϺΰ¡ PC°¡ ¾Æ´Ñ ´Ù¸¥ ½Ã½ºÅÛÀ̱⠶§¹®¿¡ ¸¹ÀÌ ´Ù¸£´Ù. ±×·³¿¡µµ ºÒ±¸ÇÏ°í ´ëºÎºÐ ºñ½ÁÇÑ ¹æ¹ýÀ¸·Î ¸¸µé¾îÁö°í ½ÇÇàµÈ´Ù.

arch/arm ÀÌÇÏÀÇ °Í¸¸ Á¦¿ÜÇÑ´Ù¸é ³ª¸ÓÁö´Â i386ÀÇ °Í°ú µ¿ÀÏÇϹǷΠ2ÀåÀ» ÂüÁ¶ÇÏ°í ³ª¸ÓÁö ARM ¸®´ª½º¿¡ °ü·ÃµÈ ºÎºÐ¸¸ ´Ù·é´Ù.

4.3.1. $(TOPDIR)/arch/arm/Makefile

Assabet º¸µå¿ë ±âº» ¼³Á¤¿¡ ÇØ´çÇÏ´Â .Config fileÀÇ ³»¿ëÀº ¾Æ·¡¿Í °°´Ù. À̸¦ ÂüÁ¶ÇØ ¾Æ·¡ Makefile ºÐ¼®À» ÁÀ¾Æ°¡±â ¹Ù¶õ´Ù. ¼¼ÆÃµÈ °Í¸¸ Ã߸®°í ³ª¸ÓÁö´Â ¹ö·È´Ù.

#
# Automatically generated by make menuconfig: don't edit
#
CONFIG_ARM=y
CONFIG_UID16=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y

#
# Code maturity level options
#
CONFIG_EXPERIMENTAL=y

#
# Loadable module support
#
CONFIG_MODULES=y

#
# System Type
#
CONFIG_ARCH_SA1100=y

#
# SA11x0 Implementations
#
CONFIG_SA1100_ASSABET=y
CONFIG_SA1100_USB=m
CONFIG_SA1100_USB_NETLINK=m

CONFIG_CPU_32=y
CONFIG_CPU_32v4=y
CONFIG_CPU_SA1100=y
CONFIG_DISCONTIGMEM=y

#
# General setup
#
# CONFIG_PCI is not set
CONFIG_ISA=y
CONFIG_CPU_FREQ=y
CONFIG_HOTPLUG=y

#
# PCMCIA/CardBus support
#
CONFIG_PCMCIA=y
CONFIG_PCMCIA_PROBE=y
CONFIG_PCMCIA_SA1100=y
CONFIG_NET=y
CONFIG_SYSVIPC=y
CONFIG_SYSCTL=y
CONFIG_FPE_NWFPE=y
CONFIG_KCORE_ELF=y
CONFIG_BINFMT_ELF=y
CONFIG_PM=y
CONFIG_CMDLINE="root=1f04 mem=32M"
CONFIG_LEDS=y
CONFIG_LEDS_TIMER=y
CONFIG_LEDS_CPU=y
CONFIG_ALIGNMENT_TRAP=y

#
# Memory Technology Devices (MTD)
#
CONFIG_MTD=y
CONFIG_MTD_PARTITIONS=y
CONFIG_MTD_REDBOOT_PARTS=y
CONFIG_MTD_CHAR=y
CONFIG_MTD_BLOCK=y

#
# RAM/ROM/Flash chip drivers
#
CONFIG_MTD_CFI=y
CONFIG_MTD_GEN_PROBE=y
CONFIG_MTD_CFI_ADV_OPTIONS=y
CONFIG_MTD_CFI_NOSWAP=y
CONFIG_MTD_CFI_GEOMETRY=y
CONFIG_MTD_CFI_B4=y
CONFIG_MTD_CFI_I2=y
CONFIG_MTD_CFI_INTELEXT=y

#
# Mapping drivers for chip access
#
CONFIG_MTD_SA1100=y

#
# Block devices
#
CONFIG_BLK_DEV_LOOP=m
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=4096
CONFIG_BLK_DEV_INITRD=y

#
# Networking options
#
CONFIG_UNIX=y
CONFIG_INET=y

#
# Network device support
#
CONFIG_NETDEVICES=y

#
# Ethernet (10 or 100Mbit)
#
CONFIG_NET_ETHERNET=y

#
# PCMCIA network device support
#
CONFIG_NET_PCMCIA=y
CONFIG_PCMCIA_PCNET=y

#
# IrDA (infrared) support
#
CONFIG_IRDA=m
CONFIG_IRLAN=m

#
# Infrared-port device drivers
#
CONFIG_SA1100_FIR=m

#
# ATA/IDE/MFM/RLL support
#
CONFIG_IDE=y

#
# IDE, ATA and ATAPI Block devices
#
CONFIG_BLK_DEV_IDE=y
CONFIG_BLK_DEV_IDEDISK=y
CONFIG_BLK_DEV_IDECS=y

#
# Character devices
#
CONFIG_VT=y

#
# Serial drivers
#
CONFIG_SERIAL_SA1100=y
CONFIG_SERIAL_SA1100_CONSOLE=y
CONFIG_SA1100_DEFAULT_BAUDRATE=38400
CONFIG_SERIAL_8250=m
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_UNIX98_PTYS=y
CONFIG_UNIX98_PTY_COUNT=32

#
# L3 serial bus support
#
CONFIG_L3=y
CONFIG_L3_ALGOBIT=y
CONFIG_L3_BIT_SA1100_GPIO=y
CONFIG_BIT_SA1100_GPIO=y

#
# Watchdog Cards
#
CONFIG_SA1100_RTC=y

#
# PCMCIA character devices
#
CONFIG_PCMCIA_SERIAL_CS=m

#
# File systems
#
CONFIG_FAT_FS=y
CONFIG_MSDOS_FS=y
CONFIG_JFFS2_FS=y
CONFIG_JFFS2_FS_DEBUG=0
CONFIG_TMPFS=y
CONFIG_PROC_FS=y
CONFIG_DEVPTS_FS=y
CONFIG_EXT2_FS=y

#
# Network File Systems
#
CONFIG_NFS_FS=y
CONFIG_SUNRPC=y
CONFIG_LOCKD=y

#
# Partition Types
#
CONFIG_PARTITION_ADVANCED=y
CONFIG_MSDOS_PARTITION=y
CONFIG_NLS=y

#
# Native Language Support
#
CONFIG_NLS_DEFAULT="iso8859-1"
CONFIG_NLS_CODEPAGE_437=y

#
# Console drivers
#
CONFIG_PC_KEYMAP=y

#
# Frame-buffer support
#
CONFIG_FB=y
CONFIG_DUMMY_CONSOLE=y
CONFIG_FB_SA1100=y
CONFIG_FBCON_CFB2=y
CONFIG_FBCON_CFB4=y
CONFIG_FBCON_CFB8=y
CONFIG_FBCON_CFB16=y
CONFIG_FBCON_FONTWIDTH8_ONLY=y
CONFIG_FBCON_FONTS=y
CONFIG_FONT_8x8=y

#
# Sound
#
CONFIG_SOUND=y
CONFIG_SOUND_SA1100=y
CONFIG_SOUND_UDA1341=y
CONFIG_SOUND_ASSABET_UDA1341=y

#
# Multimedia Capabilities Port drivers
#
CONFIG_MCP=y
CONFIG_MCP_SA1100=y
CONFIG_MCP_UCB1200=y
CONFIG_MCP_UCB1200_AUDIO=m
CONFIG_MCP_UCB1200_TS=y

#
# Kernel hacking
#
CONFIG_DEBUG_USER=y

#
# arch/arm/Makefile
#
# This file is subject to the terms and conditions of the GNU General Public
# License.  See the file "COPYING" in the main directory of this archive
# for more details.
#
# Copyright (C) 1995-2001 by Russell King

LINKFLAGS	:=-p -X -T arch/arm/vmlinux.lds
GZFLAGS		:=-9
CFLAGS		+=-fno-common -pipe

ifneq ($(CONFIG_NO_FRAME_POINTER),y)
CFLAGS		:=$(CFLAGS:-fomit-frame-pointer=)
endif

ifeq ($(CONFIG_DEBUG_INFO),y)
CFLAGS		+=-g
endif

# Select CPU dependent flags.  Note that order of declaration is important;
# the options further down the list override previous items.
#
# Note!  For APCS-26 YOU MUST HAVE AN APCS-26 LIBGCC.A
#
apcs-y				:=-mapcs-32
apcs-$(CONFIG_CPU_26)		:=-mapcs-26 -mcpu=arm3 -Os

(1)
# This selects which instruction set is used.
arch-y				:=
arch-$(CONFIG_CPU_32v3)		:=-march=armv3
arch-$(CONFIG_CPU_32v4)		:=-march=armv4
arch-$(CONFIG_CPU_32v5)		:=-march=armv5

(2)
# This selects how we optimise for the processor.
tune-y				:=
tune-$(CONFIG_CPU_ARM610)	:=-mtune=arm610
tune-$(CONFIG_CPU_ARM710)	:=-mtune=arm710
tune-$(CONFIG_CPU_ARM720T)	:=-mtune=arm7tdmi
tune-$(CONFIG_CPU_ARM920T)	:=-mtune=arm9tdmi
tune-$(CONFIG_CPU_ARM922T)	:=-mtune=arm9tdmi
tune-$(CONFIG_CPU_ARM926T)	:=-mtune=arm9tdmi
tune-$(CONFIG_CPU_SA110)	:=-mtune=strongarm110
tune-$(CONFIG_CPU_SA1100)	:=-mtune=strongarm1100

CFLAGS_BOOT	:=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float
CFLAGS		+=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float
AFLAGS		+=$(apcs-y) $(arch-y) -mno-fpu -msoft-float

ifeq ($(CONFIG_CPU_26),y)
PROCESSOR	 = armo
  ifeq ($(CONFIG_ROM_KERNEL),y)
    DATAADDR	 = 0x02080000
    TEXTADDR	 = 0x03800000
    LDSCRIPT	 = arch/arm/vmlinux-armo-rom.lds.in
  else
    TEXTADDR	 = 0x02080000
    LDSCRIPT	 = arch/arm/vmlinux-armo.lds.in
  endif
endif

(3)
ifeq ($(CONFIG_CPU_32),y)
PROCESSOR	 = armv
TEXTADDR	 = 0xC0008000
LDSCRIPT	 = arch/arm/vmlinux-armv.lds.in
endif

ifeq ($(CONFIG_ARCH_ARCA5K),y)
MACHINE		 = arc
endif

ifeq ($(CONFIG_ARCH_RPC),y)
MACHINE		 = rpc
endif

ifeq ($(CONFIG_ARCH_EBSA110),y)
MACHINE		 = ebsa110
endif

ifeq ($(CONFIG_ARCH_CLPS7500),y)
MACHINE		 = clps7500
INCDIR		 = cl7500
endif

ifeq ($(CONFIG_FOOTBRIDGE),y)
MACHINE		 = footbridge
INCDIR		 = ebsa285
endif

ifeq ($(CONFIG_ARCH_CO285),y)
TEXTADDR	 = 0x60008000
MACHINE		 = footbridge
INCDIR		 = ebsa285
endif

ifeq ($(CONFIG_ARCH_FTVPCI),y)
MACHINE		 = ftvpci
INCDIR		 = nexuspci
endif

ifeq ($(CONFIG_ARCH_TBOX),y)
MACHINE		 = tbox
endif

ifeq ($(CONFIG_ARCH_SHARK),y)
MACHINE		 = shark
endif

(4)
ifeq ($(CONFIG_ARCH_SA1100),y)
ifeq ($(CONFIG_SA1111),y)
# SA1111 DMA bug: we don't want the kernel to live in precious DMA-able memory
TEXTADDR	 = 0xc0208000
endif
MACHINE		 = sa1100
endif

ifeq ($(CONFIG_ARCH_L7200),y)
MACHINE		 = l7200
endif

ifeq ($(CONFIG_ARCH_INTEGRATOR),y)
MACHINE		 = integrator
endif

ifeq ($(CONFIG_ARCH_CAMELOT),y)
MACHINE          = epxa10db
endif

ifeq ($(CONFIG_ARCH_CLPS711X),y)
TEXTADDR	 = 0xc0028000
MACHINE		 = clps711x
endif

ifeq ($(CONFIG_ARCH_FORTUNET),y)
TEXTADDR	 = 0xc0008000
endif

ifeq ($(CONFIG_ARCH_ANAKIN),y)
MACHINE		 = anakin
endif

export	MACHINE PROCESSOR TEXTADDR GZFLAGS CFLAGS_BOOT

# Only set INCDIR if its not already defined above
# Grr, ?= doesn't work as all the other assignment operators do.  Make bug?
ifeq ($(origin INCDIR), undefined)
INCDIR		:= $(MACHINE)
endif

ifeq ($(origin DATAADDR), undefined)
DATAADDR	:= .
endif

(5)
# If we have a machine-specific directory, then include it in the build.
MACHDIR		:= arch/arm/mach-$(MACHINE)
ifeq ($(MACHDIR),$(wildcard $(MACHDIR)))
SUBDIRS		+= $(MACHDIR)
CORE_FILES	:= $(MACHDIR)/$(MACHINE).o $(CORE_FILES)
endif

(6)
HEAD		:= arch/arm/kernel/head-$(PROCESSOR).o \
		   arch/arm/kernel/init_task.o
SUBDIRS		+= arch/arm/kernel arch/arm/mm arch/arm/lib arch/arm/nwfpe
CORE_FILES	:= arch/arm/kernel/kernel.o arch/arm/mm/mm.o $(CORE_FILES)
LIBS		:= arch/arm/lib/lib.a $(LIBS)

ifeq ($(CONFIG_FPE_NWFPE),y)
LIBS		:= arch/arm/nwfpe/math-emu.o $(LIBS)
endif

# Only include fastfpe if it is part of the kernel tree.
FASTFPE		:= arch/arm/fastfpe
ifeq ($(FASTFPE),$(wildcard $(FASTFPE)))
SUBDIRS		+= $(FASTFPE)
ifeq ($(CONFIG_FPE_FASTFPE),y)
LIBS		:= arch/arm/fastfpe/fast-math-emu.o $(LIBS)
endif
endif

ifeq ($(findstring y,$(CONFIG_ARCH_CLPS7500) $(CONFIG_ARCH_L7200)),y)
SUBDIRS		+= drivers/acorn/char
DRIVERS		+= drivers/acorn/char/acorn-char.o
endif

MAKEBOOT	 = $(MAKE) -C arch/$(ARCH)/boot
MAKETOOLS	 = $(MAKE) -C arch/$(ARCH)/tools

# The following is a hack to get 'constants.h' up
# to date before starting compilation

$(patsubst %,_dir_%, $(SUBDIRS)): maketools
$(patsubst %,_modsubdir_%,$(MOD_DIRS)): maketools

symlinks: archsymlinks

archsymlinks:
	$(RM) include/asm-arm/arch include/asm-arm/proc
	(cd include/asm-arm; ln -sf arch-$(INCDIR) arch; ln -sf proc-$(PROCESSOR) proc)

vmlinux: arch/arm/vmlinux.lds

(7)
arch/arm/vmlinux.lds: $(LDSCRIPT) dummy
	@sed 's/TEXTADDR/$(TEXTADDR)/;s/DATAADDR/$(DATAADDR)/' $(LDSCRIPT) >$@

arch/arm/kernel arch/arm/mm arch/arm/lib: dummy
	$(MAKE) CFLAGS="$(CFLAGS) $(CFLAGS_KERNEL)" $(subst $@, _dir_$@, $@)

bzImage zImage zinstall Image bootpImage install: vmlinux
	@$(MAKEBOOT) $@

CLEAN_FILES	+= \
	arch/arm/vmlinux.lds

MRPROPER_FILES	+= \
	include/asm-arm/arch \
	include/asm-arm/proc \
	include/asm-arm/constants.h* \
	include/asm-arm/mach-types.h

# We use MRPROPER_FILES and CLEAN_FILES now
archmrproper:
	@/bin/true

archclean:
	@$(MAKEBOOT) clean

archdep: scripts/mkdep archsymlinks
	@$(MAKETOOLS) dep
	@$(MAKEBOOT) dep

# we need version.h
maketools: checkbin include/linux/version.h
	@$(MAKETOOLS) all

# Ensure this is ld "2.9.4" or later
NEW_LINKER	:= $(shell $(LD) --gc-sections --version >/dev/null 2>&1; echo $$?)

ifneq ($(NEW_LINKER),0)
checkbin:
	@echo '*** ${VERSION}.${PATCHLEVEL} kernels no longer build correctly with old versions of binutils.'
	@echo '*** Please upgrade your binutils to 2.9.5.'
	@false
else
checkbin:
	@true
endif

# My testing targets (that short circuit a few dependencies)
zImg:;	@$(MAKEBOOT) zImage
Img:;	@$(MAKEBOOT) Image
i:;	@$(MAKEBOOT) install
zi:;	@$(MAKEBOOT) zinstall
bp:;	@$(MAKEBOOT) bootpImage

(8)
#
# Configuration targets.  Use these to select a
# configuration for your architecture
%_config:
	@( \
	CFG=$(@:_config=); \
	if [ -f arch/arm/def-configs/$$CFG ]; then \
	  [ -f .config ] && mv -f .config .config.old; \
	  cp arch/arm/def-configs/$$CFG .config; \
	  echo "*** Default configuration for $$CFG installed"; \
	  echo "*** Next, you may run 'make oldconfig'"; \
	else \
	  echo "$$CFG does not exist"; \
	fi; \
	)

(1)
ARM ÇÁ·Î¼¼¼­ÀÇ Á¾·ù¿¡ µû¶ó ÄÄÆÄÀÏ·¯¿¡°Ô »ç¿ëÇÒ ¾ÆÅ°ÅØÃĸ¦ ¾Ë·ÁÁØ´Ù. SA1110Àº armv4¸¦ »ç¿ëÇÑ´Ù.

ARM ¾ÆÅ°ÅØÃÄ¿¡¼­ ¾ÆÅ°ÅØÃÄ¿¡(v6Æ÷ÇÔ) ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸¸¦ ¾ò±â ¹Ù¶õ´Ù. °£´ÜÈ÷ Á¤¸®ÇÏ¸é ´ÙÀ½°ú °°´Ù.

  • v3

    32 ºñÆ® ¾îµå·¹½Ì ½ÃÀÛ, ¾Æ·¡¿Í °°Àº Á¾·ù°¡ ÀÖ´Ù.

    • T

      Thumb ÄÚµå ½ÇÇà

    • M

      long multiply Áö¿ø, À̰ÍÀº v4¿¡¼­ ±âº»ÀÌ µÆ´Ù.

  • v4

    halfword load, store Áö¿ø

  • v5

    °³¼±µÈ ARM, Thumb µ¿ÀÛ. CLZ ¸í·É Áö¿ø. Á¾·ù´Â

    • E

      °³¼±µÈ DSP ¸í·É

    • J

      JAVA Áö¿ø

(2)
¼±Á¤µÈ ¾ÆÅ°ÅØÃÄ¿¡ ¼ÓÇÏ´Â º¯Á¾µé Áß¿¡ Á¤È®ÇÑ °ÍÀ» ÁöÁ¤ÇÑ´Ù.
(3)
SA1110ÀÇ °æ¿ì ÇÊ¿äÇÑ º¯¼ö µéÀ» ¼³Á¤ÇÑ´Ù. .text¸¦ 0xC0008000¿¡ ¸ÂÃß°í ¸µÅ© ½ºÅ©¸³Æ®¸¦ ±×¿¡ ¸Â´Â °ÍÀ» »ç¿ëÇϵµ·Ï ÇÑ´Ù.
(4)
MACHINEÀº arch/arm µð·ºÅ丮 ¹Ø¿¡ ÀÖ´Â ¸¹Àº ÇÏÀ§ µð·ºÅ丮 Áß¿¡ ÇöÀç ¼±ÅÃµÈ ½Ã½ºÅÛÀÌ ¾î¶² °ÍÀÎÁö¿¡ µû¶ó º¯°æµÇ´Â ³»¿ëÀ» ´ãÀº °ÍÀ» ¼±ÅÃÇϵµ·Ï ÇÑ´Ù.
(5)
MACHINE¿¡¼­ ¼±ÅÃµÈ °ÍÀ» »ç¿ëÇØ ÇÊ¿äÇÑ µð·ºÅ丮¸¦ ¼±ÅÃÇÑ´Ù.
(6)
ARM ÇÁ·Î¼¼¼­ÀÇ Á¾·ù¿¡ µû¶ó óÀ½ ½ÇÇàµÇ´Â Äڵ尡 ´Þ¶óÁ®¾ßÇÑ´Ù. ±× °ÍÀ» ¼±ÅÃÇÑ´Ù.
(7)
¸µÅ©¿¡ »ç¿ëµÉ ½ºÅ©¸³Æ®ÀÎ vmlinux.lds¸¦ ¸¸µé±â À§ÇØ vmlinux.*.lds.in¿¡¼­ ÇÊ¿äÇÑ ¸î °¡Áö º¯¼ö¸¦ Á¶Á¤ÇØ vmlinux.lds¸¦ ¸¸µç´Ù.
(8)
ARM Ä¿³ÎÀ» ¸¸µé ¶§ 'make assabet_config'¸¦ ½ÇÇàÇÑ °ÍÀ» ±â¾ïÇϴ°¡? º¸µå¿¡ µû¶ó ±âº» ¼³Á¤À» ¼¼ÆÃÇÒ ¶§ »ç¿ëÇÏ´Â ¸í·É¿¡ µû¶ó ¾Ë¸ÂÀº ¼³Á¤À» º¹»çÇϵµ·Ï ÇÑ´Ù.

arch/arm/def-config¿¡ °¡´ÉÇÑ ¸ðµç Á¤º¸°¡ µé¾îÀÖ´Ù.

4.3.2. $(TOPDIR)/arch/arm/vmlinux.lds

ARM ÇÁ·Î¼¼¼­ Ä¿³ÎÀÇ ¸µÅ©¿¡ »ç¿ëµÇ´Â ¸µÅ© ½ºÅ©¸³Æ® vmlinux.lds¸¦ ºÐ¼®Çغ¸ÀÚ. 4.3.1Àý¿¡¼­ º» °Í ó·³ vmlinux.lds´Â ¼³Á¤µÈ ¾ÆÅ°ÅØÃÄ¿¡µû¶ó ¸¸µé¾îÁø °ÍÀÌ´Ù.

/* ld script to make ARM Linux kernel
 * taken from the i386 version by Russell King
 * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>
 */
(1)
OUTPUT_ARCH(arm)
(2)
ENTRY(stext)
SECTIONS
{
(3)
	. = 0xC0008000;
(4)
	.init : {			/* Init code and data		*/
		_stext = .;
		__init_begin = .;
			*(.text.init)

		__proc_info_begin = .;
			*(.proc.info)
		__proc_info_end = .;
		__arch_info_begin = .;
			*(.arch.info)
		__arch_info_end = .;
		__tagtable_begin = .;
			*(.taglist)
		__tagtable_end = .;
			*(.data.init)
		. = ALIGN(16);
		__setup_start = .;
			*(.setup.init)
		__setup_end = .;
		__initcall_start = .;
			*(.initcall.init)
		__initcall_end = .;
		. = ALIGN(4096);
		__init_end = .;
	}

(5)
	/DISCARD/ : {			/* Exit code and data		*/
		*(.text.exit)
		*(.data.exit)
		*(.exitcall.exit)
	}

(6)
	.text : {			/* Real text segment		*/
		_text = .;		/* Text and read-only data	*/
			*(.text)
			*(.fixup)
			*(.gnu.warning)
			*(.rodata)
			*(.rodata.*)
			*(.glue_7)
			*(.glue_7t)
		*(.got)			/* Global offset table		*/

		_etext = .;		/* End of text section		*/
	}

	.kstrtab : { *(.kstrtab) }

	. = ALIGN(16);
	__ex_table : {			/* Exception table		*/
		__start___ex_table = .;
			*(__ex_table)
		__stop___ex_table = .;
	}

	__ksymtab : {			/* Kernel symbol table		*/
		__start___ksymtab = .;
			*(__ksymtab)
		__stop___ksymtab = .;
	}

(7)
	. = ALIGN(8192);

	.data : {
		/*
		 * first, the init task union, aligned
		 * to an 8192 byte boundary.
		 */
		*(.init.task)

		/*
		 * then the cacheline aligned data
		 */
		. = ALIGN(32);
		*(.data.cacheline_aligned)

		/*
		 * and the usual data section
		 */
		*(.data)
		CONSTRUCTORS

		_edata = .;
	}

	.bss : {
		__bss_start = .;	/* BSS				*/
		*(.bss)
		*(COMMON)
		_end = . ;
	}
					/* 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)
ÃÖÁ¾ Ãâ·ÂÀÇ ¾ÆÅ°ÅØÃĸ¦ ÁöÁ¤ÇÑ´Ù.
(2)
stext´Â arch/arm/kernel/head-armv.S¿¡ Á¤ÀǵǾî ÀÖ´Ù.
(3)
±×¸² 4-8À» ÂüÁ¶Çϸé 0xc0008000Àº DRAM Bank 0ÀÇ ÀϺκÐÀÌ´Ù. ½ÇÁ¦ Bank 0´Â 0xc0000000ºÎÅÍ ½ÃÀÛÇÏÁö¸¸ ¾ÕºÎºÐ ¾ó¸¶´Â AngelÀÌ »ç¿ëÇϱ⠶§¹®¿¡ ¿©±â¼­ ºÎÅÍ ¿Ã·ÁÁ® ½ÇÇàµÇµµ·Ï ¸¸µé¾îÁø´Ù.

±×¸² 4-8. SA-1110 ¸Þ¸ð¸® ¸Ê

(4)
°¢Á¾ ÃʱâÈ­ Äڵ常 µû·Î ¸ðÀº´Ù. ENTRY°¡ stextÀ̰í Ä¿³Î À̹ÌÁöÀÇ Á¦ÀÏ ¾ÕÀÌ .text.initºÎÅÍ ½ÃÀ۵ǹǷΠ½ÇÇàÀº stext°¡ À§Ä¡ÇÑ arch/arm/kernel/head-armv.SºÎÅÍ ½ÇÇàµÈ´Ù.
(5)
¸¸µé¾îÁö±ä ÇÏÁö¸¸ ½ÇÁ¦ Ä¿³Î À̹ÌÁö¿£ Æ÷ÇÔµÇÁö ¾Ê´Â ÄÚµå´Ù. Ä¿³ÎÀÌ exitÇÒ ÀÏÀº ¾ø±â ¶§¹®ÀÌ´Ù.
(6)
ÁøÂ¥ text ¼¼±×¸ÕÆ®¿Í Àбâ Àü¿ë µ¥ÀÌÅͰ¡ À§Ä¡ÇÑ´Ù.
(7)
ÇÑ ÇÁ·Î¼¼½ºÀÇ ½ºÅÃÀÌ 8KB ´ÜÀ§·Î ÀÛµ¿µÇµµ·Ï ¸¸µé¾îÁö¹Ç·Î init task unionÀº 8KB ´ÜÀ§·Î Á¤·Ä µÇ¾ß Á¦´ë·Î µ¿ÀÛÇÒ ¼ö ÀÖ´Ù. init_task´Â task_unionÀ̶õ union typeÀ¸·Î ¸¸µé¾îÁ® ÀÖ°í $(TOPDIR)/include/linux/sched.h¿¡ Á¤ÀǵǾî ÀÖ´Ù.
union task_union {
	struct task_struct task;
	unsigned long stack[INIT_TASK_SIZE/sizeof(long)];
};
							
À§¿¡¼­ º¸µíÀÌ task_unionÀº struct task_struct task;¿Í unsigned long stack[];À¸·Î ÀÌ·ïÁ® ÀÖ´Ù. ¶Ç stackÀº 2048*sizeof(long)ÀÇ ±æÀ̸¸Å­À» Â÷ÁöÇϴµ¥ SA1100¿¡¼± 8192 ¹ÙÀÌÆ®°¡ µÈ´Ù. ½ºÅÃÀÌ Á¦´ë·Î µ¿ÀÛÇÏ·Á¸é °¢ ŽºÅ©´Â Àû¾îµµ 8KB ´ÜÀ§·Î Á¤·ÄµÇ¾ß Á¦´ë·Î µ¿ÀÛÇÒ ¼ö ÀÖ°Ô µÈ´Ù.

4.3.3. $(TOPDIR)/arch/arm/boot/compressed/vmlinux.lds

/*
 *  linux/arch/arm/boot/compressed/vmlinux.lds.in
 *
 *  Copyright (C) 2000 Russell King
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
OUTPUT_ARCH(arm)
(1)
ENTRY(_start)
SECTIONS
{
(2)
  . = 0xc0008000;
  _load_addr = .;

  . = 0xc0008000;
  _text = .;

(3)
  .text : {
    _start = .;
    *(.start)
    *(.text)
    *(.fixup)
    *(.gnu.warning)
    *(.rodata)
    *(.rodata.*)
    *(.glue_7)
    *(.glue_7t)
    input_data = .;
    piggy.o
    input_data_end = .;
    . = ALIGN(4);
  }

  _etext = .;

  .data : {
    *(.data)
  }

  _edata = .;

  . = ALIGN(4);
  __bss_start = .;
  .bss : {
    *(.bss)
  }
  _end = .;

(4)
  .stack : {
    *(.stack)
  }

  .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)
ÃÖÁ¾ Ä¿³ÎÀÇ ½ÇÇà ½ÃÀÛÁ¡Àº _start°¡ µÈ´Ù.
(2)
¸Þ¸ð¸®¿¡ ¿Ã·ÁÁö´Â ½ÃÀÛ À§Ä¡´Â 0xc0008000. SA-1110ÀÇ ¸Þ¸ð¸® ¸Ê¿¡ ÀÇÇÏ¸é ·¥Àº 0xc0000000ºÎÅÍ ½ÃÀÛÇÏÁö¸¸ angelÀÌ ¾ÕºÎºÐ ¾ó¸¶¸¦ »ç¿äÇϹǷΠ¿©±â¿¡ ÀÏ´Ü ÀÐ¾î ¿Ã·Á³õ°í ½ÇÇàÇÑ´Ù.
(3)
¿£Æ®¸®·Î ÁöÁ¤µÈ _startÀÇ À§Ä¡¸¦ ÁöÁ¤ÇÑ´Ù. Áï ½ÇÇàÄÚµåÀÇ ½ÃÀÛÀ̵ǰí .start ºÎÅÍ ½ÃÀÛÇϹǷΠhead.SÀÇ start¿¡¼­ ºÎÅÍ Ä¿³ÎÀÌ ½ÇÇàµÈ´Ù.
(4)
½ºÅÃÀÇ µÚ¿¡ ÀÖ´Â exit ÄÚµå µéÀº »ç½Ç ÇÊ¿ä ¾øÀ¸¹Ç·Î ¹«½ÃµÇ°í stackÀÇ ¹Ù·Î µÚºÎÅÍ ÇØ¼­ ³²Àº ¸Þ¸ð¸® ¿µ¿ª¿¡ Ä¿³ÎÀÇ ¾ÐÃàÀÌ Ç®¸°´Ù.

4.3.4. Log ºÐ¼®

¾Æ·¡ Log´Â vmlinux°¡ ¸¸µé¾îÁö´Â °úÁ¤À» »ý·«Çϰí vmlinuxÀÇ ld°¡ ½ÇÇàµÇ´Â °Í°ú ±× ÀÌÈÄÀÇ °úÁ¤¸¸À» ½Ç¾ú´Ù. i386¿¡¼­ ÃßÀûÇß´ø °Í°ú ºñ½ÁÇÏ°Ô ¸¸µé¾îÁø´Ù.

...

(1)
/usr/local/arm/bin/arm-linux-ld -p -X -T arch/arm/vmlinux.lds arch/arm/kernel/head-armv.o arch/arm/kernel/init-task.o init/main.o init/version.o \
	--start-group \
	arch/arm/kernel/kernel.o arch/arm/mm/mm.o arch/arm/mach-sa1100/sa1100.o kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o \
	 drivers/l3/l3.o drivers/serial/serial.o drivers/char/char.o drivers/block/block.o drivers/misc/misc.o drivers/net/net.o drivers/media/media.o drivers/ide/idedriver.o drivers/sound/sounddrivers.o drivers/mtd/mtdlink.o drivers/pcmcia/pcmcia.o drivers/net/pcmcia/pcmcia-net.o drivers/video/video.o \
	net/network.o \
	arch/arm/nwfpe/math-emu.o arch/arm/lib/lib.a /devel/arm/assabet/linux-2.4.17/lib/lib.a \
	--end-group \
	-o vmlinux
/usr/local/arm/bin/arm-linux-nm vmlinux | grep -v '\(compiled\)\|\(\.o$\)\|\( [aUw] \)\|\(\.\.ng$\)\|\(LASH[RL]DI\)' | sort > System.map
make[1]: µé¾î°¨ `/devel/arm/assabet/linux-2.4.17/arch/arm/boot' µð·ºÅ丮
make[2]: µé¾î°¨ `/devel/arm/assabet/linux-2.4.17/arch/arm/boot/compressed' µð·ºÅ丮
(2)
/usr/local/arm/bin/arm-linux-gcc -D--ASSEMBLY-- -D--KERNEL-- -I/devel/arm/assabet/linux-2.4.17/include -mapcs-32 -march=armv4 -mno-fpu -msoft-float -traditional -c head.S
/usr/local/arm/bin/arm-linux-gcc -D--KERNEL-- -I/devel/arm/assabet/linux-2.4.17/include -O2 -DSTDC-HEADERS -mapcs-32 -march=armv4 -mtune=strongarm1100 -mshort-load-bytes -msoft-float -D--KERNEL-- -I/devel/arm/assabet/linux-2.4.17/include  -c -o misc.o misc.c
(3)
/usr/local/arm/bin/arm-linux-gcc -D--ASSEMBLY-- -D--KERNEL-- -I/devel/arm/assabet/linux-2.4.17/include -mapcs-32 -march=armv4 -mno-fpu -msoft-float   -c -o head-sa1100.o head-sa1100.S
(4)
/usr/local/arm/bin/arm-linux-objcopy -O binary -R .note -R .comment -S /devel/arm/assabet/linux-2.4.17/vmlinux piggy
gzip -9 < piggy > piggy.gz
/usr/local/arm/bin/arm-linux-ld -r -o piggy.o -b binary piggy.gz
rm -f piggy piggy.gz
(5)
/usr/local/arm/bin/arm-linux-ld -p -X -T vmlinux.lds head.o misc.o head-sa1100.o piggy.o /usr/local/arm/lib/gcc-lib/arm-linux/2.95.3/libgcc.a -o vmlinux
make[2]: ³ª°¨ `/devel/arm/assabet/linux-2.4.17/arch/arm/boot/compressed' µð·ºÅ丮
(6)
/usr/local/arm/bin/arm-linux-objcopy -O binary -R .note -R .comment -S compressed/vmlinux zImage
make[1]: ³ª°¨ `/devel/arm/assabet/linux-2.4.17/arch/arm/boot' µð·ºÅ丮

(1)
$(TOPDIR)/vmlinux¿Í System.mapÀ» ¸¸µç´Ù.
(2)
i386°ú ¸¶Âù°¡Áö·Î ÃʱâÈ­¸¦ ´ã´çÇÏ´Â head¿Í ¾ÐÃàÀ» Ç®¾îÁÖ´Â misc¸¦ ÄÄÆÄÀÏÇÑ´Ù.
(3)
SA1100¿¡ °ü°èµÈ ƯÁ¤ ¸í·ÉÀ» ¼öÇàÇÑ´Ù. ¿ì¼± command lineÀ¸·Î ÀÔ·ÂµÈ °ÍÀ» 0xc0000000¿¡ º¹»çÇϰí ij½Ã °ü°èµÈ ÀÏÀ» ó¸®ÇÏ°í ½Ã¸®¾ó·Î ¿¬°áµÈ È£½ºÆ®¿¡ Å͹̳ΠÇÁ·Î±×·¥ÀÌ ¶ã µ¿¾È Á» ±â´Ù·ÁÁØ´Ù. 4.2Àý¿¡¼­ ó·³ Ä¿³Î°ú ·¥µð½ºÅ© À̹ÌÁö¸¦ ´Ù¿î·ÎµåÇÑ ´ÙÀ½¿¡ Å͹̳ÎÀ» ½ÇÇàÇϴµ¥ ±â´Ù·ÁÁÖÁö ¾ÊÀ¸¸é Å͹̳ηδ ÃʱâºÎÆÃ °úÁ¤¿¡ ´ëÇÑ °ÍÀ» º¼ ¼ö ¾ø°Ô µÈ´Ù.
(4)
$(TOPDIR)/vmlinux¸¦ ¹ÙÀ̳ʸ®·Î ¸¸µé°í ¾ÐÃàÇÑ´Ù. ±×¸®°í ´Ù¸¥ °Í°ú ¸µÅ·ÇÒ ¼ö ÀÖµµ·Ï ÇØ³õ´Â´Ù.
(5)
ÀÌÁ¦ head, misc, head-sa1100 piggy¸¦ ÇÕÃÄ Ä¿³Î À̹ÌÁö¸¦ ¸¸µé¾î³½´Ù.
(6)
ÃÖÁ¾ Ä¿³Î À̹ÌÁö¸¦ ¸¸µé¾î ³½´Ù.