BLOG main image
LoofBackER's Blog
Jun - Sik , Yang Blog

컴네 데통 족보

분류없음 2007.02.28 11:27 by LoofBackER
신고

OS 개발

분류없음 2007.02.26 15:15 by LoofBackER

OS개발 관련 참조 사이트


[WWW]OSRC(OS Resource Center) : Boot Process부터 파일포맷, 디바이스 드라이버등 OS제작에 필수적인 자원들과 자료들이 하드웨어, 소프트웨어 카테고리로 나누어 일목요연하게 정리된 리소스 센터입니다.

[WWW]OS Developer site : OS제작자를 위한 디벨로퍼 사이트로 각종 포럼, 강좌, 소스코드등이 링크된 유용한 사이트입니다.

[WWW]The Triple Fault Club : 보호모드 및 OS제작에 관련된 메뉴얼 및 가이드, 그리고 공개 커널소스등이 관련된 링크가 집대성된 사이트입니다.. 대부분의 공개 운영체제 커널 소스등은 이곳에서 모두 찾을 수 있습니다... 강추~!!

[WWW]SIGOPS: 초보자들을 대상으로 OS를 제작하기 위한 단계적인 강좌와 예제들을 소개한 포럼입니다..저는 boot strap을 작성하는 루틴에 관해서 처음 이곳에서 배웠습니다. 처음시작하시는 분들과 초보자들에게 좋은 사이트입니다.

[WWW]John Fine's home page : OS를 제작하기 위해선 막바로 하드드라이브에 설치하는 코드를 만들기 보다는 먼저 Floppy로 부팅할 수 있도록 부트코드를 작성하고 플로피에서 OS이미지가 제대로 동작하는지 테스트를 하는 것이 좋습니다. 이때 꼭 필요한 것이 플로피 디스크 섹터에 자신이 원하는 바이너리 이미지를 기록하는 툴이죠.. OS를 제작하는 사람들 대부분이 쓰는툴이 John Fine가 만든 partcopy라는 툴입니다. John Fine의 홈피에 들어가시면 partcopy뿐만 아니라 보호모드, 시스템 유틸리티, nasm등 시스템 관련 자료와 툴들을 얻을 수 있을 것입니다.

[WWW]OS제작을 위한 FAQ사이트 : 역시 처음 OS를 제작하기 위해 어떠한 사항을 고려하고 무엇을 시작해야할지등을 FAQ형태로 설명해주는 사이트입니다.

[WWW]MenuetOS : Menuet is a fully 32 bit assembly written, graphical RealTime OS for _assembly_ programming & distributed under General Public License.

[WWW]Bona Fide OS Development

[WWW]OpenBeOS Project

[WWW]K-OS Developer Site : 한 3, 4년전인가요.. 하이텔 프로그래밍 동호회에 순수 어셈블리로만 작성된 K-OS라는 아주 작은 크기의 운영체제가 강좌와 함께 소스코드가 올라 온적이 있었습니다.. 솔직히 워낙 작은 크기의 프로그램이라 부팅하는 것 빼고는 별반 기능이 없는 dummy수준의 OS였지만 보호모드를 이용하여 태스크 스위칭을 하는등 당시로서는 자료 구하기조차 힘든 로우 레벨 프로그래밍의 기법등이 쓰여져 신선한 자극이 되었던 것이 생각나네요. 이 한국형(?) OS를 좀더 발전적으로 개발하고자 사람들이 모여 홈페이지를 만들었더군요.

[WWW] http://www.bellona2.com : OS제작에 관해서는 거의 전무이다시피한 국내출판시장에 처음으로 32비트 보호모드를 이용한 OS제작에 관한 책이 나왔더랬습니다. 바로 "OS제작의 정석"이라는 책이지요. 공룡서적이라 불리는 Silberschatz의 "Operating System Concepts"가 이론서로서는 독보적인 서적이라면 Tananbaum의 "Operating Systems: Design and Implementation"은 실제 구현을 설명한 책으로서는 최고의 책이라고 생각합니다. 물런 그런 세계 최고의 양서들과는 비교할 수 없지만, 그나마 우리나라에 OS제작에 관한 서적이 나오기 시작했다는 것은 매우 고무적인 현상이죠. 위 홈페이지를 방문하시면 풀소스를 받을 수 있습니다.

신고
TAG os 개발

bzimage 만드는 법

분류없음 2007.02.26 14:53 by LoofBackER

2.3. bzimage가 만들어지는 과정 추적-Makefile 분석

bzimage가 만들어지는 과정을 살펴 보고 이를 따라가면서 Makefile의 자세한 내용을 알아본다. 정확한 것은 2.4.2절을 참조하기 바란다.

시작은 물론 $(topDIR)/Makefile로 부터 시작한다.

커널 makefile은 몇 부분으로 나눌 수 있다.

  1. 기본 정보 정의

  2. 커널 설정

  3. 커널 소스 의존성 만들기

  4. 모듈 만들기

  5. 커널 실행 파일 만들기

  6. 모듈 설치하기

각 부분이 명확하게 구분되는 것은 아니지만 make의 동작을 이해하는 사람이라면 대충 구분을 지어 이해할 수 있을 것이다. 구분은 커널을 컴파일 하는 절차에 따라 나눈 것으로 이해 하면 쉬울 것이다. 일반적으로 많이 쓰이지 않는 부분은 넘어가고 중요한 부분만을 자세히 이해하자.

시작에 앞서 사용되는 Makefile들을 설명해 놓는다. 이것 들을 참조로 추적해나가므로 시작하기에 앞서 한번 쯤 훑어 보는 것도 좋을 것이다.

2.3.1. $(topDIR)/Makefile

아래 makefile에 (1), (2)와 같이 표시된 것은 아래 줄에 대한 설명을 달아 놓은 것으로 Makefile의 끝 부분에 붙어 있는 설명을 참조해가면서 분석하면되겠다.


version = 2
patchlevel = 4
sublevel = 16
extraversion =

kernelrelease=$(veRSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)

(1)
arch := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)

(2)
kernelpath=kernel-$(shell echo $(KERNELRELEASE) | sed -e "s/-//")

(3)
config-shell := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
   else if [ -x /bin/bash ]; then echo /bin/bash; \
   else echo sh; fi ; fi)

(4)
topdir := $(shell /bin/pwd)

hpath    = $(topdIR)/include
findhpath = $(hpatH)/asm $(HPATH)/linux $(HPATH)/scsi $(HPATH)/net

(5)
hostcc   = gcc
hostcflags = -wall -Wstrict-prototypes -O2 -fomit-frame-pointer

(6)
cross-compile  =

(7)
#
# include the make variables (CC, etc...)
#
as  = $(cross-coMPILE)as
ld  = $(cross-coMPILE)ld
cc  = $(cross-coMPILE)gcc
cpp  = $(cc) -e
ar  = $(cross-coMPILE)ar
nm  = $(cross-coMPILE)nm
strip  = $(cross-COMPILE)strip
objcopy  = $(crosS-COMPILE)objcopy
objdump  = $(crosS-COMPILE)objdump
makefiles = $(topdIR)/.config
genksyms = /sbin/genksyms
depmod  = /sbin/depmod
modflags = -dmoduLE
cflags-kernel =
perl  = perl

(8)
export version paTCHLEVEL SUBLEVEL EXTRAVERSION KERNELRELEASE ARCH \
 config-shell topDIR HPATH HOSTCC HOSTCFLAGS CROSS-COMPILE AS LD CC \
 cpp ar nm strip OBJCOPY OBJDUMP MAKE MAKEFILES GENKSYMS MODFLAGS PERL

all: do-it-all

(9)
#
# make "config" the default target if there is no configuration file or
# "depend" the target if there is no top-level dependency information.
#
ifeq (.config,$(wildcard .config))
include .config
ifeq (.depend,$(wildcard .depend))
include .depend
do-it-all: version vmlinux
else
(10)
configuration = depend
do-it-all: depend
endif
else
(11)
configuration = config
do-it-all: config
endif

(12)
#
# install-path specifies where to place the updated kernel and system map
# images.  uncomment if you want to place them anywhere other than root.
#
#export install-paTH=/boot

(13)
#
# install-mod-path specifies a prefix to MODLIB for module directory
# relocations required by build roots.  This is not defined in the
# makefile but the arguement can be passed to make if needed.
#
modlib := $(instaLL-MOD-PATH)/lib/modules/$(KERNELRELEASE)
export modlib

#
# standard cflags
#
cppflags := -d--keRNEL-- -I$(HPATH)

cflags := $(cppflaGS) -Wall -Wstrict-prototypes -Wno-trigraphs -O2 \
   -fomit-frame-pointer -fno-strict-aliasing -fno-common
aflags := -d--asseMBLY-- $(CPPFLAGS)

(14)
#
# root-dev specifies the default root-device when making the image.
# this can be either FLOPPY, CURRENT, /dev/xxxx or empty, in which case
# the default of fLOPPY is used by 'build'.
# this is i386 specific.
#
export root-dev = CURRENT

(15)
#
# if you want to preset the SVGA mode, uncomment the next line and
# set svga-mode to whatever number you want.
# set it to -dsvga-MODE=NORMAL-VGA if you just want the EGA/VGA mode.
# the number is the same as you would ordinarily press at bootup.
# this is i386 specific.
#
export svga-mode = -DSVGA-MODE=NORMAL-VGA

(16)
#
# if you want the RAM disk device, define this to be the size in blocks.
# this is i386 specific.
#
#export ramdisk = -DRAMDISK=512

(17)
core-files =kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o
networks =net/network.o

libs  =$(topdir)/lib/lib.a
subdirs  =kernel drivers mm fs net ipc lib

(18)
drivers-n :=
drivers-y :=
drivers-m :=
drivers-  :=

drivers-$(config-aCPI) += drivers/acpi/acpi.o
drivers-$(config-pARPORT) += drivers/parport/driver.o
drivers-y += drivers/char/char.o \
 drivers/block/block.o \
 drivers/misc/misc.o \
 drivers/net/net.o \
 drivers/media/media.o
drivers-$(config-aGP) += drivers/char/agp/agp.o
drivers-$(config-dRM) += drivers/char/drm/drm.o
drivers-$(config-nUBUS) += drivers/nubus/nubus.a
drivers-$(config-iSDN) += drivers/isdn/isdn.a
drivers-$(config-nET-FC) += drivers/net/fc/fc.o
drivers-$(config-aPPLETALK) += drivers/net/appletalk/appletalk.o
drivers-$(config-tR) += drivers/net/tokenring/tr.o
drivers-$(config-wAN) += drivers/net/wan/wan.o
drivers-$(config-aRCNET) += drivers/net/arcnet/arcnetdrv.o
drivers-$(config-aTM) += drivers/atm/atm.o
drivers-$(config-iDE) += drivers/ide/idedriver.o
drivers-$(config-fC4) += drivers/fc4/fc4.a
drivers-$(config-sCSI) += drivers/scsi/scsidrv.o
drivers-$(config-fUSION-BOOT) += drivers/message/fusion/fusion.o
drivers-$(config-iEEE1394) += drivers/ieee1394/ieee1394drv.o

ifneq ($(config-cd-NO-IDESCSI)$(CONFIG-BLK-DEV-IDECD)$(CONFIG-BLK-DEV-SR)$(CONFIG-PARIDE-PCD),)
drivers-y += drivers/cdrom/driver.o
endif

drivers-$(config-sOUND) += drivers/sound/sounddrivers.o
drivers-$(config-pCI) += drivers/pci/driver.o
drivers-$(config-mTD) += drivers/mtd/mtdlink.o
drivers-$(config-pCMCIA) += drivers/pcmcia/pcmcia.o
drivers-$(config-nET-PCMCIA) += drivers/net/pcmcia/pcmcia-net.o
drivers-$(config-nET-WIRELESS) += drivers/net/wireless/wireless-net.o
drivers-$(config-pCMCIA-CHRDEV) += drivers/char/pcmcia/pcmcia-char.o
drivers-$(config-dIO) += drivers/dio/dio.a
drivers-$(config-sBUS) += drivers/sbus/sbus-all.o
drivers-$(config-zORRO) += drivers/zorro/driver.o
drivers-$(config-fC4) += drivers/fc4/fc4.a
drivers-$(config-aLL-PPC) += drivers/macintosh/macintosh.o
drivers-$(config-mAC) += drivers/macintosh/macintosh.o
drivers-$(config-iSAPNP) += drivers/pnp/pnp.o
drivers-$(config-sGI-IP22) += drivers/sgi/sgi.a
drivers-$(config-vT) += drivers/video/video.o
drivers-$(config-pARIDE) += drivers/block/paride/paride.a
drivers-$(config-hAMRADIO) += drivers/net/hamradio/hamradio.o
drivers-$(config-tC) += drivers/tc/tc.a
drivers-$(config-uSB) += drivers/usb/usbdrv.o
drivers-$(config-iNPUT) += drivers/input/inputdrv.o
drivers-$(config-i2O) += drivers/message/i2o/i2o.o
drivers-$(config-iRDA) += drivers/net/irda/irda.o
drivers-$(config-i2C) += drivers/i2c/i2c.o
drivers-$(config-pHONE) += drivers/telephony/telephony.o
drivers-$(config-mD) += drivers/md/mddev.o
drivers-$(config-bLUEZ) += drivers/bluetooth/bluetooth.o
drivers-$(config-hOTPLUG-PCI) += drivers/hotplug/vmlinux-obj.o

(19)
drivers := $(driveRS-y)

(20)
# files removed with 'make clean'
clean-files = \
 kernel/ksyms.lst include/linux/compile.h \
 vmlinux system.map \
 .tmp* \
 drivers/char/consolemap-deftbl.c drivers/video/promcon-tbl.c \
 drivers/char/conmakehash \
 drivers/char/drm/*-mod.c \
 drivers/pci/devlist.h drivers/pci/classlist.h drivers/pci/gen-devlist \
 drivers/zorro/devlist.h drivers/zorro/gen-devlist \
 drivers/sound/bin2hex drivers/sound/hex2hex \
 drivers/atm/fore200e-mkfirm drivers/atm/{pca,sba}*{.bin,.bin1,.bin2} \
 drivers/scsi/aic7xxx/aicasm/aicasm-gram.c \
 drivers/scsi/aic7xxx/aicasm/aicasm-scan.c \
 drivers/scsi/aic7xxx/aicasm/y.tab.h \
 drivers/scsi/aic7xxx/aicasm/aicasm \
 drivers/scsi/53c700-mem.c \
 net/khttpd/make-times-h \
 net/khttpd/times.h \
 submenu*
# directories removed with 'make clean'
clean-dirs = \
 modules

(21)
# files removed with 'make mrproper'
mrproper-files = \
 include/linux/autoconf.h include/linux/version.h \
 drivers/net/hamradio/soundmodem/sm-tbl-{afsk1200,afsk2666,fsk9600}.h \
 drivers/net/hamradio/soundmodem/sm-tbl-{hapn4800,psk4800}.h \
 drivers/net/hamradio/soundmodem/sm-tbl-{afsk2400-7,afsk2400-8}.h \
 drivers/net/hamradio/soundmodem/gentbl \
 drivers/sound/*-boot.h drivers/sound/.*.boot \
 drivers/sound/msndinit.c \
 drivers/sound/msndperm.c \
 drivers/sound/pndsperm.c \
 drivers/sound/pndspini.c \
 drivers/atm/fore200e-*-fw.c drivers/atm/.fore200e-*.fw \
 .version .config* config.in config.old \
 scripts/tkparse scripts/kconfig.tk scripts/kconfig.tmp \
 scripts/lxdialog/*.o scripts/lxdialog/lxdialog \
 .menuconfig.log \
 include/asm \
 .hdepend scripts/mkdep scripts/split-include scripts/docproc \
 $(topdir)/include/linux/modversions.h \
 kernel.spec

# directories removed with 'make mrproper'
mrproper-dirs = \
 include/config \
 $(topdir)/include/linux/modules

(22)
include arch/$(arcH)/Makefile

(23)
export cppflags cFLAGS AFLAGS

export networks dRIVERS LIBS HEAD LDFLAGS LINKFLAGS MAKEBOOT ASFLAGS

(24)
.s.s:
 $(cpp) $(aflags) -traditional -o $*.s $<.s.o:
 $(cc) $(aflags) -traditional -c -o $*.o $<
version: dummy
 @rm -f include/linux/compile.h

boot: vmlinux
 @$(make) cflags="$(CFLAGS) $(CFLAGS-KERNEL)" -C arch/$(ARCH)/boot

(25)
vmlinux: include/linux/version.h $(CONFIGURATION) init/main.o init/version.o linuxsubdirs
 $(ld) $(linkflagS) $(HEAD) init/main.o init/version.o \
  --start-group \
  $(core-files) \
  $(drivers) \
  $(networks) \
  $(libs) \
  --end-group \
  -o vmlinux
 $(nm) vmlinux | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map

(26)
symlinks:
 rm -f include/asm
 ( cd include ; ln -sf asm-$(ARCH) asm)
 @if [ ! -d include/linux/modules ]; then \
  mkdir include/linux/modules; \
 fi

(27)
oldconfig: symlinks
 $(config-shell) scripts/Configure -d arch/$(ARCH)/config.in

xconfig: symlinks
 $(make) -c scripts kconfig.tk
 wish -f scripts/kconfig.tk

menuconfig: include/linux/version.h symlinks
 $(make) -c scripts/lxdialog all
 $(config-shell) scripts/Menuconfig arch/$(ARCH)/config.in

config: symlinks
 $(config-shell) scripts/Configure arch/$(ARCH)/config.in

include/config/marKER: scripts/split-include include/linux/autoconf.h
 scripts/split-include include/linux/autoconf.h include/config
 @ touch include/config/MARKER

(28)
linuxsubdirs: $(patsubst %, -dir-%, $(SUBDIRS))

(29)
$(patsubst %, -dir-%, $(SUBDIRS)) : dummy include/linux/version.h include/config/MARKER
 $(make) cflags="$(CFLAGS) $(CFLAGS-KERNEL)" -C $(patsubst -dir-%, %, $@)

$(topdir)/include/linux/version.h: include/linux/version.h
$(topdir)/include/linux/compile.h: include/linux/compile.h

newversion:
 . scripts/mkversion > .tmpversion
 @mv -f .tmpversion .version

(30)
include/linux/compile.h: $(CONFIGURATION) include/linux/version.h newversion
 @echo -n \#define UTS-VERSION \"\#`cat .version` > .ver
 @if [ -n "$(confIG-SMP)" ] ; then echo -n " SMP" >> .ver; fi
 @if [ -f .name ]; then  echo -n \-`cat .name` >> .ver; fi
 @echo ' '`date`'"' >> .ver
 @echo \#define lINUX-COMPILE-TIME \"`date +%T`\" >> .ver
 @echo \#define lINUX-COMPILE-BY \"`whoami`\" >> .ver
 @echo \#define lINUX-COMPILE-HOST \"`hostname`\" >> .ver
 @if [ -x /bin/dnsdomainname ]; then \
    echo \#define LINUX-COMPILE-DOMAIN \"`dnsdomainname`\"; \
  elif [ -x /bin/domainname ]; then \
    echo \#define LINUX-COMPILE-DOMAIN \"`domainname`\"; \
  else \
    echo \#define LINUX-COMPILE-DOMAIN ; \
  fi >> .ver
 @echo \#define lINUX-COMPILER \"`$(CC) $(CFLAGS) -v 2>&1 | tail -1`\" >> .ver
 @mv -f .ver $@

(31)
include/linux/version.h: ./Makefile
 @echo \#define uTS-RELEASE \"$(KERNELRELEASE)\" > .ver
 @echo \#define lINUX-VERSION-CODE `expr $(VERSION) \\* 65536 + $(PATCHLEVEL) \\* 256 + $(SUBLEVEL)` >> .ver
 @echo '#define kERNEL-VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))' >> .ver
 @mv -f .ver $@

init/version.o: init/version.c include/linux/compile.h include/config/MARKER
 $(cc) $(cflags) $(CFLAGS-KERNEL) -DUTS-MACHINE='"$(ARCH)"' -c -o init/version.o init/version.c

(32)
init/main.o: init/main.c include/config/MARKER
 $(cc) $(cflags) $(CFLAGS-KERNEL) $(PROFILING) -c -o $*.o $<
(33)
fs lib mm ipc kernel drivers net: dummy
 $(make) cflags="$(CFLAGS) $(CFLAGS-KERNEL)" $(subst $@, -dir-$@, $@)

(34)
# emacs, vi용 tag를 만든다.
tags: dummy
 etags `find include/asm-$(ARCH) -name '*.h'`
 find include -type d \( -name "asm-*" -o -name config \) -prune -o -name '*.h' -print | xargs etags -a
 find $(subdirs) init -name '*.[ch]' | xargs etags -a

# exuberant ctags works better with -I
tags: dummy
 ctagsf=`ctags --version | grep -i exuberant >/dev/null && echo "-I --initdata,--exitdata,EXPORT-SYMBOL,EXPORT-SYMBOL-NOVERS"`; \
 ctags $$ctagsf `find include/asm-$(ARCH) -name '*.h'` && \ find include -type d \( -name "asm-*" -o -name config \) -prune -o -name '*.h' -print | xargs ctags $$CTAGSF -a && \
 find $(subdirs) init -name '*.[ch]' | xargs ctags $$CTAGSF -a

ifdef config-modulES
ifdef config-modveRSIONS
modflags += -dmodvERSIONS -include $(HPATH)/linux/modversions.h
endif

(35)
.phony: modules
modules: $(patsubst %, -mod-%, $(SUBDIRS))

.phony: $(patsubst %, -mod-%, $(SUBDIRS))
$(patsubst %, -mod-%, $(SUBDIRS)) : include/linux/version.h include/config/MARKER
 $(make) -c $(patsubst -mod-%, %, $@) CFLAGS="$(CFLAGS) $(MODFLAGS)" MAKING-MODULES=1 modules

.phony: modules-install
modules-install: -modinst- $(patsubst %, -modinst-%, $(SUBDIRS)) -modinst-post

.phony: -modinst-
-modinst-:
 @rm -rf $(modlib)/kernel
 @rm -f $(modlib)/build
 @mkdir -p $(modlIB)/kernel
 @ln -s $(topdir) $(MODLIB)/build

(36)
# if system.map exists, run depmod.  This deliberately does not have a
# dependency on system.map since that would run the dependency tree on
# vmlinux.  this depmod is only for convenience to give the initial
# boot a modules.dep even before / is mounted read-write.  However the
# boot script depmod is the master version.
ifeq "$(strip $(inSTALL-MOD-PATH))" ""
depmod-opts :=
else
depmod-opts := -b $(INSTALL-MOD-PATH) -r
endif
.phony: -modinst-post
-modinst-post: -modinst-post-pcmcia
 if [ -r system.map ]; then $(DEPMOD) -ae -F System.map $(depmod-opts) $(KERNELRELEASE); fi

# backwards compatibilty symlinks for people still using old versions
# of pcmcia-cs with hard coded pathnames on insmod.  Remove
# -modinst-post-pcmcia for kernel 2.4.1.
.phony: -modinst-post-pcmcia
-modinst-post-pcmcia:
 cd $(modlib); \
 mkdir -p pcmcia; \
 find kernel -path '*/pcmcia/*' -name '*.o' | xargs -i -r ln -sf ../{} pcmcia

.phony: $(patsubst %, -modinst-%, $(SUBDIRS))
$(patsubst %, -modinst-%, $(SUBDIRS)) :
 $(make) -c $(patsubst -modinst-%, %, $@) modules-install

# modules disabled....

else
modules modules-install: dummy
 @echo
 @echo "the present kernel configuration has modules disabled."
 @echo "type 'make config' and enable loadable module support."
 @echo "then build a kernel with module support enabled."
 @echo
 @exit 1
endif

clean: archclean
 find . \( -name '*.[oas]' -o -name core -o -name '.*.flags' \) -type f -print \
  | grep -v lxdialog/ | xargs rm -f
 rm -f $(clean-fiLES)
 rm -rf $(clean-dIRS)
 $(make) -c documentation/DocBook clean

mrproper: clean archmrproper
 find . \( -size 0 -o -name .depend \) -type f -print | xargs rm -f
 rm -f $(mrproper-FILES)
 rm -rf $(mrpropeR-DIRS)
 $(make) -c documentation/DocBook mrproper

(37)
distclean: mrproper
 rm -f core `find . \( -not -type d \) -and \
  \( -name '*.orig' -o -name '*.rej' -o -name '*~' \
  -o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
  -o -name '.*.rej' -o -name '.SUMS' -o -size 0 \) -type f -print` TAGS tags

backup: mrproper
 cd .. && tar cf - linux/ | gzip -9 > backup.gz
 sync

sgmldocs:
 chmod 755 $(topdIR)/scripts/docgen
 chmod 755 $(topdIR)/scripts/gen-all-syms
 chmod 755 $(topdIR)/scripts/kernel-doc
 $(make) -c $(topDIR)/Documentation/DocBook books

psdocs: sgmldocs
 $(make) -c documentation/DocBook ps

pdfdocs: sgmldocs
 $(make) -c documentation/DocBook pdf

htmldocs: sgmldocs
 $(make) -c documentation/DocBook html

sums:
 find . -type f -print | sort | xargs sum > .SUMS

dep-files: scripts/mkdep archdep include/linux/version.h
 scripts/mkdep -- init/*.c > .depend
 scripts/mkdep -- `find $(FINDHPATH) -name SCCS -prune -o -follow -name \*.h ! -name modversions.h -print` > .hdepend
 $(make) $(patsubst %,-sfdep-%,$(SUBDIRS)) -FASTDEP-ALL-SUB-DIRS="$(SUBDIRS)"
ifdef config-modveRSIONS
 $(make) update-modverfile
endif

ifdef config-modveRSIONS
modverfile := $(toPDIR)/include/linux/modversions.h
else
modverfile :=
endif
export modverfile

depend dep: dep-files

checkconfig:
 find * -name '*.[hcS]' -type f -print | sort | xargs $(PERL) -w scripts/checkconfig.pl

checkhelp:
 find * -name [cc]onfig.in -print | sort | xargs $(PERL) -w scripts/checkhelp.pl

checkincludes:
 find * -name '*.[hcS]' -type f -print | sort | xargs $(PERL) -w scripts/checkincludes.pl

ifdef configuratioN
..$(configuration):
 @echo
 @echo "you have a bad or nonexistent" .$(CONFIGURATION) ": running 'make" $(CONFIGURATION)"'"
 @echo
 $(make) $(configURATION)
 @echo
 @echo "successful. Try re-making (ignore the error that follows)"
 @echo
 exit 1

#dummy: ..$(configURATION)
dummy:

else

dummy:

endif

(38)
include rules.make

(39)
#
# this generates dependencies for the .h files.
#

scripts/mkdep: scripts/mkdep.c
 $(hostcc) $(hostCFLAGS) -o scripts/mkdep scripts/mkdep.c

scripts/split-include: scripts/split-include.c
 $(hostcc) $(hostCFLAGS) -o scripts/split-include scripts/split-include.c

(40)
#
# rpm target
#
# if you do a make spec before packing the tarball you can rpm -ta it
#
spec:
 . scripts/mkspec > kernel.spec

#
# build a tar ball, generate an rpm from it and pack the result
# there arw two bits of magic here
# 1) the use of /. to avoid tar packing just the symlink
# 2) removing the .dep files as they have source paths in them that
#    will become invalid
#
rpm: clean spec
 find . \( -size 0 -o -name .depend -o -name .hdepend \) -type f -print | xargs rm -f
 set -e; \
 cd $(topdir)/.. ; \
 ln -sf $(topdir) $(KERNELPATH) ; \
 tar -cvz --exclude CVS -f $(KERNELPATH).tar.gz $(KERNELPATH)/. ; \
 rm $(kernelpath) ; \
 cd $(topdir) ; \
 . scripts/mkversion > .version ; \
 rpm -ta $(topdir)/../$(KERNELPATH).tar.gz ; \
 rm $(topdir)/../$(KERNELPATH).tar.gz
   

(1)
arch는 아래와 같이 uname으로 얻어지는 아키텍쳐를 지칭하는 값을 갖는다. intel 계열에선 i386이 되고 ARM 계열에선 arm이 된다.
(2)
kernelPATH는 kernel-2.4.16이 된다.
(3)
현재 사용 중인 shell을 알아낸다.
(4)
topdir은 커널 소스 코드가 들어있는 최상위 디렉토리
(5)
host가 붙은 것은 커널이 cross compile 되서 다른 아키텍쳐용 바이너리를 만들 수도 있기 때문에 실제 커널을 구성하는 코드 외에 커널을 만들기 위해 필요한 몇 몇 프로그램을 호스트 상에서 돌리기 위한 컴파일러를 지정 하는 것이다.
(6)
보통의 경우 HOST와 TARGET이 같으면 CROSS-COMPILE에 아무 것도 없으나 target이 다르면 여기에 컴파일러의 prefix를 적어줘야한다. 예를 들어 PDA에 많이 사용되는 arm processor를 TARGET으로한 경우엔 cross-COMPILE = arm-linux- 와 같이 된다.
(7)
위에서 정의한 CROSS-COMPILE이 컴파일러 등의 prefix로 쓰이는데 arm processor의 경우엔 CC = arm-linux-gcc 와 같이 된다.
(8)
여기 까지 정의된 변수들은 커널 컴파일 전반에 사용될 것들이므로 아래와 같이 해서 각 디렉토리 등에 들어있는 Makefile로 값을 전달해 준다.
(9)
리눅스 커널은 컴파일 전에 반드시 설정/의존성설정이 되어있어야 하므로 어느 경우든 두 절차를 검사한다. 먼저 .config가 있다는 것은 커널 설정이 된 상태를 의미하고 .depend는 의존성설정이 끝난 것을 의미한다.
(10)
.config는 있지만 .depend는 없는 경우
(11)
.config가 없는 경우엔 커널 설정을 먼저하도록 한다.
(12)
커널 컴파일이 끝나고 설치될 디렉토리를 지정한다. 보통은 사용되지 않는다.
(13)
module이 설치될 디렉토리를 지정한다. 보통은 /lib/modules/2.4.16 과 같이된다.
(14)
i386 아키텍쳐에서 루트 디바이스를 지정한다. currenT는 커널 컴파일 할 당시의 root device를 의미한다.
(15)
i386 아키텍쳐에서 초기 부팅시의 화면 모드를 설정한다.
(16)
i386에서 램디스크가 필요한 경우 사용한다.
(17)
core-fILES는 리눅스 커널을 이루는 근간이 되는 몇 몇 부분을 나타낸다. 리눅스 커널은 아래와 같이 kernel, drivers, mm, fs, ipc, network, lib로 구분된다고 볼수 있다.
(18)
커널 설정할 때 어떤 기능을 yes, no, module로 설정할 수 있는데 yes로하면 driverS-y에, no는 DRIVERS-n에, module은 DRIVERS-m에 모이게 된다.

예를 들어 ACPI 기능을 사용하지 않는다고 했을 경우엔 아래 줄이 driverS- += drivers/acpi/acpi.o가 된다. .config의 내용을 한번 읽어보면 금방 이해될 것이다.

(19)
실제 커널에 포함되는 드라이버는 모두 DRIVERS에 기록된다.
(20)
make clean 했을 때 지워지는 file들을 지정한다. clean은 object 등을 지울 뿐 커널 설정 등은 지우지 않는다.
(21)
mrproper는 세팅까지도 지워버리고 완전히 초기화 시켜버린다.
(22)
리눅스 커널은 여러 종류의 타켓을 지원하므로 처음 Makefile에서 확인한 아키텍처에 따른 Makefile을 읽어 사용하게 된다. make bzImage 등을 했을 때 사용되는 Makefile은 여기서 include 된다.
(23)
필요한 플래그를 export 해서 하위 디렉토리 등에서 make 할 때도 여기에서 적용된 사항들이 같이 적용될 수 있도록 한다.
(24)
어셈블리 코드 컴파일 방법을 지정
(25)
컴파일된 커널이 일차적으로 하나로 뭉쳐 vmlinux를 만들어낸다. 이 것을 압축하고 부팅에 관계된 코드를 덧붙여주면 커널이 완성된다.
(26)
include 디렉토리 내의 심볼릭 링크를 설정한다.
(27)
커널 세팅하는 방법에 따라 설정에 필요한 프로그램을 만들고 설정을 시작한다.
(28)
linuxsubdirs는 SUBDIRS에 정의된 것들에서 앞에 -dir-을 붙여 새로운 이름을 하나씩 만들어낸다.

patsubst는 $(patsubst PATTERN, REPLACEMENT, TEXT)의 형식으로 TEXT에서 patterN과 일치하는 부분을 REPLACEMENT로 교체한다.

(29)
각 하위 디렉토리를 make 한다. patsubst에 의해 실제 디렉토리로 이동하게 된다.
(30)
컴파일한 시간, 누가 했는가, gcc 버전 등이 기록된다. 내용은 아래와 같다.
#define uts-versioN "#11 2002. 01. 25. (금) 16:35:16 KST"
#define linux-compILE-TIME "16:35:16"
#define linux-compILE-BY "root"
#define linux-compILE-HOST "halite"
#define linux-compILE-DOMAIN ""
#define linux-compILER "gcc version 2.95.3 20010315 (release)"
(31)
include/linux/version.h는 현재 컴파일 될 리눅스 커널의 버전 정보를 담는 헤더 파일이고 아래 스크립트에 의해 만들어진다. 내용은 아래 3줄과 같다.

# #define uts-releASE "2.4.16"
# #define linux-veRSION-CODE 132112
# #define kernel-vERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))

(32)
main.c엔 start-kernel()이 들어있고 이 함수는 LILO등에 의해 메모리에 올려진 커널이 불리게되는 시작 위치다.
(33)
하위 디렉토리는 위에 정의된 하위 디렉토리 make 방법에 따라 make 된다. 즉 $(patsubst %, -dir-%, $(SUBDIRS))에 의해 make 된다.
(34)
emacs, vi용 tag를 만든다.
(35)
module로 지정된 놈들을 다 만들어준다.

.phony를 사용하면 정의된 이름이 file이 아님을 알려주고 퍼포먼스를 올려준다. 자세한 것은 'info make'를 해서 참조 바란다.

(36)
커널을 컴파일할 때 System.map이 만들어지는데 이게 존재하는 경우 module의 dependency를 만들어준다.
(37)
distclean은 현재 커널 버전 개발을 끝내고 release하려할 때 실행한다.
(38)
리눅스 커널은 많은 하위 디렉토리가 있고 여기에 각각의 Makefile이 존재하는데 공통으로 사용될 수 있는 것을을 모아 Rules.make로 만들고 이를 사용한다.
(39)
커널 설정을 마친 후 헤더와 소스사이의 의존관계를 만들어주는 실행 파일을 만든다.
(40)
rpm 배포용 spec 파일과 rpm 파일을 만든다.

2.3.2. $(topDIR)/arch/i386/Makefile


(1)  
#
# i386/makefile
#
# this file is included by the global makefile so that you can add your own
# architecture-specific flags and dependencies. Remember to do have actions
# for "archclean" and "archdep" for cleaning up and making dependencies for
# this architecture
#
# 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) 1994 by Linus Torvalds
#
# 19990713  artur Skawina <
skawina@geocities.com>
#           added '-march' and '-mpreferred-stack-boundary' support
#

(2)  
ld=$(cross-compile)ld -m elf-i386
objcopy=$(cross-coMPILE)objcopy -O binary -R .note -R .comment -S
ldflags=-e stext
linkflags =-t $(toPDIR)/arch/i386/vmlinux.lds $(LDFLAGS)

cflags += -pipe

(3)
# prevent gcc from keeping the stack 16 byte aligned
cflags += $(shell if $(CC) -mpreferred-stack-boundary=2 -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-mpreferred-stack-boundary=2"; fi)

ifdef config-m386
cflags += -march=i386
endif

ifdef config-m486
cflags += -march=i486
endif

ifdef config-m586
cflags += -march=i586
endif

ifdef config-m586tSC
cflags += -march=i586
endif

ifdef config-m586mMX
cflags += -march=i586
endif

ifdef config-m686
cflags += -march=i686
endif

ifdef config-mpentIUMIII
cflags += -march=i686
endif

ifdef config-mpentIUM4
cflags += -march=i686
endif

(4)
ifdef config-mk6
cflags += $(shell if $(CC) -march=k6 -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-march=k6"; else echo "-march=i586"; fi)
endif

(5)
ifdef config-mk7
cflags += $(shell if $(CC) -march=athlon -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-march=athlon"; else echo "-march=i686 -malign-functions=4"; fi)
endif

ifdef config-mcrusOE
cflags += -march=i686 -malign-functions=0 -malign-jumps=0 -malign-loops=0
endif

ifdef config-mwincHIPC6
cflags += -march=i586
endif

ifdef config-mwincHIP2
cflags += -march=i586
endif

ifdef config-mwincHIP3D
cflags += -march=i586
endif

ifdef config-mcyriXIII
cflags += -march=i586
endif

head := arch/i386/kernel/head.o arch/i386/kernel/init-task.o

subdirs += arch/i386/kernel arch/i386/mm arch/i386/lib

core-files := arch/i386/kernel/kernel.o arch/i386/mm/mm.o $(CORE-FILES)
libs := $(topdir)/arch/i386/lib/lib.a $(LIBS) $(TOPDIR)/arch/i386/lib/lib.a

ifdef config-math-EMULATION
subdirs += arch/i386/math-emu
drivers += arch/i386/math-emu/math.o
endif

arch/i386/kernel: dummy
 $(make) linuxsubdirs SUBDIRS=arch/i386/kernel

arch/i386/mm: dummy
 $(make) linuxsubdirs SUBDIRS=arch/i386/mm

makeboot = $(make) -C arch/$(ARCH)/boot

vmlinux: arch/i386/vmlinux.lds

force: ;

.phony: zimage bzimage compressed zlilo bzlilo zdisk bzdisk install \
  clean archclean archmrproper archdep

zimage: vmlinux
 @$(makeboot) zimage

(6)
bzimage: vmlinux
 @$(makeboot) bzimage

compressed: zimage

zlilo: vmlinux
 @$(makeboot) booTIMAGE=zImage zlilo

tmp:
 @$(makeboot) booTIMAGE=bzImage zlilo
bzlilo: vmlinux
 @$(makeboot) booTIMAGE=bzImage zlilo

zdisk: vmlinux
 @$(makeboot) booTIMAGE=zImage zdisk

bzdisk: vmlinux
 @$(makeboot) booTIMAGE=bzImage zdisk

install: vmlinux
 @$(makeboot) booTIMAGE=bzImage install

archclean:
 @$(makeboot) clean

archmrproper:

archdep:
 @$(makeboot) dep
   

(1)
이 makefile은 $(TOPDIR)/Makefile에 의해 읽여 들여지므로 export된 많은 변수들을 그대로 사용 가능하다.
(2)
ld는 최종 output을 elf-i386의 형태로 만든다.

objcopy는 입력에서 .note, .comment 섹션을 삭제하고 리로케이션 정보와 심볼 정보를 삭제한다. 출력 포맷은 binary. 링크할 땐 $(TOPDIR)/arch/i386/vmlinux.lds란 파일에 기록되어 있는 방법을 따라 링크한다.

(3)
gcc가 스택을 16 byte 단위로 정렬하지 못하도록 한다.

사용되는 옵션은 다음과 같은 의미를 갖는다.

  • -mpreferred-stack-boundary=2 : 스택을 22 byte로 정렬하도록 한다. (=4면 24)

  • -S : 컴파일 스테이지까지만 하고 어셈블은 하지 않는다.

  • -xc : c 언어로 컴파일 한다.

즉 스택 바운더리 정렬이 4 바이트로 가능한지 알아봐서 가능하면 4 바이트 정렬을 사용한다. 만약 4 바이트 정렬을 지원하지 않으면 컴파일 중에 에러가 날 것이다. 이땐 기본 값을 사용한다.

/dev/null이 $(CC)의 입력으로 지정됐으므로 /dev/null을 읽어 컴파일한다. /dev/null을 읽으면 EOF를 돌려주므로 컴파일된 출력은 다음과 같을 것이지만 바로 /dev/null로 출력되어 화면에는 나타나지 않는다.

컴파일되면 다음과 같은 결과가 나온다.

 .file   "null" 
 .version    "01.01"
gcc2-compiled.:
 .ident  "gcc: (gNU) 2.95.3 20010315 (release)"
     

에러 없이 컴파일이 끝나면 $(CC)의 결과는 true가 될 것이고 에러가 있다면 false가 될 것이다. >/dev/null 2>&1은 출력되는 에러 메시지는 화면에 나오게 하지 않고 결과가 true인지 false인지만을 판별 하기 위해 넣은 것이다.

(4)
amd k6 CPU는 지원하는지 여부에 따라 지원하지 않을 경우엔 i586으로 간주한다.
(5)
athlon을 사용한다고 했지만 지원하는지 판단 후 지원하지 않으면 i686으로 간주하고 정렬을 16 바이트로 한다.
(6)
bzimage를 만들 경우엔 먼저 vmlinux를 만들고 나서 $(TOPDIR)/arch/i386/boot에서 make bzImage를 다시 실행한다.

2.3.3. $(topDIR)/arch/i386/boot/Makefile

 

#
# arch/i386/boot/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) 1994 by Linus Torvalds
#

boot-incl = $(topdIR)/include/linux/config.h \
  $(topdir)/include/linux/autoconf.h \
  $(topdir)/include/asm/boot.h

(1)
zimage: $(configurE) bootsect setup compressed/vmlinux tools/build
 $(objcopy) compressed/vmlinux compressed/vmlinux.out
 tools/build bootsect setup compressed/vmlinux.out $(ROOT-DEV) > zImage

(2)
bzimage: $(configuRE) bbootsect bsetup compressed/bvmlinux tools/build
 $(objcopy) compressed/bvmlinux compressed/bvmlinux.out
 tools/build -b bbootsect bsetup compressed/bvmlinux.out $(ROOT-DEV) > bzImage

compressed/vmlinux: $(TOPDIR)/vmlinux
 @$(make) -c compressed vmlinux

compressed/bvmlinux: $(TOPDIR)/vmlinux
 @$(make) -c compressed bvmlinux

zdisk: $(bootimage)
 dd bs=8192 if=$(BOOTIMAGE) of=/dev/fd0

zlilo: $(configure) $(BOOTIMAGE)
 if [ -f $(instalL-PATH)/vmlinuz ]; then mv $(INSTALL-PATH)/vmlinuz $(INSTALL-PATH)/vmlinuz.old; fi
 if [ -f $(instalL-PATH)/System.map ]; then mv $(INSTALL-PATH)/System.map $(INSTALL-PATH)/System.old; fi
 cat $(bootimage) > $(INSTALL-PATH)/vmlinuz
 cp $(topdir)/system.map $(INSTALL-PATH)/
 if [ -x /sbin/lilo ]; then /sbin/lilo; else /etc/lilo/install; fi

install: $(configuRE) $(BOOTIMAGE)
 sh -x ./install.sh $(KERNELRELEASE) $(BOOTIMAGE) $(TOPDIR)/System.map "$(INSTALL-PATH)"

(3)
tools/build: tools/build.c
 $(hostcc) $(hostCFLAGS) -o $@ $< -I$(TOPDIR)/include

bootsect: bootsect.o
 $(ld) -ttext 0x0 -s --oformat binary -o $@ $<

bootsect.o: bootsect.s
 $(as) -o $@ $<

bootsect.s: bootsect.S Makefile $(BOOT-INCL)
 $(cpp) $(cppflagS) -traditional $(SVGA-MODE) $(RAMDISK) $< -o $@

(4)
bbootsect: bbootsect.o
 $(ld) -ttext 0x0 -s --oformat binary $< -o $@

bbootsect.o: bbootsect.s
 $(as) -o $@ $<

(5)
bbootsect.s: bootsect.S Makefile $(BOOT-INCL)
 $(cpp) $(cppflagS) -D--BIG-KERNEL-- -traditional $(SVGA-MODE) $(RAMDISK) $< -o $@

setup: setup.o
 $(ld) -ttext 0x0 -s --oformat binary -e begtext -o $@ $<

setup.o: setup.s
 $(as) -o $@ $<

setup.s: setup.s video.S Makefile $(BOOT-INCL) $(TOPDIR)/include/linux/version.h $(TOPDIR)/include/linux/compile.h
 $(cpp) $(cppflagS) -D--ASSEMBLY-- -traditional $(SVGA-MODE) $(RAMDISK) $< -o $@

(6)
bsetup: bsetup.o
 $(ld) -ttext 0x0 -s --oformat binary -e begtext -o $@ $<

bsetup.o: bsetup.s
 $(as) -o $@ $<

bsetup.s: setup.s video.S Makefile $(BOOT-INCL) $(TOPDIR)/include/linux/version.h $(TOPDIR)/include/linux/compile.h
 $(cpp) $(cppflagS) -D--BIG-KERNEL-- -D--ASSEMBLY-- -traditional $(SVGA-MODE) $(RAMDISK) $< -o $@

dep:

clean:
 rm -f tools/build
 rm -f setup bootsect zImage compressed/vmlinux.out
 rm -f bsetup bbootsect bzImage compressed/bvmlinux.out
 @$(make) -c compressed clean

(1)
현재 커널은 zImage, bzImage 두 가지가 존재 한다.

zimage는 gzip으로 압축되고 하위 1M 메모리 내에 적재될 수 있는 크기의 커널 [1]

bzimage는 gzip으로 압축되고 하위 1M 메모리 내에 적재될 수 없는 크기의 커널

$(objcOPY)는 $(TOPDIR)/arch/i386/Makefile에서 정의된 것을 따른다. 즉 'objcoPY=$(CROSS-COMPILE)objcopy -O binary -R .note -R .comment -S'가 된다.

(2)
bvmlinux를 objcopy를 사용해 심볼 등을 빼고 build란 것을 사용해 최종 커널을 만든다. build는 bbootsect(512 bytes)+bsetup+bvmlinux.out을 합쳐 하나의 bzImage를 만든다 (그림 2-2).
(3)
build 프로그램은 최종 커널을 만드는 유틸리티다. 더 자세한 것은 여기에서 다룬다.
(4)
어셈블 끝난 bbootsect.o를 링크한다. 사용된 옵션은

-ttext 0x0 : 코드의 시작을 0번지 부터 시작한다고 하고 링크한다. 이렇게 하면 링크된 최종 출력물은 특별한 위치를 가리지 않고 메모리의 아무 위치에나 적재가 가능하고 실행 가능해진다.

-s : 출력물에서 심볼 정보를 모두 없앤다.

--oformat binary : 출력물의 포맷을 바이너리로 한다.

(5)
bootsect.S를 프리컴파일하는데 --BIG-KERNEL--을 정의해 bzImage의 부트 섹터를 만든다. 초기 vga 모드와 램디스크 크기 등을 정보로 전달해 준다.
(6)
bsetup 또한 bbootsect와 같은 방법으로 만들어진다.

2.3.4. $(topDIR)/arch/i386/boot/compressed/Makefile

#
# linux/arch/i386/boot/compressed/Makefile
#
# create a compressed vmlinux image from the original vmlinux
#

head = head.o
system = $(topdir)/vmlinux

objects = $(head) misc.o

zldflags = -e startup-32

(1)
# zimage-offset is the load offset of the compression loader
# bzimage-offset is the load offset of the high loaded compression loader
#
zimage-offset = 0x1000
bzimage-offset = 0x100000

zlinkflags = -ttext $(ZIMAGE-OFFSET) $(ZLDFLAGS)
bzlinkflags = -ttext $(BZIMAGE-OFFSET) $(ZLDFLAGS)

all: vmlinux

vmlinux: piggy.o $(OBJECTS)
 $(ld) $(zlinkflaGS) -o vmlinux $(OBJECTS) piggy.o

(2)
bvmlinux: piggy.o $(OBJECTS)
 $(ld) $(bzlinkflAGS) -o bvmlinux $(OBJECTS) piggy.o

(3)
head.o: head.s
 $(cc) $(aflags) -traditional -c head.S

misc.o: misc.c
 $(cc) $(cflags) -c misc.c

(4)
piggy.o: $(system)
 tmppiggy=-tmp-$$$$piggy; \
 rm -f $$tmppiggy $$tmppiggy.gz $$tmppiggy.lnk; \
 $(objcopy) $(sysTEM) $$tmppiggy; \
 gzip -f -9 < $$tmppiggy > $$tmppiggy.gz; \
 echo "sections { .data : { input-len = .; LONG(input-data-end - input-data) input-data = .; *(.data) input-data-end = .; }}" >gt; $$tmppiggy.lnk; \
 $(ld) -r -o piggy.o -b binary $$tmppiggy.gz -b elf32-i386 -T $$tmppiggy.lnk; \
 rm -f $$tmppiggy $$tmppiggy.gz $$tmppiggy.lnk

clean:
 rm -f vmlinux bvmlinux -tmp-*

(1)
zimage와 bzImage의 메모리 적재 위치가 서로 달라 zImage는 0x1000에서 부터 메모리에 적재되고 bzImage는 0x100000에 적재된다.
(2)
bvmlinux는 vmlinux와 마찬가지로 heas.o, misc.o, piggy.o가 합쳐져 만들어진다. 그러나 링크 플래그가 서로 다르게 설정되어있다.
(3)
커널의 압축을 풀고 메모리에 적재 하는 등의 일을 하는 부분이다.
(4)
커널의 핵심 부분이 모두 컴파일되 링크되면 elf type으로 $(TOP-DIR)/vmlinux가 만들어지는데 이것에서 디버깅 정보 등을 없애고 압축해서 만든 것이 piggy.o가 된다. 압축은 gzip으로 한다.

$$$$piggy의 4개의 $는 4자리의 임의의 숫자로 채워진다. 즉 tmppiggy=-tmp-1234piggy와 같이된다. 더불어 $$tmppiggy.gz 은 -tmp-1234piggy.gz, tmppiggy.lnk는 -tmp-1234piggy.lnk와 같이 된다.

piggy.o는 head.o, misc.o와 합쳐져 하나의 다른 file로 만들어져야하므로 다시 링커를 통해 elf-i386 포맷으로 만들어진다.

$(objcOPY)에 사용된 옵션은 다음과 같다.

  • -O : output format. 여기선 binary

  • -R : 지정된 section 이름을 지운다. .note, .comment는 없앤다.

  • -S : input file을 지정한다.

$(ld)에 사용된 옵션은 다음과 같다.
  • -m elf-i386 : ld가 elf-i386을 emulation 하도록 지정한다.

  • -r : relocatable, 메모리에 적재될 때 재배치 가능하도록 한다.

  • -b binary : input file의 format을 말한다. 여기선 $$tmppiggy.gz은 binary

  • -T : linker script file을 지정한다.

  • -b elf32-i386 : output을 elf-i386 format으로 지정한다.

2.3.5. $(topDIR)/arch/i386/boot/tools/build.c

$(topdir)/arch/i386/boot/tools/build는 커널 이미지 만드는 과정의 최종 단계에서 몇 개의 파일을 합쳐 하나의 커널 이미지를 만들어낸다. 이런 일을 담당하는 프로그램을 분석해야 이미 나온 부팅 과정에서의 동작을 이해할 수 있을 것이다.

최종 만들어지는 이미지는 그림 2-2이 된다. 부팅할 때 bootsect는 build에 의해 기록된 루트 디바이스, setup의 크기, 압축 커널의 크기를 바탕을 부팅 절차를 계속 진행한다.


/*
 *  $id: chap2.sgml,v 1.8 2002/02/15 15:59:43 halite Exp $
 *
 *  copyright (c) 1991, 1992  Linus Torvalds
 *  copyright (c) 1997 Martin Mares
 */

/*
 * this file builds a disk-image from three different files:
 *
 * - bootsect: exactly 512 bytes of 8086 machine code, loads the rest
 * - setup: 8086 machine code, sets up system parm
 * - system: 80386 code for actual system
 *
 * it does some checking that all files are of the correct type, and
 * just writes the result to stdout, removing headers and padding to
 * the right amount. It also writes some system data to stderr.
 */

/*
 * changes by tytso to allow root device specification
 * high loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
 * cross compiling fixes by Gertjan van Wingerde, July 1996
 * rewritten by martin Mares, April 1997
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/sysmacros.h>
#include <unistd.h>
#include <fcntl.h>
#include <asm/boot.h>

typedef unsigned char byte;
typedef unsigned short word;
typedef unsigned long u32;

#define default-maJOR-ROOT 0
#define default-miNOR-ROOT 0

/* minimal number of setup sectors (see also bootsect.S) */
#define setup-sectS 4

byte buf[1024];
int fd;
int is-big-kernel;

void die(const char * str, ...)
{
 va-list args;
 va-start(args, str);
 vfprintf(stderr, str, args);
 fputc('\n', stderr);
 exit(1);
}

void file-open(const char *name)
{
 if ((fd = open(name, O-RDONLY, 0)) < 0)
  die("unable to open `%s': %m", name);
}

void usage(void)
{
 die("usage: build [-b] bootsect setup system [rootdev] [> image]");
}

int main(int argc, char ** argv)
{
 unsigned int i, c, sz, setup-sectors;
 u32 sys-size;
 byte major-root, minor-root;
 struct stat sb;

(1)
 if (argc > 2 && !strcmp(argv[1], "-b"))
   {
     is-big-kernel = 1;
     argc--, argv++;
   }
 if ((argc < 4) || (argc > 5))
  usage();
 if (argc > 4) {
(2)
  if (!strcmp(argv[4], "CURRENT")) {
   if (stat("/", &sb)) {
    perror("/");
    die("couldn't stat /");
   }
   major-root = major(sb.st-dev);
   minor-root = minor(sb.st-dev);
  } else if (strcmp(argv[4], "FLOPPY")) {
   if (stat(argv[4], &sb)) {
    perror(argv[4]);
    die("couldn't stat root device.");
   }
   major-root = major(sb.st-rdev);
   minor-root = minor(sb.st-rdev);
  } else {
   major-root = 0;
   minor-root = 0;
  }
 } else {
  major-root = dEFAULT-MAJOR-ROOT;
  minor-root = dEFAULT-MINOR-ROOT;
 }
 fprintf(stderr, "Root device is (%d, %d)\n", major-root, minor-root);

(3)
 file-open(argv[1]);
 i = read(fd, buf, sizeof(buf));
 fprintf(stderr,"Boot sector %d bytes.\n",i);
 if (i != 512)
  die("boot block must be exactly 512 bytes");
 if (buf[510] != 0x55 || buf[511] != 0xaa)
  die("boot block hasn't got boot flag (0xAA55)");
 buf[508] = minor-root;
 buf[509] = major-root;
 if (write(1, buf, 512) != 512)
  die("write call failed");
 close (fd);

(4)
 file-open(argv[2]);        /* Copy the setup code */
 for (i=0 ; (c=read(fd, buf, sizeof(buf)))>0 ; i+=c )
  if (write(1, buf, c) != c)
   die("write call failed");
 if (c != 0)
  die("read-error on `setup'");
 close (fd);

(5)
 setup-sectors = (i + 511) / 512; /* Pad unused space with zeros */
 /* for compatibility with ancient versions of LILO. */
 if (setup-sectors < SETUP-SECTS)
  setup-sectors = SETUP-SECTS;
 fprintf(stderr, "Setup is %d bytes.\n", i);
 memset(buf, 0, sizeof(buf));
 while (i < setup-sectors * 512) {
  c = setup-sectors * 512 - i;
  if (c > sizeof(buf))
   c = sizeof(buf);
  if (write(1, buf, c) != c)
   die("write call failed");
  i += c;
 }

(6)
 file-open(argv[3]);
 if (fstat (fd, &sb))
  die("unable to stat `%s': %m", argv[3]);
 sz = sb.st-size;
 fprintf (stderr, "System is %d kB\n", sz/1024);
 sys-size = (sz + 15) / 16;
 /* 0x28000*16 = 2.5 MB, conservative estimate for the current maximum */
 if (sys-size > (is-big-kernel ? 0x28000 : DEF-SYSSIZE))
  die("system is too big. Try using %smodules.",
   is-big-kernel ? "" : "bzImage or ");
 if (sys-size > 0xefff)
  fprintf(stderr,"warning: kernel is too big for standalone boot "
      "from floppy\n");
 while (sz > 0) {
  int l, n;

  l = (sz > sizeof(buf)) ? sizeof(buf) : sz;
  if ((n=read(fd, buf, l)) != l) {
   if (n < 0)
    die("error reading %s: %m", argv[3]);
   else
    die("%s: unexpected EOF", argv[3]);
  }
  if (write(1, buf, l) != l)
   die("write failed");
  sz -= l;
 }
 close(fd);

 if (lseek(1, 497, SEEK-SET) != 497)      /* Write sizes to the bootsector */
  die("output: seek failed");
 buf[0] = setup-sectors;
 if (write(1, buf, 1) != 1)
  die("write of setup sector count failed");
 if (lseek(1, 500, SEEK-SET) != 500)
  die("output: seek failed");
 buf[0] = (sys-size & 0xff);
 buf[1] = ((sys-size >> 8) & 0xff);
 if (write(1, buf, 2) != 2)
  die("write of image length failed");

 return 0;         /* Everything is OK */
}

(1)
build의 command line에 -b 옵션을 주면 이는 big kernel 임을 의미하게 된다.
(2)
루트 디바이스의 major, minor 번호를 알아낸다.

currenT는 /의 major, minor number를 사용한다. 필자의 리눅스 박스는 hda1이 /이므로 major=0x03, minor=0x01이 될것이다.

플로피가 루트 디바이스로 지정됐으면 major=minor=0이 된다.

command line에 아무 것도 지정되지 않으면 기본 값이 사용된다(기본 값은 사실 플로피와 같은 값을 갖는다).

(3)
부트 섹터 파일을 읽어 512 byte가 아니면 에러를 낸다. 부트 섹터는 정확히 512 byte여야 하기 때문이다. 그리고 MagicNumber를 체크해 정말 부트 섹터인지 확인한다.

또 508(0x1FC), 509(0x1FD) 번째 바이트에 루트 디바이스의 minor, major 번호를 써 넣는다.

수정 후 표준 출력으로 bootsect의 512 byte를 출력한다(원래 512 byte 였으므로 수정 내용을 포함해 그대로 출력될 것이다).

(4)
setup은 크기가 정확히 얼마인지 알수 없으므로 1024 byte 단위로 읽으면서 크기를 변수 i에 기억해 놓는다. 읽은 1KB는 읽는 즉시 표준 출력을 출력된다.
(5)
setup을 512 byte 단위로 끊고 적어도 SETUP-SECTOR(값은 4) 만큼이 되는지 확인해 모자란 부분은 0으로 채워 넣는다. 디스크는 섹터 단위로 입출력한다는 것을 기억하기 바란다.

예를 들어 setup의 크기가 4768 byte라면 4768/512=9.3125 이므로 9 섹터를 차지하고 10번째 섹터는 다 사용하지 않고 조금만 사용하게 된다. 10번째 섹터의 경우 160 byte를 제외한 352 byte 만큼을 0으로 채워 넣는다.

(6)
압축된 커널의 크기를 계산해 zImage의 경우 0x7F000 보다 큰지 확인하고, bzImage는 0x280000 보다 큰지 확인한다. 만약 지정된 크기보다 크다면 현재로서는 수용할 수 없는 크기의 커널이므로 에러를 낸다. 또 플로피 부팅의 경우 플로피에 들어갈 수 있는 크기인지 확인한다.

1024 byte 단위로 읽어 표준 출력에 출력하고 bootsect의 497(0x1F1)에 setup이 몇 섹터를 차지하는지 기록하고 500(0x1F4)에 압축 커널의 크기를 16 byte 단위로 기록해준다.

주석

[1]

하위 1M에 대한 것은 2.2.2절을 참조한다.

2.3. bzimage가 만들어지는 과정 추적-Makefile 분석

bzimage가 만들어지는 과정을 살펴 보고 이를 따라가면서 Makefile의 자세한 내용을 알아본다. 정확한 것은 2.4.2절을 참조하기 바란다.

시작은 물론 $(topDIR)/Makefile로 부터 시작한다.

커널 makefile은 몇 부분으로 나눌 수 있다.

  1. 기본 정보 정의

  2. 커널 설정

  3. 커널 소스 의존성 만들기

  4. 모듈 만들기

  5. 커널 실행 파일 만들기

  6. 모듈 설치하기

각 부분이 명확하게 구분되는 것은 아니지만 make의 동작을 이해하는 사람이라면 대충 구분을 지어 이해할 수 있을 것이다. 구분은 커널을 컴파일 하는 절차에 따라 나눈 것으로 이해 하면 쉬울 것이다. 일반적으로 많이 쓰이지 않는 부분은 넘어가고 중요한 부분만을 자세히 이해하자.

시작에 앞서 사용되는 Makefile들을 설명해 놓는다. 이것 들을 참조로 추적해나가므로 시작하기에 앞서 한번 쯤 훑어 보는 것도 좋을 것이다.

2.3.1. $(topDIR)/Makefile

아래 makefile에 (1), (2)와 같이 표시된 것은 아래 줄에 대한 설명을 달아 놓은 것으로 Makefile의 끝 부분에 붙어 있는 설명을 참조해가면서 분석하면되겠다.


version = 2
patchlevel = 4
sublevel = 16
extraversion =

kernelrelease=$(veRSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)

(1)
arch := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)

(2)
kernelpath=kernel-$(shell echo $(KERNELRELEASE) | sed -e "s/-//")

(3)
config-shell := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
   else if [ -x /bin/bash ]; then echo /bin/bash; \
   else echo sh; fi ; fi)

(4)
topdir := $(shell /bin/pwd)

hpath    = $(topdIR)/include
findhpath = $(hpatH)/asm $(HPATH)/linux $(HPATH)/scsi $(HPATH)/net

(5)
hostcc   = gcc
hostcflags = -wall -Wstrict-prototypes -O2 -fomit-frame-pointer

(6)
cross-compile  =

(7)
#
# include the make variables (CC, etc...)
#
as  = $(cross-coMPILE)as
ld  = $(cross-coMPILE)ld
cc  = $(cross-coMPILE)gcc
cpp  = $(cc) -e
ar  = $(cross-coMPILE)ar
nm  = $(cross-coMPILE)nm
strip  = $(cross-COMPILE)strip
objcopy  = $(crosS-COMPILE)objcopy
objdump  = $(crosS-COMPILE)objdump
makefiles = $(topdIR)/.config
genksyms = /sbin/genksyms
depmod  = /sbin/depmod
modflags = -dmoduLE
cflags-kernel =
perl  = perl

(8)
export version paTCHLEVEL SUBLEVEL EXTRAVERSION KERNELRELEASE ARCH \
 config-shell topDIR HPATH HOSTCC HOSTCFLAGS CROSS-COMPILE AS LD CC \
 cpp ar nm strip OBJCOPY OBJDUMP MAKE MAKEFILES GENKSYMS MODFLAGS PERL

all: do-it-all

(9)
#
# make "config" the default target if there is no configuration file or
# "depend" the target if there is no top-level dependency information.
#
ifeq (.config,$(wildcard .config))
include .config
ifeq (.depend,$(wildcard .depend))
include .depend
do-it-all: version vmlinux
else
(10)
configuration = depend
do-it-all: depend
endif
else
(11)
configuration = config
do-it-all: config
endif

(12)
#
# install-path specifies where to place the updated kernel and system map
# images.  uncomment if you want to place them anywhere other than root.
#
#export install-paTH=/boot

(13)
#
# install-mod-path specifies a prefix to MODLIB for module directory
# relocations required by build roots.  This is not defined in the
# makefile but the arguement can be passed to make if needed.
#
modlib := $(instaLL-MOD-PATH)/lib/modules/$(KERNELRELEASE)
export modlib

#
# standard cflags
#
cppflags := -d--keRNEL-- -I$(HPATH)

cflags := $(cppflaGS) -Wall -Wstrict-prototypes -Wno-trigraphs -O2 \
   -fomit-frame-pointer -fno-strict-aliasing -fno-common
aflags := -d--asseMBLY-- $(CPPFLAGS)

(14)
#
# root-dev specifies the default root-device when making the image.
# this can be either FLOPPY, CURRENT, /dev/xxxx or empty, in which case
# the default of fLOPPY is used by 'build'.
# this is i386 specific.
#
export root-dev = CURRENT

(15)
#
# if you want to preset the SVGA mode, uncomment the next line and
# set svga-mode to whatever number you want.
# set it to -dsvga-MODE=NORMAL-VGA if you just want the EGA/VGA mode.
# the number is the same as you would ordinarily press at bootup.
# this is i386 specific.
#
export svga-mode = -DSVGA-MODE=NORMAL-VGA

(16)
#
# if you want the RAM disk device, define this to be the size in blocks.
# this is i386 specific.
#
#export ramdisk = -DRAMDISK=512

(17)
core-files =kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o
networks =net/network.o

libs  =$(topdir)/lib/lib.a
subdirs  =kernel drivers mm fs net ipc lib

(18)
drivers-n :=
drivers-y :=
drivers-m :=
drivers-  :=

drivers-$(config-aCPI) += drivers/acpi/acpi.o
drivers-$(config-pARPORT) += drivers/parport/driver.o
drivers-y += drivers/char/char.o \
 drivers/block/block.o \
 drivers/misc/misc.o \
 drivers/net/net.o \
 drivers/media/media.o
drivers-$(config-aGP) += drivers/char/agp/agp.o
drivers-$(config-dRM) += drivers/char/drm/drm.o
drivers-$(config-nUBUS) += drivers/nubus/nubus.a
drivers-$(config-iSDN) += drivers/isdn/isdn.a
drivers-$(config-nET-FC) += drivers/net/fc/fc.o
drivers-$(config-aPPLETALK) += drivers/net/appletalk/appletalk.o
drivers-$(config-tR) += drivers/net/tokenring/tr.o
drivers-$(config-wAN) += drivers/net/wan/wan.o
drivers-$(config-aRCNET) += drivers/net/arcnet/arcnetdrv.o
drivers-$(config-aTM) += drivers/atm/atm.o
drivers-$(config-iDE) += drivers/ide/idedriver.o
drivers-$(config-fC4) += drivers/fc4/fc4.a
drivers-$(config-sCSI) += drivers/scsi/scsidrv.o
drivers-$(config-fUSION-BOOT) += drivers/message/fusion/fusion.o
drivers-$(config-iEEE1394) += drivers/ieee1394/ieee1394drv.o

ifneq ($(config-cd-NO-IDESCSI)$(CONFIG-BLK-DEV-IDECD)$(CONFIG-BLK-DEV-SR)$(CONFIG-PARIDE-PCD),)
drivers-y += drivers/cdrom/driver.o
endif

drivers-$(config-sOUND) += drivers/sound/sounddrivers.o
drivers-$(config-pCI) += drivers/pci/driver.o
drivers-$(config-mTD) += drivers/mtd/mtdlink.o
drivers-$(config-pCMCIA) += drivers/pcmcia/pcmcia.o
drivers-$(config-nET-PCMCIA) += drivers/net/pcmcia/pcmcia-net.o
drivers-$(config-nET-WIRELESS) += drivers/net/wireless/wireless-net.o
drivers-$(config-pCMCIA-CHRDEV) += drivers/char/pcmcia/pcmcia-char.o
drivers-$(config-dIO) += drivers/dio/dio.a
drivers-$(config-sBUS) += drivers/sbus/sbus-all.o
drivers-$(config-zORRO) += drivers/zorro/driver.o
drivers-$(config-fC4) += drivers/fc4/fc4.a
drivers-$(config-aLL-PPC) += drivers/macintosh/macintosh.o
drivers-$(config-mAC) += drivers/macintosh/macintosh.o
drivers-$(config-iSAPNP) += drivers/pnp/pnp.o
drivers-$(config-sGI-IP22) += drivers/sgi/sgi.a
drivers-$(config-vT) += drivers/video/video.o
drivers-$(config-pARIDE) += drivers/block/paride/paride.a
drivers-$(config-hAMRADIO) += drivers/net/hamradio/hamradio.o
drivers-$(config-tC) += drivers/tc/tc.a
drivers-$(config-uSB) += drivers/usb/usbdrv.o
drivers-$(config-iNPUT) += drivers/input/inputdrv.o
drivers-$(config-i2O) += drivers/message/i2o/i2o.o
drivers-$(config-iRDA) += drivers/net/irda/irda.o
drivers-$(config-i2C) += drivers/i2c/i2c.o
drivers-$(config-pHONE) += drivers/telephony/telephony.o
drivers-$(config-mD) += drivers/md/mddev.o
drivers-$(config-bLUEZ) += drivers/bluetooth/bluetooth.o
drivers-$(config-hOTPLUG-PCI) += drivers/hotplug/vmlinux-obj.o

(19)
drivers := $(driveRS-y)

(20)
# files removed with 'make clean'
clean-files = \
 kernel/ksyms.lst include/linux/compile.h \
 vmlinux system.map \
 .tmp* \
 drivers/char/consolemap-deftbl.c drivers/video/promcon-tbl.c \
 drivers/char/conmakehash \
 drivers/char/drm/*-mod.c \
 drivers/pci/devlist.h drivers/pci/classlist.h drivers/pci/gen-devlist \
 drivers/zorro/devlist.h drivers/zorro/gen-devlist \
 drivers/sound/bin2hex drivers/sound/hex2hex \
 drivers/atm/fore200e-mkfirm drivers/atm/{pca,sba}*{.bin,.bin1,.bin2} \
 drivers/scsi/aic7xxx/aicasm/aicasm-gram.c \
 drivers/scsi/aic7xxx/aicasm/aicasm-scan.c \
 drivers/scsi/aic7xxx/aicasm/y.tab.h \
 drivers/scsi/aic7xxx/aicasm/aicasm \
 drivers/scsi/53c700-mem.c \
 net/khttpd/make-times-h \
 net/khttpd/times.h \
 submenu*
# directories removed with 'make clean'
clean-dirs = \
 modules

(21)
# files removed with 'make mrproper'
mrproper-files = \
 include/linux/autoconf.h include/linux/version.h \
 drivers/net/hamradio/soundmodem/sm-tbl-{afsk1200,afsk2666,fsk9600}.h \
 drivers/net/hamradio/soundmodem/sm-tbl-{hapn4800,psk4800}.h \
 drivers/net/hamradio/soundmodem/sm-tbl-{afsk2400-7,afsk2400-8}.h \
 drivers/net/hamradio/soundmodem/gentbl \
 drivers/sound/*-boot.h drivers/sound/.*.boot \
 drivers/sound/msndinit.c \
 drivers/sound/msndperm.c \
 drivers/sound/pndsperm.c \
 drivers/sound/pndspini.c \
 drivers/atm/fore200e-*-fw.c drivers/atm/.fore200e-*.fw \
 .version .config* config.in config.old \
 scripts/tkparse scripts/kconfig.tk scripts/kconfig.tmp \
 scripts/lxdialog/*.o scripts/lxdialog/lxdialog \
 .menuconfig.log \
 include/asm \
 .hdepend scripts/mkdep scripts/split-include scripts/docproc \
 $(topdir)/include/linux/modversions.h \
 kernel.spec

# directories removed with 'make mrproper'
mrproper-dirs = \
 include/config \
 $(topdir)/include/linux/modules

(22)
include arch/$(arcH)/Makefile

(23)
export cppflags cFLAGS AFLAGS

export networks dRIVERS LIBS HEAD LDFLAGS LINKFLAGS MAKEBOOT ASFLAGS

(24)
.s.s:
 $(cpp) $(aflags) -traditional -o $*.s $<.s.o:
 $(cc) $(aflags) -traditional -c -o $*.o $<
version: dummy
 @rm -f include/linux/compile.h

boot: vmlinux
 @$(make) cflags="$(CFLAGS) $(CFLAGS-KERNEL)" -C arch/$(ARCH)/boot

(25)
vmlinux: include/linux/version.h $(CONFIGURATION) init/main.o init/version.o linuxsubdirs
 $(ld) $(linkflagS) $(HEAD) init/main.o init/version.o \
  --start-group \
  $(core-files) \
  $(drivers) \
  $(networks) \
  $(libs) \
  --end-group \
  -o vmlinux
 $(nm) vmlinux | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map

(26)
symlinks:
 rm -f include/asm
 ( cd include ; ln -sf asm-$(ARCH) asm)
 @if [ ! -d include/linux/modules ]; then \
  mkdir include/linux/modules; \
 fi

(27)
oldconfig: symlinks
 $(config-shell) scripts/Configure -d arch/$(ARCH)/config.in

xconfig: symlinks
 $(make) -c scripts kconfig.tk
 wish -f scripts/kconfig.tk

menuconfig: include/linux/version.h symlinks
 $(make) -c scripts/lxdialog all
 $(config-shell) scripts/Menuconfig arch/$(ARCH)/config.in

config: symlinks
 $(config-shell) scripts/Configure arch/$(ARCH)/config.in

include/config/marKER: scripts/split-include include/linux/autoconf.h
 scripts/split-include include/linux/autoconf.h include/config
 @ touch include/config/MARKER

(28)
linuxsubdirs: $(patsubst %, -dir-%, $(SUBDIRS))

(29)
$(patsubst %, -dir-%, $(SUBDIRS)) : dummy include/linux/version.h include/config/MARKER
 $(make) cflags="$(CFLAGS) $(CFLAGS-KERNEL)" -C $(patsubst -dir-%, %, $@)

$(topdir)/include/linux/version.h: include/linux/version.h
$(topdir)/include/linux/compile.h: include/linux/compile.h

newversion:
 . scripts/mkversion > .tmpversion
 @mv -f .tmpversion .version

(30)
include/linux/compile.h: $(CONFIGURATION) include/linux/version.h newversion
 @echo -n \#define UTS-VERSION \"\#`cat .version` > .ver
 @if [ -n "$(confIG-SMP)" ] ; then echo -n " SMP" >> .ver; fi
 @if [ -f .name ]; then  echo -n \-`cat .name` >> .ver; fi
 @echo ' '`date`'"' >> .ver
 @echo \#define lINUX-COMPILE-TIME \"`date +%T`\" >> .ver
 @echo \#define lINUX-COMPILE-BY \"`whoami`\" >> .ver
 @echo \#define lINUX-COMPILE-HOST \"`hostname`\" >> .ver
 @if [ -x /bin/dnsdomainname ]; then \
    echo \#define LINUX-COMPILE-DOMAIN \"`dnsdomainname`\"; \
  elif [ -x /bin/domainname ]; then \
    echo \#define LINUX-COMPILE-DOMAIN \"`domainname`\"; \
  else \
    echo \#define LINUX-COMPILE-DOMAIN ; \
  fi >> .ver
 @echo \#define lINUX-COMPILER \"`$(CC) $(CFLAGS) -v 2>&1 | tail -1`\" >> .ver
 @mv -f .ver $@

(31)
include/linux/version.h: ./Makefile
 @echo \#define uTS-RELEASE \"$(KERNELRELEASE)\" > .ver
 @echo \#define lINUX-VERSION-CODE `expr $(VERSION) \\* 65536 + $(PATCHLEVEL) \\* 256 + $(SUBLEVEL)` >> .ver
 @echo '#define kERNEL-VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))' >> .ver
 @mv -f .ver $@

init/version.o: init/version.c include/linux/compile.h include/config/MARKER
 $(cc) $(cflags) $(CFLAGS-KERNEL) -DUTS-MACHINE='"$(ARCH)"' -c -o init/version.o init/version.c

(32)
init/main.o: init/main.c include/config/MARKER
 $(cc) $(cflags) $(CFLAGS-KERNEL) $(PROFILING) -c -o $*.o $<
(33)
fs lib mm ipc kernel drivers net: dummy
 $(make) cflags="$(CFLAGS) $(CFLAGS-KERNEL)" $(subst $@, -dir-$@, $@)

(34)
# emacs, vi용 tag를 만든다.
tags: dummy
 etags `find include/asm-$(ARCH) -name '*.h'`
 find include -type d \( -name "asm-*" -o -name config \) -prune -o -name '*.h' -print | xargs etags -a
 find $(subdirs) init -name '*.[ch]' | xargs etags -a

# exuberant ctags works better with -I
tags: dummy
 ctagsf=`ctags --version | grep -i exuberant >/dev/null && echo "-I --initdata,--exitdata,EXPORT-SYMBOL,EXPORT-SYMBOL-NOVERS"`; \
 ctags $$ctagsf `find include/asm-$(ARCH) -name '*.h'` && \ find include -type d \( -name "asm-*" -o -name config \) -prune -o -name '*.h' -print | xargs ctags $$CTAGSF -a && \
 find $(subdirs) init -name '*.[ch]' | xargs ctags $$CTAGSF -a

ifdef config-modulES
ifdef config-modveRSIONS
modflags += -dmodvERSIONS -include $(HPATH)/linux/modversions.h
endif

(35)
.phony: modules
modules: $(patsubst %, -mod-%, $(SUBDIRS))

.phony: $(patsubst %, -mod-%, $(SUBDIRS))
$(patsubst %, -mod-%, $(SUBDIRS)) : include/linux/version.h include/config/MARKER
 $(make) -c $(patsubst -mod-%, %, $@) CFLAGS="$(CFLAGS) $(MODFLAGS)" MAKING-MODULES=1 modules

.phony: modules-install
modules-install: -modinst- $(patsubst %, -modinst-%, $(SUBDIRS)) -modinst-post

.phony: -modinst-
-modinst-:
 @rm -rf $(modlib)/kernel
 @rm -f $(modlib)/build
 @mkdir -p $(modlIB)/kernel
 @ln -s $(topdir) $(MODLIB)/build

(36)
# if system.map exists, run depmod.  This deliberately does not have a
# dependency on system.map since that would run the dependency tree on
# vmlinux.  this depmod is only for convenience to give the initial
# boot a modules.dep even before / is mounted read-write.  However the
# boot script depmod is the master version.
ifeq "$(strip $(inSTALL-MOD-PATH))" ""
depmod-opts :=
else
depmod-opts := -b $(INSTALL-MOD-PATH) -r
endif
.phony: -modinst-post
-modinst-post: -modinst-post-pcmcia
 if [ -r system.map ]; then $(DEPMOD) -ae -F System.map $(depmod-opts) $(KERNELRELEASE); fi

# backwards compatibilty symlinks for people still using old versions
# of pcmcia-cs with hard coded pathnames on insmod.  Remove
# -modinst-post-pcmcia for kernel 2.4.1.
.phony: -modinst-post-pcmcia
-modinst-post-pcmcia:
 cd $(modlib); \
 mkdir -p pcmcia; \
 find kernel -path '*/pcmcia/*' -name '*.o' | xargs -i -r ln -sf ../{} pcmcia

.phony: $(patsubst %, -modinst-%, $(SUBDIRS))
$(patsubst %, -modinst-%, $(SUBDIRS)) :
 $(make) -c $(patsubst -modinst-%, %, $@) modules-install

# modules disabled....

else
modules modules-install: dummy
 @echo
 @echo "the present kernel configuration has modules disabled."
 @echo "type 'make config' and enable loadable module support."
 @echo "then build a kernel with module support enabled."
 @echo
 @exit 1
endif

clean: archclean
 find . \( -name '*.[oas]' -o -name core -o -name '.*.flags' \) -type f -print \
  | grep -v lxdialog/ | xargs rm -f
 rm -f $(clean-fiLES)
 rm -rf $(clean-dIRS)
 $(make) -c documentation/DocBook clean

mrproper: clean archmrproper
 find . \( -size 0 -o -name .depend \) -type f -print | xargs rm -f
 rm -f $(mrproper-FILES)
 rm -rf $(mrpropeR-DIRS)
 $(make) -c documentation/DocBook mrproper

(37)
distclean: mrproper
 rm -f core `find . \( -not -type d \) -and \
  \( -name '*.orig' -o -name '*.rej' -o -name '*~' \
  -o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
  -o -name '.*.rej' -o -name '.SUMS' -o -size 0 \) -type f -print` TAGS tags

backup: mrproper
 cd .. && tar cf - linux/ | gzip -9 > backup.gz
 sync

sgmldocs:
 chmod 755 $(topdIR)/scripts/docgen
 chmod 755 $(topdIR)/scripts/gen-all-syms
 chmod 755 $(topdIR)/scripts/kernel-doc
 $(make) -c $(topDIR)/Documentation/DocBook books

psdocs: sgmldocs
 $(make) -c documentation/DocBook ps

pdfdocs: sgmldocs
 $(make) -c documentation/DocBook pdf

htmldocs: sgmldocs
 $(make) -c documentation/DocBook html

sums:
 find . -type f -print | sort | xargs sum > .SUMS

dep-files: scripts/mkdep archdep include/linux/version.h
 scripts/mkdep -- init/*.c > .depend
 scripts/mkdep -- `find $(FINDHPATH) -name SCCS -prune -o -follow -name \*.h ! -name modversions.h -print` > .hdepend
 $(make) $(patsubst %,-sfdep-%,$(SUBDIRS)) -FASTDEP-ALL-SUB-DIRS="$(SUBDIRS)"
ifdef config-modveRSIONS
 $(make) update-modverfile
endif

ifdef config-modveRSIONS
modverfile := $(toPDIR)/include/linux/modversions.h
else
modverfile :=
endif
export modverfile

depend dep: dep-files

checkconfig:
 find * -name '*.[hcS]' -type f -print | sort | xargs $(PERL) -w scripts/checkconfig.pl

checkhelp:
 find * -name [cc]onfig.in -print | sort | xargs $(PERL) -w scripts/checkhelp.pl

checkincludes:
 find * -name '*.[hcS]' -type f -print | sort | xargs $(PERL) -w scripts/checkincludes.pl

ifdef configuratioN
..$(configuration):
 @echo
 @echo "you have a bad or nonexistent" .$(CONFIGURATION) ": running 'make" $(CONFIGURATION)"'"
 @echo
 $(make) $(configURATION)
 @echo
 @echo "successful. Try re-making (ignore the error that follows)"
 @echo
 exit 1

#dummy: ..$(configURATION)
dummy:

else

dummy:

endif

(38)
include rules.make

(39)
#
# this generates dependencies for the .h files.
#

scripts/mkdep: scripts/mkdep.c
 $(hostcc) $(hostCFLAGS) -o scripts/mkdep scripts/mkdep.c

scripts/split-include: scripts/split-include.c
 $(hostcc) $(hostCFLAGS) -o scripts/split-include scripts/split-include.c

(40)
#
# rpm target
#
# if you do a make spec before packing the tarball you can rpm -ta it
#
spec:
 . scripts/mkspec > kernel.spec

#
# build a tar ball, generate an rpm from it and pack the result
# there arw two bits of magic here
# 1) the use of /. to avoid tar packing just the symlink
# 2) removing the .dep files as they have source paths in them that
#    will become invalid
#
rpm: clean spec
 find . \( -size 0 -o -name .depend -o -name .hdepend \) -type f -print | xargs rm -f
 set -e; \
 cd $(topdir)/.. ; \
 ln -sf $(topdir) $(KERNELPATH) ; \
 tar -cvz --exclude CVS -f $(KERNELPATH).tar.gz $(KERNELPATH)/. ; \
 rm $(kernelpath) ; \
 cd $(topdir) ; \
 . scripts/mkversion > .version ; \
 rpm -ta $(topdir)/../$(KERNELPATH).tar.gz ; \
 rm $(topdir)/../$(KERNELPATH).tar.gz
   

(1)
arch는 아래와 같이 uname으로 얻어지는 아키텍쳐를 지칭하는 값을 갖는다. intel 계열에선 i386이 되고 ARM 계열에선 arm이 된다.
(2)
kernelPATH는 kernel-2.4.16이 된다.
(3)
현재 사용 중인 shell을 알아낸다.
(4)
topdir은 커널 소스 코드가 들어있는 최상위 디렉토리
(5)
host가 붙은 것은 커널이 cross compile 되서 다른 아키텍쳐용 바이너리를 만들 수도 있기 때문에 실제 커널을 구성하는 코드 외에 커널을 만들기 위해 필요한 몇 몇 프로그램을 호스트 상에서 돌리기 위한 컴파일러를 지정 하는 것이다.
(6)
보통의 경우 HOST와 TARGET이 같으면 CROSS-COMPILE에 아무 것도 없으나 target이 다르면 여기에 컴파일러의 prefix를 적어줘야한다. 예를 들어 PDA에 많이 사용되는 arm processor를 TARGET으로한 경우엔 cross-COMPILE = arm-linux- 와 같이 된다.
(7)
위에서 정의한 CROSS-COMPILE이 컴파일러 등의 prefix로 쓰이는데 arm processor의 경우엔 CC = arm-linux-gcc 와 같이 된다.
(8)
여기 까지 정의된 변수들은 커널 컴파일 전반에 사용될 것들이므로 아래와 같이 해서 각 디렉토리 등에 들어있는 Makefile로 값을 전달해 준다.
(9)
리눅스 커널은 컴파일 전에 반드시 설정/의존성설정이 되어있어야 하므로 어느 경우든 두 절차를 검사한다. 먼저 .config가 있다는 것은 커널 설정이 된 상태를 의미하고 .depend는 의존성설정이 끝난 것을 의미한다.
(10)
.config는 있지만 .depend는 없는 경우
(11)
.config가 없는 경우엔 커널 설정을 먼저하도록 한다.
(12)
커널 컴파일이 끝나고 설치될 디렉토리를 지정한다. 보통은 사용되지 않는다.
(13)
module이 설치될 디렉토리를 지정한다. 보통은 /lib/modules/2.4.16 과 같이된다.
(14)
i386 아키텍쳐에서 루트 디바이스를 지정한다. currenT는 커널 컴파일 할 당시의 root device를 의미한다.
(15)
i386 아키텍쳐에서 초기 부팅시의 화면 모드를 설정한다.
(16)
i386에서 램디스크가 필요한 경우 사용한다.
(17)
core-fILES는 리눅스 커널을 이루는 근간이 되는 몇 몇 부분을 나타낸다. 리눅스 커널은 아래와 같이 kernel, drivers, mm, fs, ipc, network, lib로 구분된다고 볼수 있다.
(18)
커널 설정할 때 어떤 기능을 yes, no, module로 설정할 수 있는데 yes로하면 driverS-y에, no는 DRIVERS-n에, module은 DRIVERS-m에 모이게 된다.

예를 들어 ACPI 기능을 사용하지 않는다고 했을 경우엔 아래 줄이 driverS- += drivers/acpi/acpi.o가 된다. .config의 내용을 한번 읽어보면 금방 이해될 것이다.

(19)
실제 커널에 포함되는 드라이버는 모두 DRIVERS에 기록된다.
(20)
make clean 했을 때 지워지는 file들을 지정한다. clean은 object 등을 지울 뿐 커널 설정 등은 지우지 않는다.
(21)
mrproper는 세팅까지도 지워버리고 완전히 초기화 시켜버린다.
(22)
리눅스 커널은 여러 종류의 타켓을 지원하므로 처음 Makefile에서 확인한 아키텍처에 따른 Makefile을 읽어 사용하게 된다. make bzImage 등을 했을 때 사용되는 Makefile은 여기서 include 된다.
(23)
필요한 플래그를 export 해서 하위 디렉토리 등에서 make 할 때도 여기에서 적용된 사항들이 같이 적용될 수 있도록 한다.
(24)
어셈블리 코드 컴파일 방법을 지정
(25)
컴파일된 커널이 일차적으로 하나로 뭉쳐 vmlinux를 만들어낸다. 이 것을 압축하고 부팅에 관계된 코드를 덧붙여주면 커널이 완성된다.
(26)
include 디렉토리 내의 심볼릭 링크를 설정한다.
(27)
커널 세팅하는 방법에 따라 설정에 필요한 프로그램을 만들고 설정을 시작한다.
(28)
linuxsubdirs는 SUBDIRS에 정의된 것들에서 앞에 -dir-을 붙여 새로운 이름을 하나씩 만들어낸다.

patsubst는 $(patsubst PATTERN, REPLACEMENT, TEXT)의 형식으로 TEXT에서 patterN과 일치하는 부분을 REPLACEMENT로 교체한다.

(29)
각 하위 디렉토리를 make 한다. patsubst에 의해 실제 디렉토리로 이동하게 된다.
(30)
컴파일한 시간, 누가 했는가, gcc 버전 등이 기록된다. 내용은 아래와 같다.
#define uts-versioN "#11 2002. 01. 25. (금) 16:35:16 KST"
#define linux-compILE-TIME "16:35:16"
#define linux-compILE-BY "root"
#define linux-compILE-HOST "halite"
#define linux-compILE-DOMAIN ""
#define linux-compILER "gcc version 2.95.3 20010315 (release)"
(31)
include/linux/version.h는 현재 컴파일 될 리눅스 커널의 버전 정보를 담는 헤더 파일이고 아래 스크립트에 의해 만들어진다. 내용은 아래 3줄과 같다.

# #define uts-releASE "2.4.16"
# #define linux-veRSION-CODE 132112
# #define kernel-vERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))

(32)
main.c엔 start-kernel()이 들어있고 이 함수는 LILO등에 의해 메모리에 올려진 커널이 불리게되는 시작 위치다.
(33)
하위 디렉토리는 위에 정의된 하위 디렉토리 make 방법에 따라 make 된다. 즉 $(patsubst %, -dir-%, $(SUBDIRS))에 의해 make 된다.
(34)
emacs, vi용 tag를 만든다.
(35)
module로 지정된 놈들을 다 만들어준다.

.phony를 사용하면 정의된 이름이 file이 아님을 알려주고 퍼포먼스를 올려준다. 자세한 것은 'info make'를 해서 참조 바란다.

(36)
커널을 컴파일할 때 System.map이 만들어지는데 이게 존재하는 경우 module의 dependency를 만들어준다.
(37)
distclean은 현재 커널 버전 개발을 끝내고 release하려할 때 실행한다.
(38)
리눅스 커널은 많은 하위 디렉토리가 있고 여기에 각각의 Makefile이 존재하는데 공통으로 사용될 수 있는 것을을 모아 Rules.make로 만들고 이를 사용한다.
(39)
커널 설정을 마친 후 헤더와 소스사이의 의존관계를 만들어주는 실행 파일을 만든다.
(40)
rpm 배포용 spec 파일과 rpm 파일을 만든다.

2.3.2. $(topDIR)/arch/i386/Makefile


(1)  
#
# i386/makefile
#
# this file is included by the global makefile so that you can add your own
# architecture-specific flags and dependencies. Remember to do have actions
# for "archclean" and "archdep" for cleaning up and making dependencies for
# this architecture
#
# 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) 1994 by Linus Torvalds
#
# 19990713  artur Skawina <
skawina@geocities.com>
#           added '-march' and '-mpreferred-stack-boundary' support
#

(2)  
ld=$(cross-compile)ld -m elf-i386
objcopy=$(cross-coMPILE)objcopy -O binary -R .note -R .comment -S
ldflags=-e stext
linkflags =-t $(toPDIR)/arch/i386/vmlinux.lds $(LDFLAGS)

cflags += -pipe

(3)
# prevent gcc from keeping the stack 16 byte aligned
cflags += $(shell if $(CC) -mpreferred-stack-boundary=2 -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-mpreferred-stack-boundary=2"; fi)

ifdef config-m386
cflags += -march=i386
endif

ifdef config-m486
cflags += -march=i486
endif

ifdef config-m586
cflags += -march=i586
endif

ifdef config-m586tSC
cflags += -march=i586
endif

ifdef config-m586mMX
cflags += -march=i586
endif

ifdef config-m686
cflags += -march=i686
endif

ifdef config-mpentIUMIII
cflags += -march=i686
endif

ifdef config-mpentIUM4
cflags += -march=i686
endif

(4)
ifdef config-mk6
cflags += $(shell if $(CC) -march=k6 -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-march=k6"; else echo "-march=i586"; fi)
endif

(5)
ifdef config-mk7
cflags += $(shell if $(CC) -march=athlon -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-march=athlon"; else echo "-march=i686 -malign-functions=4"; fi)
endif

ifdef config-mcrusOE
cflags += -march=i686 -malign-functions=0 -malign-jumps=0 -malign-loops=0
endif

ifdef config-mwincHIPC6
cflags += -march=i586
endif

ifdef config-mwincHIP2
cflags += -march=i586
endif

ifdef config-mwincHIP3D
cflags += -march=i586
endif

ifdef config-mcyriXIII
cflags += -march=i586
endif

head := arch/i386/kernel/head.o arch/i386/kernel/init-task.o

subdirs += arch/i386/kernel arch/i386/mm arch/i386/lib

core-files := arch/i386/kernel/kernel.o arch/i386/mm/mm.o $(CORE-FILES)
libs := $(topdir)/arch/i386/lib/lib.a $(LIBS) $(TOPDIR)/arch/i386/lib/lib.a

ifdef config-math-EMULATION
subdirs += arch/i386/math-emu
drivers += arch/i386/math-emu/math.o
endif

arch/i386/kernel: dummy
 $(make) linuxsubdirs SUBDIRS=arch/i386/kernel

arch/i386/mm: dummy
 $(make) linuxsubdirs SUBDIRS=arch/i386/mm

makeboot = $(make) -C arch/$(ARCH)/boot

vmlinux: arch/i386/vmlinux.lds

force: ;

.phony: zimage bzimage compressed zlilo bzlilo zdisk bzdisk install \
  clean archclean archmrproper archdep

zimage: vmlinux
 @$(makeboot) zimage

(6)
bzimage: vmlinux
 @$(makeboot) bzimage

compressed: zimage

zlilo: vmlinux
 @$(makeboot) booTIMAGE=zImage zlilo

tmp:
 @$(makeboot) booTIMAGE=bzImage zlilo
bzlilo: vmlinux
 @$(makeboot) booTIMAGE=bzImage zlilo

zdisk: vmlinux
 @$(makeboot) booTIMAGE=zImage zdisk

bzdisk: vmlinux
 @$(makeboot) booTIMAGE=bzImage zdisk

install: vmlinux
 @$(makeboot) booTIMAGE=bzImage install

archclean:
 @$(makeboot) clean

archmrproper:

archdep:
 @$(makeboot) dep
   

(1)
이 makefile은 $(TOPDIR)/Makefile에 의해 읽여 들여지므로 export된 많은 변수들을 그대로 사용 가능하다.
(2)
ld는 최종 output을 elf-i386의 형태로 만든다.

objcopy는 입력에서 .note, .comment 섹션을 삭제하고 리로케이션 정보와 심볼 정보를 삭제한다. 출력 포맷은 binary. 링크할 땐 $(TOPDIR)/arch/i386/vmlinux.lds란 파일에 기록되어 있는 방법을 따라 링크한다.

(3)
gcc가 스택을 16 byte 단위로 정렬하지 못하도록 한다.

사용되는 옵션은 다음과 같은 의미를 갖는다.

  • -mpreferred-stack-boundary=2 : 스택을 22 byte로 정렬하도록 한다. (=4면 24)

  • -S : 컴파일 스테이지까지만 하고 어셈블은 하지 않는다.

  • -xc : c 언어로 컴파일 한다.

즉 스택 바운더리 정렬이 4 바이트로 가능한지 알아봐서 가능하면 4 바이트 정렬을 사용한다. 만약 4 바이트 정렬을 지원하지 않으면 컴파일 중에 에러가 날 것이다. 이땐 기본 값을 사용한다.

/dev/null이 $(CC)의 입력으로 지정됐으므로 /dev/null을 읽어 컴파일한다. /dev/null을 읽으면 EOF를 돌려주므로 컴파일된 출력은 다음과 같을 것이지만 바로 /dev/null로 출력되어 화면에는 나타나지 않는다.

컴파일되면 다음과 같은 결과가 나온다.

 .file   "null" 
 .version    "01.01"
gcc2-compiled.:
 .ident  "gcc: (gNU) 2.95.3 20010315 (release)"
     

에러 없이 컴파일이 끝나면 $(CC)의 결과는 true가 될 것이고 에러가 있다면 false가 될 것이다. >/dev/null 2>&1은 출력되는 에러 메시지는 화면에 나오게 하지 않고 결과가 true인지 false인지만을 판별 하기 위해 넣은 것이다.

(4)
amd k6 CPU는 지원하는지 여부에 따라 지원하지 않을 경우엔 i586으로 간주한다.
(5)
athlon을 사용한다고 했지만 지원하는지 판단 후 지원하지 않으면 i686으로 간주하고 정렬을 16 바이트로 한다.
(6)
bzimage를 만들 경우엔 먼저 vmlinux를 만들고 나서 $(TOPDIR)/arch/i386/boot에서 make bzImage를 다시 실행한다.

2.3.3. $(topDIR)/arch/i386/boot/Makefile

 

#
# arch/i386/boot/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) 1994 by Linus Torvalds
#

boot-incl = $(topdIR)/include/linux/config.h \
  $(topdir)/include/linux/autoconf.h \
  $(topdir)/include/asm/boot.h

(1)
zimage: $(configurE) bootsect setup compressed/vmlinux tools/build
 $(objcopy) compressed/vmlinux compressed/vmlinux.out
 tools/build bootsect setup compressed/vmlinux.out $(ROOT-DEV) > zImage

(2)
bzimage: $(configuRE) bbootsect bsetup compressed/bvmlinux tools/build
 $(objcopy) compressed/bvmlinux compressed/bvmlinux.out
 tools/build -b bbootsect bsetup compressed/bvmlinux.out $(ROOT-DEV) > bzImage

compressed/vmlinux: $(TOPDIR)/vmlinux
 @$(make) -c compressed vmlinux

compressed/bvmlinux: $(TOPDIR)/vmlinux
 @$(make) -c compressed bvmlinux

zdisk: $(bootimage)
 dd bs=8192 if=$(BOOTIMAGE) of=/dev/fd0

zlilo: $(configure) $(BOOTIMAGE)
 if [ -f $(instalL-PATH)/vmlinuz ]; then mv $(INSTALL-PATH)/vmlinuz $(INSTALL-PATH)/vmlinuz.old; fi
 if [ -f $(instalL-PATH)/System.map ]; then mv $(INSTALL-PATH)/System.map $(INSTALL-PATH)/System.old; fi
 cat $(bootimage) > $(INSTALL-PATH)/vmlinuz
 cp $(topdir)/system.map $(INSTALL-PATH)/
 if [ -x /sbin/lilo ]; then /sbin/lilo; else /etc/lilo/install; fi

install: $(configuRE) $(BOOTIMAGE)
 sh -x ./install.sh $(KERNELRELEASE) $(BOOTIMAGE) $(TOPDIR)/System.map "$(INSTALL-PATH)"

(3)
tools/build: tools/build.c
 $(hostcc) $(hostCFLAGS) -o $@ $< -I$(TOPDIR)/include

bootsect: bootsect.o
 $(ld) -ttext 0x0 -s --oformat binary -o $@ $<

bootsect.o: bootsect.s
 $(as) -o $@ $<

bootsect.s: bootsect.S Makefile $(BOOT-INCL)
 $(cpp) $(cppflagS) -traditional $(SVGA-MODE) $(RAMDISK) $< -o $@

(4)
bbootsect: bbootsect.o
 $(ld) -ttext 0x0 -s --oformat binary $< -o $@

bbootsect.o: bbootsect.s
 $(as) -o $@ $<

(5)
bbootsect.s: bootsect.S Makefile $(BOOT-INCL)
 $(cpp) $(cppflagS) -D--BIG-KERNEL-- -traditional $(SVGA-MODE) $(RAMDISK) $< -o $@

setup: setup.o
 $(ld) -ttext 0x0 -s --oformat binary -e begtext -o $@ $<

setup.o: setup.s
 $(as) -o $@ $<

setup.s: setup.s video.S Makefile $(BOOT-INCL) $(TOPDIR)/include/linux/version.h $(TOPDIR)/include/linux/compile.h
 $(cpp) $(cppflagS) -D--ASSEMBLY-- -traditional $(SVGA-MODE) $(RAMDISK) $< -o $@

(6)
bsetup: bsetup.o
 $(ld) -ttext 0x0 -s --oformat binary -e begtext -o $@ $<

bsetup.o: bsetup.s
 $(as) -o $@ $<

bsetup.s: setup.s video.S Makefile $(BOOT-INCL) $(TOPDIR)/include/linux/version.h $(TOPDIR)/include/linux/compile.h
 $(cpp) $(cppflagS) -D--BIG-KERNEL-- -D--ASSEMBLY-- -traditional $(SVGA-MODE) $(RAMDISK) $< -o $@

dep:

clean:
 rm -f tools/build
 rm -f setup bootsect zImage compressed/vmlinux.out
 rm -f bsetup bbootsect bzImage compressed/bvmlinux.out
 @$(make) -c compressed clean

(1)
현재 커널은 zImage, bzImage 두 가지가 존재 한다.

zimage는 gzip으로 압축되고 하위 1M 메모리 내에 적재될 수 있는 크기의 커널 [1]

bzimage는 gzip으로 압축되고 하위 1M 메모리 내에 적재될 수 없는 크기의 커널

$(objcOPY)는 $(TOPDIR)/arch/i386/Makefile에서 정의된 것을 따른다. 즉 'objcoPY=$(CROSS-COMPILE)objcopy -O binary -R .note -R .comment -S'가 된다.

(2)
bvmlinux를 objcopy를 사용해 심볼 등을 빼고 build란 것을 사용해 최종 커널을 만든다. build는 bbootsect(512 bytes)+bsetup+bvmlinux.out을 합쳐 하나의 bzImage를 만든다 (그림 2-2).
(3)
build 프로그램은 최종 커널을 만드는 유틸리티다. 더 자세한 것은 여기에서 다룬다.
(4)
어셈블 끝난 bbootsect.o를 링크한다. 사용된 옵션은

-ttext 0x0 : 코드의 시작을 0번지 부터 시작한다고 하고 링크한다. 이렇게 하면 링크된 최종 출력물은 특별한 위치를 가리지 않고 메모리의 아무 위치에나 적재가 가능하고 실행 가능해진다.

-s : 출력물에서 심볼 정보를 모두 없앤다.

--oformat binary : 출력물의 포맷을 바이너리로 한다.

(5)
bootsect.S를 프리컴파일하는데 --BIG-KERNEL--을 정의해 bzImage의 부트 섹터를 만든다. 초기 vga 모드와 램디스크 크기 등을 정보로 전달해 준다.
(6)
bsetup 또한 bbootsect와 같은 방법으로 만들어진다.

2.3.4. $(topDIR)/arch/i386/boot/compressed/Makefile

#
# linux/arch/i386/boot/compressed/Makefile
#
# create a compressed vmlinux image from the original vmlinux
#

head = head.o
system = $(topdir)/vmlinux

objects = $(head) misc.o

zldflags = -e startup-32

(1)
# zimage-offset is the load offset of the compression loader
# bzimage-offset is the load offset of the high loaded compression loader
#
zimage-offset = 0x1000
bzimage-offset = 0x100000

zlinkflags = -ttext $(ZIMAGE-OFFSET) $(ZLDFLAGS)
bzlinkflags = -ttext $(BZIMAGE-OFFSET) $(ZLDFLAGS)

all: vmlinux

vmlinux: piggy.o $(OBJECTS)
 $(ld) $(zlinkflaGS) -o vmlinux $(OBJECTS) piggy.o

(2)
bvmlinux: piggy.o $(OBJECTS)
 $(ld) $(bzlinkflAGS) -o bvmlinux $(OBJECTS) piggy.o

(3)
head.o: head.s
 $(cc) $(aflags) -traditional -c head.S

misc.o: misc.c
 $(cc) $(cflags) -c misc.c

(4)
piggy.o: $(system)
 tmppiggy=-tmp-$$$$piggy; \
 rm -f $$tmppiggy $$tmppiggy.gz $$tmppiggy.lnk; \
 $(objcopy) $(sysTEM) $$tmppiggy; \
 gzip -f -9 < $$tmppiggy > $$tmppiggy.gz; \
 echo "sections { .data : { input-len = .; LONG(input-data-end - input-data) input-data = .; *(.data) input-data-end = .; }}" >gt; $$tmppiggy.lnk; \
 $(ld) -r -o piggy.o -b binary $$tmppiggy.gz -b elf32-i386 -T $$tmppiggy.lnk; \
 rm -f $$tmppiggy $$tmppiggy.gz $$tmppiggy.lnk

clean:
 rm -f vmlinux bvmlinux -tmp-*

(1)
zimage와 bzImage의 메모리 적재 위치가 서로 달라 zImage는 0x1000에서 부터 메모리에 적재되고 bzImage는 0x100000에 적재된다.
(2)
bvmlinux는 vmlinux와 마찬가지로 heas.o, misc.o, piggy.o가 합쳐져 만들어진다. 그러나 링크 플래그가 서로 다르게 설정되어있다.
(3)
커널의 압축을 풀고 메모리에 적재 하는 등의 일을 하는 부분이다.
(4)
커널의 핵심 부분이 모두 컴파일되 링크되면 elf type으로 $(TOP-DIR)/vmlinux가 만들어지는데 이것에서 디버깅 정보 등을 없애고 압축해서 만든 것이 piggy.o가 된다. 압축은 gzip으로 한다.

$$$$piggy의 4개의 $는 4자리의 임의의 숫자로 채워진다. 즉 tmppiggy=-tmp-1234piggy와 같이된다. 더불어 $$tmppiggy.gz 은 -tmp-1234piggy.gz, tmppiggy.lnk는 -tmp-1234piggy.lnk와 같이 된다.

piggy.o는 head.o, misc.o와 합쳐져 하나의 다른 file로 만들어져야하므로 다시 링커를 통해 elf-i386 포맷으로 만들어진다.

$(objcOPY)에 사용된 옵션은 다음과 같다.

  • -O : output format. 여기선 binary

  • -R : 지정된 section 이름을 지운다. .note, .comment는 없앤다.

  • -S : input file을 지정한다.

$(ld)에 사용된 옵션은 다음과 같다.
  • -m elf-i386 : ld가 elf-i386을 emulation 하도록 지정한다.

  • -r : relocatable, 메모리에 적재될 때 재배치 가능하도록 한다.

  • -b binary : input file의 format을 말한다. 여기선 $$tmppiggy.gz은 binary

  • -T : linker script file을 지정한다.

  • -b elf32-i386 : output을 elf-i386 format으로 지정한다.

2.3.5. $(topDIR)/arch/i386/boot/tools/build.c

$(topdir)/arch/i386/boot/tools/build는 커널 이미지 만드는 과정의 최종 단계에서 몇 개의 파일을 합쳐 하나의 커널 이미지를 만들어낸다. 이런 일을 담당하는 프로그램을 분석해야 이미 나온 부팅 과정에서의 동작을 이해할 수 있을 것이다.

최종 만들어지는 이미지는 그림 2-2이 된다. 부팅할 때 bootsect는 build에 의해 기록된 루트 디바이스, setup의 크기, 압축 커널의 크기를 바탕을 부팅 절차를 계속 진행한다.


/*
 *  $id: chap2.sgml,v 1.8 2002/02/15 15:59:43 halite Exp $
 *
 *  copyright (c) 1991, 1992  Linus Torvalds
 *  copyright (c) 1997 Martin Mares
 */

/*
 * this file builds a disk-image from three different files:
 *
 * - bootsect: exactly 512 bytes of 8086 machine code, loads the rest
 * - setup: 8086 machine code, sets up system parm
 * - system: 80386 code for actual system
 *
 * it does some checking that all files are of the correct type, and
 * just writes the result to stdout, removing headers and padding to
 * the right amount. It also writes some system data to stderr.
 */

/*
 * changes by tytso to allow root device specification
 * high loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
 * cross compiling fixes by Gertjan van Wingerde, July 1996
 * rewritten by martin Mares, April 1997
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/sysmacros.h>
#include <unistd.h>
#include <fcntl.h>
#include <asm/boot.h>

typedef unsigned char byte;
typedef unsigned short word;
typedef unsigned long u32;

#define default-maJOR-ROOT 0
#define default-miNOR-ROOT 0

/* minimal number of setup sectors (see also bootsect.S) */
#define setup-sectS 4

byte buf[1024];
int fd;
int is-big-kernel;

void die(const char * str, ...)
{
 va-list args;
 va-start(args, str);
 vfprintf(stderr, str, args);
 fputc('\n', stderr);
 exit(1);
}

void file-open(const char *name)
{
 if ((fd = open(name, O-RDONLY, 0)) < 0)
  die("unable to open `%s': %m", name);
}

void usage(void)
{
 die("usage: build [-b] bootsect setup system [rootdev] [> image]");
}

int main(int argc, char ** argv)
{
 unsigned int i, c, sz, setup-sectors;
 u32 sys-size;
 byte major-root, minor-root;
 struct stat sb;

(1)
 if (argc > 2 && !strcmp(argv[1], "-b"))
   {
     is-big-kernel = 1;
     argc--, argv++;
   }
 if ((argc < 4) || (argc > 5))
  usage();
 if (argc > 4) {
(2)
  if (!strcmp(argv[4], "CURRENT")) {
   if (stat("/", &sb)) {
    perror("/");
    die("couldn't stat /");
   }
   major-root = major(sb.st-dev);
   minor-root = minor(sb.st-dev);
  } else if (strcmp(argv[4], "FLOPPY")) {
   if (stat(argv[4], &sb)) {
    perror(argv[4]);
    die("couldn't stat root device.");
   }
   major-root = major(sb.st-rdev);
   minor-root = minor(sb.st-rdev);
  } else {
   major-root = 0;
   minor-root = 0;
  }
 } else {
  major-root = dEFAULT-MAJOR-ROOT;
  minor-root = dEFAULT-MINOR-ROOT;
 }
 fprintf(stderr, "Root device is (%d, %d)\n", major-root, minor-root);

(3)
 file-open(argv[1]);
 i = read(fd, buf, sizeof(buf));
 fprintf(stderr,"Boot sector %d bytes.\n",i);
 if (i != 512)
  die("boot block must be exactly 512 bytes");
 if (buf[510] != 0x55 || buf[511] != 0xaa)
  die("boot block hasn't got boot flag (0xAA55)");
 buf[508] = minor-root;
 buf[509] = major-root;
 if (write(1, buf, 512) != 512)
  die("write call failed");
 close (fd);

(4)
 file-open(argv[2]);        /* Copy the setup code */
 for (i=0 ; (c=read(fd, buf, sizeof(buf)))>0 ; i+=c )
  if (write(1, buf, c) != c)
   die("write call failed");
 if (c != 0)
  die("read-error on `setup'");
 close (fd);

(5)
 setup-sectors = (i + 511) / 512; /* Pad unused space with zeros */
 /* for compatibility with ancient versions of LILO. */
 if (setup-sectors < SETUP-SECTS)
  setup-sectors = SETUP-SECTS;
 fprintf(stderr, "Setup is %d bytes.\n", i);
 memset(buf, 0, sizeof(buf));
 while (i < setup-sectors * 512) {
  c = setup-sectors * 512 - i;
  if (c > sizeof(buf))
   c = sizeof(buf);
  if (write(1, buf, c) != c)
   die("write call failed");
  i += c;
 }

(6)
 file-open(argv[3]);
 if (fstat (fd, &sb))
  die("unable to stat `%s': %m", argv[3]);
 sz = sb.st-size;
 fprintf (stderr, "System is %d kB\n", sz/1024);
 sys-size = (sz + 15) / 16;
 /* 0x28000*16 = 2.5 MB, conservative estimate for the current maximum */
 if (sys-size > (is-big-kernel ? 0x28000 : DEF-SYSSIZE))
  die("system is too big. Try using %smodules.",
   is-big-kernel ? "" : "bzImage or ");
 if (sys-size > 0xefff)
  fprintf(stderr,"warning: kernel is too big for standalone boot "
      "from floppy\n");
 while (sz > 0) {
  int l, n;

  l = (sz > sizeof(buf)) ? sizeof(buf) : sz;
  if ((n=read(fd, buf, l)) != l) {
   if (n < 0)
    die("error reading %s: %m", argv[3]);
   else
    die("%s: unexpected EOF", argv[3]);
  }
  if (write(1, buf, l) != l)
   die("write failed");
  sz -= l;
 }
 close(fd);

 if (lseek(1, 497, SEEK-SET) != 497)      /* Write sizes to the bootsector */
  die("output: seek failed");
 buf[0] = setup-sectors;
 if (write(1, buf, 1) != 1)
  die("write of setup sector count failed");
 if (lseek(1, 500, SEEK-SET) != 500)
  die("output: seek failed");
 buf[0] = (sys-size & 0xff);
 buf[1] = ((sys-size >> 8) & 0xff);
 if (write(1, buf, 2) != 2)
  die("write of image length failed");

 return 0;         /* Everything is OK */
}

(1)
build의 command line에 -b 옵션을 주면 이는 big kernel 임을 의미하게 된다.
(2)
루트 디바이스의 major, minor 번호를 알아낸다.

currenT는 /의 major, minor number를 사용한다. 필자의 리눅스 박스는 hda1이 /이므로 major=0x03, minor=0x01이 될것이다.

플로피가 루트 디바이스로 지정됐으면 major=minor=0이 된다.

command line에 아무 것도 지정되지 않으면 기본 값이 사용된다(기본 값은 사실 플로피와 같은 값을 갖는다).

(3)
부트 섹터 파일을 읽어 512 byte가 아니면 에러를 낸다. 부트 섹터는 정확히 512 byte여야 하기 때문이다. 그리고 MagicNumber를 체크해 정말 부트 섹터인지 확인한다.

또 508(0x1FC), 509(0x1FD) 번째 바이트에 루트 디바이스의 minor, major 번호를 써 넣는다.

수정 후 표준 출력으로 bootsect의 512 byte를 출력한다(원래 512 byte 였으므로 수정 내용을 포함해 그대로 출력될 것이다).

(4)
setup은 크기가 정확히 얼마인지 알수 없으므로 1024 byte 단위로 읽으면서 크기를 변수 i에 기억해 놓는다. 읽은 1KB는 읽는 즉시 표준 출력을 출력된다.
(5)
setup을 512 byte 단위로 끊고 적어도 SETUP-SECTOR(값은 4) 만큼이 되는지 확인해 모자란 부분은 0으로 채워 넣는다. 디스크는 섹터 단위로 입출력한다는 것을 기억하기 바란다.

예를 들어 setup의 크기가 4768 byte라면 4768/512=9.3125 이므로 9 섹터를 차지하고 10번째 섹터는 다 사용하지 않고 조금만 사용하게 된다. 10번째 섹터의 경우 160 byte를 제외한 352 byte 만큼을 0으로 채워 넣는다.

(6)
압축된 커널의 크기를 계산해 zImage의 경우 0x7F000 보다 큰지 확인하고, bzImage는 0x280000 보다 큰지 확인한다. 만약 지정된 크기보다 크다면 현재로서는 수용할 수 없는 크기의 커널이므로 에러를 낸다. 또 플로피 부팅의 경우 플로피에 들어갈 수 있는 크기인지 확인한다.

1024 byte 단위로 읽어 표준 출력에 출력하고 bootsect의 497(0x1F1)에 setup이 몇 섹터를 차지하는지 기록하고 500(0x1F4)에 압축 커널의 크기를 16 byte 단위로 기록해준다.

주석

[1]

하위 1M에 대한 것은 2.2.2절을 참조한다.

신고
TAG bzimage

Kernel compile make menuconfig

:::::Computer::::: 2007.02.26 09:37 by LoofBackER

< make menuconfig 에서 선택 사항에 대한 설명 >

    아래는 메인메뉴이다.

    (1) Code maturity level options  
    (2) Loadable module support  
    (3) Processor type and features  --->
    (4) General setup  --->
    (5) Memory Technology Devices (MTD)  
    (6) Parallel port support  
    (7) Plug and Play configuration  
    (8) Block devices  
    (9) Multi-device support (RAID and LVM)  
    (10) Networking options  
    (11) Telephony Support  
    (12) ATA/IDE/MFM/RLL support  
    (13) SCSI support  
    (14) IEEE 1394 (FireWire) support  (**)
    (15) I2O device support  
    (16) Network device support  
    (17) Amateur Radio support  
    (18) IrDA (infrared) support  
    (19) ISDN subsystem  
    (20) Old CD-ROM drivers (not SCSI, not IDE)  
    (21) Input core support  
    (22) Character devices  
    (23) Multimedia devices  
    (24) File systems  
    (25) Console drivers  
    (26) Sound  
    (27) USB support  
    (28) Kernel hacking  

    **  “(14)”는 “(1)”을 선택해야 나타난다.

    각 메뉴 선택에 대한 간략한 설명이다.
    자세한 사항은 각 메뉴에서 “Help”를 선택하면 알 수 있다.


    1. Code maturity level options  

    [*] Prompt for development and/or incomplete code/drivers

    커널코드 중 아직 개발이 진행 중인 부분을 사용할 경우 이에 관한 메뉴를 선택메뉴에 나타낼지를 결정한다. 메뉴의 내용이 추가될 뿐이므로 선택하는게 좋다.


    2. Loadable module support  

    [ ] Enable loadable module support    
    [ ]   Set version information on all module symbols          
    [ ]   Kernel module loader

    모듈 자동적재(autoload) 기능을 사용하려면 셋 다 선택한다.


    3. Processor type and features  

    (Pentium-III) Processor family

    자신의 CPU에 맞게 선택한다. 상위호환성이 있으나 그 역은 안된다. 즉 386을 선택하면 모든 CPU에서 사용이 가능하나, Pentium-III를 선택하면 펜티엄이나 486에서는 사용할 수 없다. 대부분의 배포본에 들어있는 커널은 386으로 지정되어 있다.  Athlon/K7, Crusoe 칩도 선택할 수 있다.

    < > Toshiba Laptop support    
    < > /dev/cpu/microcode - Intel IA32 CPU microcode support  

    인텔 IA32 계열 프로세서(Pentium Pro, Pentium II, Pentium III, Pentium 4, Xeon 등) 에서 마이크로코드를 업데이트 할 수 있다.  /dev file system support를 필요로 한다. 마이크로코드는 커널에 들어 있지 않으므로 별도로 입수해야 한다. 자세한 사항은 http://www.urbanmyth.org/microcode/를 참고 한다.

    < > /dev/cpu/*/msr - Model-specific register support  

    Model-Specific Registers (MSRs)를 접근하는데 필요하다. 멀티CPU 환경에만 해당한다.

    < > /dev/cpu/*/cpuid - CPU information support  
    ( ) High Memory Support  
        (X) off
        ( ) 4GB
        ( ) 64GB

    x86 프로세서는 32비트이므로 최대 접근 가능 주소영역은 약 4기가이다.(2^32= 42억) 따라서 4기가를 넘는 메모리 영역은 영구매핑이 불가능하다. 이 메모리를 high memory라고 부른다. 이 영역을 사용하려 할 때 필요하다. 단 PAE (Physical Address Extension) 모드를 지원하는 CPU에서만 가능하다.(펜티엄 프로 이상) 메모리가 1가가 이하일 때는 off를, 1 ~ 4 기가는 4GB를, 4기가를 초과할 때는 64GB를 선택한다. 커널에서 물리적 메모리가 모두 인식되지 않으면 lilo.conf에 “mem=xxxM”를 넣는다.

    [ ] MTRR (Memory Type Range Register) support                        

    펜티엄프로 이상의 CPU에서 PCI 또는 AGP 그래픽 카드를 사용할 경우 이미지 쓰기에서 전송속도를 2.5배 이상 증가시킨다. /proc/mtrr 파일을 통해 MTRR을 조절할 수 있다. X 서버에서 사용한다. Cyrix 6x86, 6x86MX , MII 에도 MTRR과 유사한 기능이 있다.

    [ ] Symmetric multi-processing support

    2 개 이상의 CPU가 있을때만 선택한다.


    4. General setup  

    [*] Networking support    : 필수 선택
    [ ] SGI Visual Workstation support
    [*] PCI support               :    
      (Any)   PCI access mode  
      [*] PCI device name database    
    [ ] EISA support  : ISA 버스의 개량형으로 일시 사용되었으나 현재는 PCI로 대체되었다.
    [ ] MCA support  
         MicroChannel Architecture 는 IBM 사의 일부 PC에서 사용되었으나 PCI로 대체되었다.

    [*] Support for hot-pluggable devices          
          PCMCIA 카드 등을 사용시 시스템 전원을 끄지 않고도 장치 교체를 가능하게한다.

    PCMCIA/CardBus support :
    노트북 사용시 필요하다. 아래 두 옵션을 선택해야 한다. David Hinds' pcmcia-cs 패키지를 필요로 한다.

    <* > PCMCIA/CardBus support
    [* ] CardBus support
    [ ]   i82365 compatible bridge support
    [ ]   Databook TCIC host bridge support ?

    [*] System V IPC  :  권장사항
    공유 메모리를 사용하려면 /etc/fstab에 아래 라인을 추가한다.

    none   /dev/shm        shm     defaults        0  0

    [ ] BSD Process Accounting  
    [*] Sysctl support : 권장
          /proc/sys 디렉토리를 통해 커널 컴파일 또는 리부팅을 하지 않고도
          일부 커널파라메터를 변경할 수 있게 한다.

    (ELF) Kernel core (/proc/kcore) format  
    <*> Kernel support for a.out binaries  
    <*> Kernel support for ELF binaries    
    <*> Kernel support for MISC binaries  
    [*] Power Management support  
    [ ]    ACPI support    
    < >   Advanced Power Management BIOS support


    5. Memory Technology Devices (MTD)  

    <*> Memory Technology Device (MTD) support

    임베디드 시스템 등에서 하드디스크 대신에 사용되는 플래시롬, 램 등을 사용할 때 필요하다. 램디스크와는 관련이 없다. 잘 모르면 No

            [ ] Debugging (NEW)
            --- Disk-On-Chip Device Drivers    
            < >   M-Systems Disk-On-Chip 1000 (NEW)
            < Disk-On-Chip 2000 and Millennium (NEW)
            < >   M-Systems Disk-On-Chip Millennium-only alternative driver (NEW)
            --- RAM/ROM Device Drivers  
            < >   Use extra onboard system memory as MTD device (NEW)  
            < >   Ramix PMC551 PCI Mezzanine ram card support (NEW)  
            < >   Debugging RAM test driver (NEW)  
            --- Linearly Mapped Flash Device Drivers  
            < >   Common Flash Interface (CFI) support (NEW)    
            < >   Support for RAM chips in bus mapping (NEW)

    < >   Support for ROM chips in bus mapping (NEW)  
            --- Drivers for chip mappings  
            --- User modules and translation layers for MTD devices
            < >   Direct chardevice access to MTD devices (NEW)
            < >   Caching blockdevice access to MTD devices (NEW)
            < >   FTL (Flash Translation Layer) support (NEW)
            < >   NFTL (NAND Flash Translation Layer) support (NEW)


    6.  Parallel port support  

    피시의 패러랠포트에 연결되는 장치(프린터, 집드라이브, PLIP 등) 를 사용시 필요하다.

    <*> Parallel port support
    <*>   PC-style hardware (NEW) :  IBM 호환 피시와 일부 알파피시에서 지정해야 한다.
     [*]   Use FIFO/DMA if available (NEW)
             패러랠포트 전송속도를 빨리하기 위해 필요하다. 단 패러랠포트에 IRQ,
             DMA 를 할당해야 한다. Documentation/parport.txt 를 참조한다.

     [ ]   SuperIO chipset support (EXPERIMENTAL) (NEW)
     [ ]   Support for PCMCIA management for PC-style ports (NEW)
     [ ]   Support foreign hardware (NEW)
     [*]   IEEE 1284 transfer modes (NEW)
            EPP, ECP를 지원하는 패러랠포트 사용시 필요할 수 있다.


    7. Plug and Play configuration : 권장

            <*> Plug and Play support  
            <*>   ISA Plug and Play support


    8. Block devices  

    <*> Normal PC floppy disk support  
    < > XT hard disk support                
    < > Parallel port IDE device support
    < > Compaq SMART2 support    
    < > Compaq CISS Array support    
    < > Mylex DAC960/DAC1100 PCI RAID Controller support  
    <* > Loopback device support    
            파일을 블록장치로 사용하는 경우 지정한다.
            예를들어 도스 파일시스템에 위치한 파일을 리눅스의 루트파일시스템으로
            사용하므로서 도스에서 리눅스를 부팅하는 것을 가능하게 하는 경우 등이다.

    < > Network block device support                                  
          원격 서버를 블록장치(/dev/nd0)로 사용하게 한다. NFS나 CODA 와는 무관하다.
          NFS와 다른 점은 어떠한 파일시스템도 지원한다는 것이다.
          또 NBD는 루트파일 시스템으로는 사용할 수 없다. NBD는 다른 사용자 프로그램을 통해
          설치되기 때문이다. 사용자 공간에 블록장치를 설치하는데도 사용된다.
          즉 loopback 장치를 통해 통신을 할 수 있다.

    NBD 장치는 메이저 43 장치 번호를 갖는다.

    brw-rw-rw-   1 root     root      43,         0 Apr 11 00:28 nd0
    brw-rw-rw-   1 root     root      43,         1 Apr 11 00:28 nd1

    nbd 사용을 위해서는 별도의 사용자 프로그램을 설치해야 한다.(서버 및 클라이언트용이 모두 필요하다.) Documentation/nbd.txt를 참고 하라.

    < > RAM disk support

    메모리를 디스크로 사용하는 기법이다. 하드디스크에서 파일을 읽고 쓰는 것보다 속도가 훨씬 빠르다. 단 램디스크에 저장된 파일은 전원이 나가면 지워지므로 파일 내용이 변경되는 경우는 별도의 백업이 필요하다.
    (4096) Default RAM disk size
    [ ]   Initial RAM disk (initrd) support


    9. Multi-device support (RAID and LVM)  

    [ ] Multiple devices driver support (RAID and LVM)
    < >  RAID support
           여러 개의 하드디스크 파티션을 하나의 논리 블럭장치로 만들어준다.
           대용량 디스크 사용시 필요하다. 또는 하드웨어 페일(fail) 시에 대처하기 위해 여러 개의
           하드디스크를 한 개의 논리블럭장치로 만들어주는 소프트웨어레이드를 구현 시에도
           필요하다. 레이드 1/4/5 방식이 지원된다.

    < >   Linear (append) mode  
    < >   RAID-0 (striping) mode
    < >   RAID-1 (mirroring) mode
    < >   RAID-4/RAID-5 mode

    < >  Logical volume manager (LVM) support
            여러 개의 하드디스크나 디스크 파티션, 복합장치들을 볼륨그룹으로 결합한 후
            이를 다시 가상파티션으로 나눌 수 있게 한다.
            볼륨그룹과 가상파티션은 새로 만들지 않고도 크기를 변경할 수 있으므로
            하드 저장공간을 계속해서 확장하는 경우 유리하다.
            장치명은 /dev/VolumeGroupName/LogicalVolumeName 이다.

    [ ]    LVM information in proc filesystem


    10.  Networking options  

    <*> Packet socket  
          어플리케이션이 커널에 구현된 중간 네트워크 프로토콜을 거치지 않고 직접 네트워크
          장치와 통신하는데 사용된다. Tcpdump 등이다. DHCP 사용시에도 필요하다

    [  ]   Packet socket: mmapped IO    
    [ *] Kernel/User netlink socket  
          커널과 사용자 프로세스 간의 양방향 통신에 필요하다.

    [* ]   Routing messages (NEW)
    <*>   Netlink device emulation (NEW)

    [* ] Network packet filtering (replaces ipchains)
           리눅스를 통과하는 패킷에대한 필터링을 가능하게 한다. 필터링 정책은 패킷 형태,
           소스 주소, 목적지 주소 들에 따라 결정된다. 리눅스를 파이어월로 사용하는 경우 및
           리눅스의 공인 IP를 내부의 여러 대의 피시에서 공유해서 인터넷을 사용할 수 있게
           해주는 IP Masquerade 사용시 필요하다.
           IP masquerade 를 설치한 경우 내부 네트워크에 위치한 서버를 인터넷에서 접근이
           가능하게 해주는 포트포워딩에서도 필요하다. 또 투명프락시 설정 시에도 필요하다.
           투명 프락시는 내부 네트워크의 피시에서 인터넷을 사용하려 할 경우 리눅스에서
           내부에 설치된 프락시 서버(보통 캐싱 기능을 갖고 있음.)로 연결해 주는 기법이다.
           따라서 피시에는 별도의 프락시 설정이 필요없다.

    [ ]   Network packet filtering debugging (NEW)

    [ *] Socket Filtering    
           사용자 프로그램이 소켓에 필터를 요청하는데 필요하다. TCP를 제외한 모든 데이터
           형태에 사용할 수 있다. DHCP 서버를 사용시 필요하다

    <*> Unix domain sockets  
          유닉스 도메인 소켓 지원에 필요하다. 네트워크에 연결되어 있지 않은 경우(Xwindow)도
          필요하므로 필히 선택해야 한다.

    [*] TCP/IP networking
          인터넷 연결에 필요한 TCP/IP 프로토콜을 지원한다. 네트워크에 연결되지 않은 경우도
          사용되는 경우가 있으므로 필히 선택해야 한다. “/proc filesystem support”
          “Sysctl support” 를 선택하면 “/proc/sys/net/ipv4/*” 디렉토리의 파일을 이용해
          TCP/IP 의 여러 값을 변경할 수 있다.
          자세한 사항은 Documentation/networking/ip-sysctl.txt를 참조한다.

    [*]  IP: multicasting  
          네트워크에 연결된 여러 대의 컴퓨터에 동시에 접근하는데 필요하다. 즉 한 개의 패킷을
          여러 주소에 전달하는 경우다. MBONE 방식의 인터넷 방송에 사용된다.

    [*]  IP: advanced router  
           리눅스를 라우터로 사용하는 경우 그에 관련된 자세한 선택을 할 수 있는 메뉴를
           표시해 준다. 리눅스를 라우터로 사용하려면 ip forwarding이 enable 되야 하는데 이는
           “/proc filesystem support” “Sysctl support” 두 가지를 선택하고 /proc 파일 시스템을
           마운트 한 후 아래 명령을 주어야 한다.

            echo “1” > /proc/sys/net/ipv4/ip_forward

    [ ]     IP: policy routing (NEW)
    [ ]     IP: equal cost multipath (NEW)
    [ ]     IP: use TOS value as routing key (NEW)
    [ ]     IP: verbose route monitoring (NEW)
    [ ]     IP: large routing tables (NEW)

    [ ]  IP: kernel level autoconfiguration    
          커널 명령행이나 BOOTP, RARP 프로토콜 등을 사용해 부팅시에 IP 주소나
          라우팅 테이블을 자동으로 설정하는 경우 필요하다. 디스크 없이 네트워크 부팅을 하는
          시스템에 사용한다. "Root file system on NFS" 를 필요로 할수 있다.

    [ ]     IP: BOOTP support (NEW)
    [ ]     IP: RARP support (NEW)

    < >   IP: tunneling  
            모바일 컴퓨팅에 필요하다. 즉 IP를 변경하지 않고도 컴퓨터를 다른 네트워크 주소에
            연결해서 사용하려 할 때 필요하다. http://anchor.cs.binghamton.edu/~mobileip/LJ/
            index.html를 참고

    < >   IP: GRE tunnels over IP  
            턴넬링 목적지에 시스코 라우터가 있을 때 사용한다. 턴넬을 통해 멀티캐스트 패킷을
            보내는데도 사용한다.

    [ ]   IP: multicast routing  
           리눅스를 여러 개의 목적지 주소를 갖는 IP 라우터로 사용하는 경우 필요하다.
           MBONE 라우터에 사용된다.

    [ ]   IP: ARP daemon support (EXPERIMENTAL) (NEW)
           지역네트워크에서 IP 주소와 하드웨어주소를 연결하는 테이블은 커널 내에 캐시된다.
           수백대의 호스트가 설치된 네트워크에서는 이 방식이 별 문제가 없으나 스위치로
           연결된 대규모 네트워크에서는 커널에 ARP 캐시를 저장하는 경우 빈번한 네트워크
           연결이 있을 경우 매우 많은 메모리를 사용하며 연결에도 문제가 발생할 소지가 있다.
           이 때 arpd를 사용해 커널의 ARP 요청을 처리 하므로서 커널의 ARP 캐시 부담을
           줄이는데 사용된다.

    [ ]   IP: TCP Explicit Congestion Notification support
           클라이언트에게 네트워크 혼잡을 알려주는 기능이다. 일부 파이어월은 이 기능을
           지원하지 않으므로 특별한 경우만 사용해야 한다.

    [ ]   IP: TCP syncookie support (disabled per default)

           "SYN flooding" 기법을 사용하는 DOS(denial-of-service) 공격시에서도 정당한
           사용자의 연결을 가능하게 해준다.

    IP: Netfilter Configuration  

        <*> Connection tracking (required for masq/NAT) (NEW)
               IP Masquerade나 NAT 사용시 필요

        <*> FTP protocol support (NEW)
               IP Masquerade나 NAT 사용시 필요
        <M> Userspace queueing via NETLINK
               (EXPERIMENTAL) (NEW)
        <*> IP tables support
              (required for filtering/masq/NAT) (NEW)
              IP tables 는 커널 2.2에서의 IP chains를 대치한다. 파이어월, IP masquerading,
              port forwarding 등에 필요하다. 아래는 이와 관련된 옵션이다.
              자세한 사항은 iptables man 페이지를 참고

        < >   limit match support (NEW)
        < >   MAC address match support (NEW)
        < >   netfilter MARK match support (NEW)
        < >   Multiple port match support (NEW)
        < >   TOS match support (NEW)
        < >   Connection state match support (NEW)
        < >   Unclean match support (EXPERIMENTAL) (NEW)
        < >   Owner match support (EXPERIMENTAL) (NEW)
        <*>   Packet filtering (NEW)
        < >     REJECT target support (NEW)
        < >     MIRROR target support (EXPERIMENTAL) (NEW)
        <*>   Full NAT (NEW)
        < >     MASQUERADE target support (NEW)
        < >     REDIRECT target support (NEW)
        < >   Packet mangling (NEW)
        < >   LOG target support (NEW)

    < >   The IPv6 protocol (EXPERIMENTAL)  
            Ipv6(또는 IPng "IP next generation")는 현재 인터넷 연결에 사용되는 Ipv4와 호환되며
            확장된 주소영역, 사용자인증, 비밀유지 등의 개선된 기능을 갖고 있다.         net/ipv6/README를 참고
    < > Kernel httpd acceleration (EXPERIMENTAL)
          커널에 내장된 제한된 웹서버 데몬이다.(kHTTPd) CGI 기능은 수행할수 없다.
          KHTTPd를 설치하면  웹서버의 성능이 향상된다. KHTTPd에서 처리할 수 없는 경우는
          사용자 웹서버 프로그램(아파치 등)으로 연결해주기 때문이다. 모듈로 설치할 경우에
          kHTTPd를 사용하려면 아래 명령이 필요하다.

          echo 1 > /proc/sys/net/khttpd/start

    [ ] Asynchronous Transfer Mode (ATM) (EXPERIMENTAL)
         ATM 네트워크 연결시 필요하다. ATM 카드를 설치해야 한다.

    < > The IPX protocol      
          리눅스를 노벨 네트웨어 파일 및 프린터 서버로 사용할 때 필요하다.

    <*> Appletalk protocol support  
          리눅스를 애플사의 맥킨토시 파일서버 및 프린터 서버로 사용할 때 필요하다.
          Netatalk 패키지를 사용해야 한다.

    < > DECnet Support  
    < > 802.1d Ethernet Bridging  
          리눅스를 이더넷 브리지로 사용하게 해준다. 브리지는 여러 개의 물리적인 네트워크를
          하나의 네트워크로 묶어준다. 이더넷에서 한 개의 물리적인 랜에 수 백대의 호스트가
          연결되어 있고 상호 간에 데이터 전송이 많을 때 패킷 충돌 현상으로 인해 네트워크 속도
          가 크게 느려진다. 이 경우에 브리지를 사용해 데이터 전송이 많은 그룹 별로 네트워크를
          분리하고 브리지로 각 네트워크를 연결하면 네트워크 속도를 향상할 수 있다.
          스위칭허브(스위치)에는 브리지 기능이 들어 있다.

    < > CCITT X.25 Packet Layer (EXPERIMENTAL)
    < > LAPB Data Link Driver (EXPERIMENTAL)
    [ ] 802.2 LLC (EXPERIMENTAL)  

         위 셋은 X.25 프로토콜과 관련있다. X.25는 프레임릴레이와 유사한 공중데이타망에
         사용되는 프로토콜이다. 일부 014XX 망에서 X.25를 사용하고 있다.

    [ ] Frame Diverter (EXPERIMENTAL)  

         지역 네트워크로부터의 패킷을 실제로 의도하지 않은 다른 네트워크 인터페이스 장치로
         방향을 변경해주는 것이다. 예를 들어 이더넷 브리지로 설정된 리눅스에 squid 같은
         프락시 서버를 설치하여 브리지를 통과하는 외부로 나가는 http 패킷(80번) 목적지를
         리눅스의 squid 서버 포트(8080번)으로 변경하므로서 사용자에게는 투명한 프락시 서버를
         구축하는 경우이다. 종전에는 네트워크에 설치된 라우터의 셋업을 변경해야만 이러한
         목적을 달성할 수 있었다.

    < > Acorn Econet/AUN protocols (EXPERIMENTAL)  
    < > WAN router  
          리눅스에 WAN보드(싱크보드)를 설치하여 WAN 라우터(인터넷을 랜투랜으로 연결시
          사용되는 라우터) 로 사용하는 경우에 필요하다. sangoma, emerging tech 사에서
          이러한 보드를 만들고 있다. 별도의 보드 드라이버가 필요하다.

    [ ] Fast switching (read help!)
         지역네트워크에서 랜카드 간의 직접 데이터 전송을 가능하게 한다. 즉 네트워크 속도를
         올려준다. Tulip 등 일부 카드만 가능하다. “Network packet filtering (replaces ipchains)”
         와는 동시에 사용할 수 없다. 즉 리눅스를 파이어월로  사용할 때는 이 기능을 사용하지
         않아야 한다. “IP: advanced router” 내의 항목과는 동시 사용이 가능하다.
         (“IP: use TOS value as routing key”, “IP: use FWMARK value as routing key” 는 제외).

    [ ] Forwarding between high speed interfaces  
         트래픽이 많은 랜에서 랜카드에 가속 기능을 부여한다. 일부 랜카드만 가능하다.
         저성능 피시에서는 사용하면 안된다
         QoS and/or fair queueing  

         네트워크 장치가 패킷 전송시 FIFO 방식의 기존 패킷 스케쥴러를 사용하지 않고 다른
         알고리즘을 사용하고자 할 때 선택한다. 예를들어 리얼타임 장치 등을 리눅스에 사용할
         경우이다. iproute2+tc 패키지를 설치해야 한다. 아래는 선택 가능한 목록이다.
         여러 개 선택이 가능하다.

    [*] QoS and/or fair queueing (EXPERIMENTAL)
    < >   CBQ packet scheduler (NEW)  
    < >   CSZ packet scheduler (NEW)  
    < >   The simplest PRIO pseudoscheduler (NEW)  
    < >   RED queue (NEW)  
    < >   SFQ queue (NEW)    
    < >   TEQL queue (NEW)  
    < >   TBF queue (NEW)  
    < >   GRED queue (NEW)    
    < >   Diffserv field marker (NEW)  
    < >   Ingress Qdisc (NEW)    
    [ ]   QoS support (NEW)    
    [ ]   Packet classifier API (NEW)  


    11.  Telephony Support  --->

      인터넷을 통한 음성전송 등을 지원하는 텔리포니(telephony) 카드를 사용할 때 필요하다. 모뎀과는 무관하다.


    12.  ATA/IDE/MFM/RLL support  --->

      IDE 하드디스크 및 ATAPI CD 드라이브 사용과 관련된 선택이다. SCSI 하드 및 CD 드라이브를 사용한다면 선택 않아도 된다.

      <*> ATA/IDE/MFM/RLL support                                
      IDE, ATA and ATAPI Block devices  --->

      <*> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support

          일반 피시에서 사용하는 하드디스크 콘트롤러와 관련된다. 필히 지정

      [ ]   Use old disk-only driver on primary interface  

            구형 XT 하드 사용시 지정

      <*>  Include IDE/ATA-2 DISK support                                    

           일반 하드디스크 사용시 필요.

      [ ]   Use multi-mode by default

      아래의 에러 메시지가 나올 때만 선택한다.
      hda: set_multmode: status=0x51 { DriveReady SeekComplete Error }                
      hda: set_multmode: error=0x04 { DriveStatusError }

      <*> Include IDE/ATAPI CDROM support

      (E)IDE 콘넥터에 연결하는 CD 드라이버를 사용한다면 Yes. SCSI CD 드라이브라면 No

      < >   Include IDE/ATAPI TAPE support

      (E)IDE 콘넥터에 연결하는 테이프 드라이버를 사용한다면 Yes. SCSI 테이프 드라이브라면 No

      < >   Include IDE/ATAPI FLOPPY support

            LS-120 과  IDE/ATAPI Iomega ZIP 드라이브 에 필요.

      < >   SCSI emulation support

            고유의 드라이버가 없는 ATAPI 장치에 사용한다. “SCSI support” 와 “SCSI generic
            support” 를 추가로 선택해야 한다. ATAPI PD-CD, CDR 등이 해당된다.
            단 SCSI 콘트롤러에 연결되는 SCSI 장치는 이 옵션과 무관하다.

      [*]   CMD640 chipset bugfix/support

      CMD640 IDE 칩을 사용하는 보드에서는 YES. 잘 모르면 Yes 로 해도 무난.

      [ ]   CMD640 enhanced support
      [ ]   ISA-PNP EIDE support

      PnP를 지원하는 ISA EIDE 카드 사용시 필요하다.

      [*]   RZ1000 chipset bugfix/support

      RZ1000 IDE 칩을 사용하는 보드에서는 Yes. 잘 모르면 Yes가 무난. SCSI 만 사용하면 No.

      [*]   Generic PCI IDE chipset support

             IDE 드라이브를 사용하는 PCI 시스템을 사용할 경우

      [*]   Sharing PCI IDE interrupts support

             ATA/IDE 칩셋이  다른 카드와 IRQ 공유를 허용하는 경우 지정한다.

      [*]   Generic PCI bus-master DMA support
            IDE 드라이브가 버스마스터 DMA를 지원하는 경우 지정한다. 대부분의 펜티엄 보드가
            해당된다.

      [ ]   Boot off-board chipsets first support

      확장 IDE 콘트롤러의 장치명이 마더보드에 내장된 IDE 장치보다 우선하게 하려고 할 때 지정한다. 즉 확장 IDE 보드에서 장착된 하드에서 부팅하려 할 경우이다. lilo.conf 에 append=”ide=reverse” 를 필요로 한다.

      [ ]   OPTi 82C621 chipset enhanced support (EXPERIMENTAL)

      [*]   Other IDE chipset support

      ※ 추가 메뉴가 나온다. 자신의 IDE 콘트롤러가 해당되면 선택한다.

      [ ]   IGNORE word93 Validation BITS (NEW)

          ATA-4 나 ATA-5 표준에서 필요하다.


    13.  SCSI support  --->

      <*> SCSI support                                                        

      보드에 SCSI 콘트롤러가 내장되어 있거나 SCSI 콘트롤러를 장착하고서 SCSI 장치를 사용할 때 지정한다.

      <*>   SCSI disk support                              
      (40) Maximum number of SCSI disks that can be loaded as modules        
      < >   SCSI tape support                                                
      < >   SCSI OnStream SC-x0 tape support                                  
      < >   SCSI CD-ROM support                                              
      < >   SCSI generic support                                              

      하드, 테이프, CD 드라이브 외의 SCSI 장치를 사용할 때 지정한다.

      [*]   Enable extra checks in new queueing code                          
      [*]   Probe all LUNs on each SCSI device    
                                 
              한 개의 SCSI ID에 여러 개의 논리 장치를 갖는 SCSI 장치를 사용할 때 필요하다.

      [*]   Verbose SCSI error reporting (kernel size +=12K)

              보다 상세한 SCSI 장치 에러 메시지를 필요로 할 때 사용한다.
                       
      [ ]   SCSI logging facility                                            

              SCSI 장치 디버깅 정보를 알려준다.

      SCSI low-level drivers  --->

              각각의 SCSI 콘트롤러에 대한 드라이버를 선택한다.


    14. IEEE 1394 (FireWire) support  --->

      < > IEEE 1394 (FireWire) support (EXPERIMENTAL)

      FireWire(tm) 혹은  i.Link(tm) 로 알려진 IEEE 1394 장치를 사용할 때 필요하다. 해당 장치에 대한 추가의 드라이버를 선택해야 한다.


    15. I2O device support  --->

      I2O 구조는 하드웨어 드라이버가 OSM이라 불리는 운영체제 관련모듈과 HDM이라 불리는 하드웨어 관련  모듈로 구성된다. OSM 은 어떠한 HDM과도 연결되며 HDM은 운영체제와는 무관하다. 따라서 동일한 HDM 드라이버가 OSM이 설치되어 있다면 다른 운영체제에서도 사용될수 있다. 이를 가능하게 하려면 I2O를 지원하는 어뎁터를 필요로 한다.


    16.  Network device support  --->

      리눅스를 다른 컴퓨터와 연결하지 않고 단독으로 사용하거나, 모뎀으로 다른 컴퓨터를 연결해 쉘어카운트, BBS(하이텔 등) 만 사용한다면 이 부분은 필요 없다. 모뎀으로 ISP(Internet Service Provider)를 연결 인터넷을 사용한다면 필요하다.

              [*] Network device support                                    

              ARCnet devices  --->                                          

                 ARCnet 네트워크(랜의 한 종류)를 사용하는 경우 지정한다.

              Appletalk devices  --->

                 애플토크 카드 사용시 필요하다. 애플토크는 맥에서 주로 사용한다.
                 이더토크(이더넷 랜에서 애플토크 프로토콜을 사용하는 것)를 사용한다면 필요 없다.

              <M> Dummy net driver support

                 PPP 나 SLIP 사용시 필요할 수 있다. PPP(ADSL)를 사용한다면 지정하는게 좋다.

              < > Bonding driver support                                    

                 랜에서 리눅스에 두 개의 이더넷 랜카드를 설치해 이를 한 개의 랜카드처럼 결합하여
                 사용하므로서 데이터 전송 속도를 두 배로 높이려고 할 때 필요하다.
                 연결하는 상대방도 이를 지원하는 하드웨어나 드라이버를 설치해야 한다.
                 Cisco 5500 스위치나 SunTrunking SunSoft 드라이버 등이 이에 해당된다.

              < > EQL (serial line load balancing) support                  

                 두 개의 전화선(시리얼 라인)을 묶어 속도를 배가 시킬 때 사용한다.
                 상대방에도 이를 지원하는 드라이버를 설치해야 한다.

              < > Universal TUN/TAP device driver support

                  TUN/TAP 은 물리적인 매체(랜카드)를 사용하지(거치지) 않고 사용자 프로그램
                  간에 직접 패킷을 송수신하는 기법이다. Documentation/networking/tuntap.txt를
                  참고 하라.

              < > Ethertap network tap (OBSOLETE)  

                 위와 비슷하다.

              < > General Instruments Surfboard 1000                        

                 General Instrument (NextLevel) SURFboard 1000 내장 케이블모뎀에 필요하다.
                 이 카드는 ISA 방식이며 다운로드만 가능하다. 업로드는 다른 매체를 필요로
                 한다.(전화선 등) 모듈로만 가능하다.

              Ethernet (10 or 100Mbit)  --->                                

                 이더넷은 가장 많이 사용되는 랜 표준이다. 허브 및 UTP 케이블을 사용하는
                 10BASE-T 방식이 가장 널리 사용되고 있다.(전송속도 10mbps) 최근에는
                 100BASE-TX(100mbps)도 많이 사용되고 있다. 외장 ADSL 모뎀, 외장 케이블모뎀도
                 모두 이더넷 카드에 연결된다. (속도는 10mbps만 가능) 일부 서버 기종이나 맥 상위
                 기종은 이더넷 랜카드가 내장되어 있다. 이 메뉴에서 자신의 랜카드 모델을 고른다.
                 자신의 랜카드 모델이 없으면 랜카드에 적힌 칩셋의 이름으로 선택하면 된다.

              1) 대만제 ISA 랜카드는 거의 아래 드라이버를 사용한다. 단 셋업 프로그램에서 PnP를
                  제거하고 IO address는 0x300 으로 잡는다. IRQ는 5 또는 9를 사용

                 < >  NE2000/NE1000 support (NEW) (먼저 “Other ISA cards”를 선택해야 한다.)

              2) 대만제 PCI 랜카드 중 칩셋이 8019, 8029인 경우는 아래 드라이버를 사용한다.

                 <*>     PCI NE2000 and clones support (see help)

              3) 칩셋이 8139 이면 아래 드라이버를 사용한다.

                 < >     RealTek RTL-8139 PCI Fast Ethernet Adapter support

              4) 칩셋이 8129이면 아래 드라이버를 사용한다.

                 < >     RealTek 8129 (not 8019/8029/8139!) support (EXPERIMENTAL)

              5) 3Com 카드 중 3c905-XX 모델은 3com 사이트에 드라이버가 있다.

              Ethernet (1000 Mbit)  --->                                    

                 1기가비트 이더넷을 사용할 경우 필요하다.

              [ ] FDDI driver support                                        

                 광케이블을 사용하는 100 mbps 랜 방식이다.

              [ ] HIPPI driver support (EXPERIMENTAL)

                 슈퍼컴퓨터 등에 사용하는 고속 랜의 일종이다.

              < > PLIP (parallel port) support
                 패러렐포트를 사용하여 두 컴퓨터 간에 네트워크를 연결하는데 사용한다.

              < > PPP (point-to-point protocol) support

                 전화선(시리얼 라인), ADSL 등으로 네트워크(인터넷)를 연결할 때 지정한다.

              < > SLIP (serial line) support                                

                 PPP와 비슷하나 PPP로 대체되어 거의 사용되지 않는다.

              Wireless LAN (non-hamradio)  --->                  

                 무선 랜카드를 사용할 때 필요하다.

              Token Ring devices  --->      

                 토큰 링은 IBM 에서 개발한 LAN 표준이다. 일부 IBM 호스트에 사용되고 있으나
                 랜카드 및 케이블 설치비가 비싸 피시에는 별로 사용되지 않는다.

              [ ] Fibre Channel driver support                              

                 Fibre 채널은 대용량 저장장치 등에서 SCSI 대신에 사용되고 있다.
                 별도의 Fibre 채널 어뎁터를 장착해야 한다.

              < > Red Creek Hardware VPN (EXPERIMENTAL)                      

              < > Traffic Shaper (EXPERIMENTAL)

                 Traffic Shaper는 외부로의 데이터 흐름을 제어하려고 할 때 사용되는 가상장치이다.
                 데이터 흐름을 제한하려면 데이터 경로를 이 장치로 변경하면 된다. Shaper 장치를
                 설정하려면 ftp://shadow.cabi.net/pub/Linux 에서 shapecfg를 가져다 설치해야
                 한다. “QoS and/or fair queueing” 도 이와 비슷한 구실을 한다.

              Wan interfaces  --->

                 싱크통신, X.25 통신 에 사용하는 카드를 사용할 경우에 해당 드라이버를 선택한다.


    17.  Amateur Radio support  --->

              [ ] Amateur Radio support

                 리눅스를 아마츄어 라디오에 연결할 때 관련 메뉴를 표시한다.

              < > Amateur Radio AX.25 Level 2 protocol (NEW)

                아마츄어 라디오를 이용해 컴퓨터통신을 하려 할 때 필요하다.


    18.  IrDA (infrared) support  --->

              < > IrDA subsystem support

                 IrDA 프로토콜을 지원한다. Irmanager, irattach 같은 다른 사용자 프로그램의
                 도움이 필요하다.


    19.  ISDN subsystem  --->

      ISDN 라인으로 데이터 통신을 할 때 필요하다. ISDN 카드를 설치해야 하고 상대방도 ISDN 라인을 사용하는 경우에만 이 메뉴가 필요하다. ISDN 라인에 일반 모뎀을 연결하는 경우에는 무관하다.


    20.  Old CD-ROM drivers (not SCSI, not IDE)  --->

              [ ] Support non-SCSI/IDE/ATAPI CDROM drives

                 SCSI 나 IDE/ATAPI 방식이 아닌 구형 CD 드라이브를 사용할 경우 드라이버를
                 선택한다.


    21.  Input core support  --->

              USB HID 키보드, 마우스, 조이스틱 등 드라이버를 선택한다.
              < > Input core support                                      
                           < >   Keyboard support (NEW)                                
                           < >   Mouse support (NEW)                                    
                           < >   Joystick support (NEW)                                
                           < >   Event interface support (NEW)


    22.  Character devices  --->

              [*] Virtual terminal                                                      

                 ALT + F? 키를 사용해 여러 개의 가상 터미널을 사용하게 해 준다.

              [*]   Support for console on virtual terminal                        

                 가상터미널을 콘솔로 사용할 때 필요하다, 시리얼콘솔을 사용할 때는 필요 없다.

              <*> Standard/generic (8250/16550 and compatible UARTs) serial support    

                 피시의 표준 시리얼포트(com1 ~ com4)를 사용할 때 필요하다.
                 즉 모뎀, 시리얼 마우스, 시리얼콘솔 등을 사용하려면 필요하다.

              [* ]   Support for console on serial port                                  

                 표준 시리얼포트를 콘솔로 사용할 때 필요하다. 그래픽 카드가 없는 시스템을
                 구성할 수 있다.

              [ ] Extended dumb serial driver options                                    

                 표준 시리얼포트를 확장해 주는 더미 시리얼 포트 장치를 사용할 경우 필요하다.

              [ ] Non-standard serial port support                                      

                 슬롯에 꼽는 별개의 CPU를 갖는 확장 시리얼장치 메뉴를 표시한다.
                 디지보드, 사이클레이드보드 등이다.

              [*] Unix98 PTY support  

                 /dev/pts/<number> 장치를 가상 터미널 장치로 사용할 때 필요하다.
                 “/dev/pts filesystem for Unix98 PTYs” 를 선택해야 한다.
                 네트워크에서 telnet 으로 리눅스를 연결하는 경우에 가상 터미널이 사용된다.

                 [root@donghunserver /root]# who
                 root     tty1     Feb 23 12:07
                 root     pts/0    Feb 27 09:25

                 (256) Maximum number of Unix98 PTYs in use (0-2048)

                 최대 가상 터미널 개수를 지정한다.

              <*> Parallel printer support (NEW)    

                 패러랠 포트에 프린터를 연결하려면 지정한다.

              [ ]   Support for console on line printer

                 커널 메시지를 프린터로 출력되기를 원할 때 지정한다. “console=lp0” 를 필요로
                 한다.

              < > Support for user-space parallel port device drivers

                 /dev/parport 장치에 대한 지원을 추가한다. 프린터나 패러렐포트용 CD ,
                 디스크와는 무관하다.

              I2C support  --->    

              <*> I2C support      

              I2C(I-square-C )는 필립스사에 의해 개발된 마이크로 콘트롤러 어플리케이션에
             사용되는 시리얼버스 프로토콜이다. 하드웨어 센서나 video for linux (리눅스에서의
             오디오/비디오 캡쳐) 에서 사용한다.

                      <*> I2C bit-banging interfaces (NEW)                              
                      < >   Philips style parallel port adapter (NEW)                    
                      < >   ELV adapter (NEW)                                            
                      < >   Velleman K9000 adapter (NEW)                                
                      <M> I2C PCF 8584 interfaces (NEW)                                  
                      < >   Elektor ISA card (NEW)                                      
                      <M> I2C device interface (NEW)

              Mice  --->        
              Joysticks  --->  

              < > QIC-02 tape support                                                    

              Watchdog Cards  --->    

                 워치독은 시스템이 다운되었을 때 자동으로 리부팅해 주는 기능을 말한다.

              < > Intel i8x0 Random Number Generator support                            

                 Intel i8xx-based 마더보드에 내장된 난수발생기를 지원한다.

              < > /dev/nvram support                                                    

                 피시의 CMOS 메모리에 50바이트의 데이터를 쓸 수 있다. 이 데이터는 피시의
                 전원이 나가도 지워지지 않으므로 중요 데이터 저장에 사용 가능하다.
                 mknod 명령으로 major 10  minor 40 번의 /dev/nvram 장치를 만들어야 한다.

              < > Enhanced Real Time Clock Support                                      

                 이 옵션을 선택 후 /dev/rtc 장치를 만들면 리얼타임클럭을 사용할 수 있다.
                 멀티 CPU 를 사용하는 경우(“Symmetric Multi Processing”)는 enable  해야 한다.

              < > Double Talk PC internal speech card support                            
              < > Siemens R3964 line discipline
              < > Applicom intelligent fieldbus card support                            
              Ftape, the floppy tape device driver  --->                                

                 플로피 콘트롤러에 연결된 테이프 장치를 지원한다.

              < > /dev/agpgart (AGP Support)                                            

                 3D를 지원하는 그래픽 카드에서 AGP 기능을 사용하게 한다.

                 아래는 각자의 마더보드 칩셋에 해당하는 것을 선택한다.

                   [ ]   Intel 440LX/BX/GX and I815/I840/I850 support (NEW)  
                   [ ]   Intel I810/I815 (on-board) support (NEW)    
                   [ ]   VIA chipset support (NEW)    
                   [ ]   AMD Irongate support (NEW)    
                   [ ]   Generic SiS support (NEW)  
                   [ ]   ALI M1541 support (NEW)

         [*] Direct Rendering Manager (XFree86 DRI support)                        

              XFree86 4.0 사용시 Direct Rendering Infrastructure (DRI) 를 지원한다.
              아래에서 각자의 시스템에 맞는 것을 선택한다.

                  < >   3dfx Banshee/Voodoo3+                                                
                  < >   3dlabs GMX 2000                                                      
                  < >   ATI Rage 128            
                  < >   Intel I810
                  < >   Matrox g200/g400                                            


    23.  Multimedia devices  --->

      23-1  <*> Video For Linux

      오디오/비디오 캡쳐 및 오버레이 장치에 대한 지원을 선택한다. 리눅스에서 TV 를 수신하거나 인터넷 방송, 화상전송, 동화상 저장 등에 필요하다.

      23-2  Video For Linux  

      시스템에 설치된 비디오카드(TV 카드, 화상편집보드)를 선택한다. (그래픽카드와는 무관하다.)

       [*]   V4L information in proc filesystem (NEW)                            
               < >   I2C on parallel port (NEW)                                          
               --- Video Adapters                                                        
               < >   BT848 Video For Linux (NEW)                                        
               < >   Mediavision Pro Movie Studio Video For Linux (NEW)                  
               < >   Quickcam BW Video For Linux (NEW)                                  
               < >   QuickCam Colour Video For Linux (EXPERIMENTAL) (NEW)                
               < >   CPiA Video For Linux (NEW)                                          
               < >   SAA5249 Teletext processor (NEW)                                    
               < >   SAB3036 tuner (NEW)                                                
               < >   Stradis 4:2:2 MPEG-2 video driver  (EXPERIMENTAL) (NEW)            
               < >   Zoran ZR36057/36060 Video For Linux (NEW)                          
               < >   Zoran ZR36120/36125 Video For Linux (NEW)

      23-3  Radio Adapters  --->

           AM/FM 라디오 수신카드를 지정한다.

          < >   ADS Cadet AM/FM Tuner (NEW)                                      
                  < >   AIMSlab RadioTrack (aka RadioReveal) support (NEW)              
                  < >   AIMSlab RadioTrack II support (NEW)                              
                  < >   Aztech/Packard Bell Radio (NEW)                                  
                  < >   GemTek Radio Card support (NEW)                                  
                  < >   Maestro on board radio (NEW)                                    
                  < >   Miro PCM20 Radio (NEW)                                          
                  < >   SF16FMI Radio (NEW)                                              
                  < >   TerraTec ActiveRadio ISA Standalone (NEW)                        
                  < >   Trust FM radio card (NEW)                                        
                  < >   Typhoon Radio (a.k.a. EcoRadio) (NEW)                            
                  < >   Zoltrix Radio (NEW)


      24.  File systems  --->

        [ ] Quota support      

          사용자 별로 디스크 사용량을 제한할 수 있다. Ext2 파일 시스템에만 가능하다. 별도의 사용자 프로그램을 설치해야 한다.
          Quota mini-HOWTO 를 참고 하라

        < > Kernel automounter support  

          원격 파일시스템을 자동으로 마운트 해 준다.
          Autofs에 패키지에 있는 사용자 프로그램을 설치해야 한다.(Documentation/Changes에 위치가 나와 있다.) “NFS file system support”를 선택해야 한다.
          아래의 “Kernel automounter v4 support” 는 보다 많은 기능을 갖고 있다.(둘 중 하나만 선택해야 한다.)

        <*> Kernel automounter version 4 support (also supports v3)

          위의 Kernel automounter support 보다 다양한 기능을 갖고 있다. ftp://ftp.kernel.org/pub/linux/daemons/autofs/testing-v4 에 있는 사용자 프로그램을 설치해야 한다.

        <*> Reiserfs support

          Reiserfs 는 ext2 만큼 빠르나 큰 디렉토리와 작은 파일들을 갖는 경우에 효과적이다.
          데이터베이스와 키워드검색 시스템에서 사용되는 기능들을 갖도록 확장할 수 있다.
          NFS와 쿼타를 사용하려면 패치가 필요하다. www.reiserfs.org 를 참고 하라.

        < > ADFS file system support  

          Acorn Disc Filing System 은 RiscOS 운영체제에서 사용하는 파일시스템이다.

        < > Amiga FFS file system support (EXPERIMENTAL)    

          Fast File System (FFS)은 AmigaOS Version 1.3 이후에 Amiga 시스템에서 사용하는 파일시스템이다.

        < > Apple Macintosh file system support (EXPERIMENTAL)    

          맥킨토시에서 포맷한 하드 및 플로피에 읽고 쓸 수 있다.

        < > BFS file system support (EXPERIMENTAL)

          Boot File System (BFS)은 SCO의  UnixWare에서 사용된다.
          “UnixWare slices support”을 선택해야 한다.

        < > DOS FAT fs support    

          MSDOS, Win9x, 파일시스템을 사용할 수 있다. UMSDOS에서도 필요하다.
          이 옵션은 DOS FAT나 윈도우의 VFAT 파일 시스템을 선택하기 위한 사전 옵션이다.
          따라서 다음에서 추가로 파일시스템을 선택해야 한다.

        <*>   MSDOS fs support
        <*>     UMSDOS: Unix-like file system on top of standard MSDOS fs
        <*>   VFAT (Windows-95) fs support

        < > EFS file system support (read only) (EXPERIMENTAL)  

          EFS는 SGI(실리콘그래픽스) IRIX 운영체제에서 CD 및 하드디스크에 사용된 파일시스템이다.

        < > Compressed ROM file system support    

          CramFs (Compressed ROM File System)은 ROM 기반의 임베디드 시스템에 사용되는 간단하고 단순하며 압축된 파일시스템이다.

        < > Simple RAM-based file system support    

          램에 파일을 저장한다는 면에서 램디스크와 비슷하나, 램디스크는 파일 저장 공간이 확정되어 있는 반면 Ramfs는 파일 수에 따라 그 공간이 확장된다. 전원이 나가면 지워진다. 마운트 포인트를 지정해야 한다.

        <*> ISO 9660 CDROM file system support  

          현재의 CD에서 사용되는 파일시스템이다.(오디오 CD와는 관련이 없다.)

        [ ]   Microsoft Joliet CDROM extensions

          마이크로소프트에서 제안한 유니코드를 사용하는 긴 파일이름을 지원하는 ISO 9660 파일시스템의 확장이다.

        < > Minix fs support      

          최초의 리눅스에서 사용된 파일시스템이다.

        < > NTFS file system support (read only)  

          MS의 윈도우 NT에서 사용하는 파일시스템임. 읽기만 가능함.

        < > OS/2 HPFS file system support  

          OS/2 는 IBM사가 피시에 사용하였다. HPFS는 OS/2에서 하드디스크에 사용한 파일시스템이다.

        [*] /proc file system support    

          시스템의 상태에 관한 정보를 제공하는 가상의 파일시스템이다.(즉 물리적인 하드 공간을 차지하지 않는다.)
          파일들은 사용자가 접근을 할 때 커널에 의해 만들어 진다.
          파일을 읽으려면 more 나 cat 명령을 사용해야 한다. 필히 선택해야 한다.

          /proc 파일시스템을 사용하려면 마운트를 해야 한다. 또는 /etc/fstab에 지정해서 부팅시 자동으로 마운트하게 할수 있다. /proc 가 마운트포인트라면 마운트 명령은 아래와 같다.(모든 배포본은 기본으로 proc 파일시스템을 부팅시 마운트 한다.)

          mount -t proc  proc  /proc

          자세한 사항은 Documentation/filesystems/proc.txt 및 “man 5 proc” 명령을 참고 하라.

        [ ] /dev file system support (EXPERIMENTAL)    

          디바이스 드라이버에 대한 파일시스템을 제공하는 가상파일시스템이다.
          Devfs는 major, minor 번호를 사용하지 않고 자동으로 디바이스 드라이버가 사용하는 장치명을 /dev에 등록해 준다. 즉 시스템 관리자는 mknod 명령을 사용할 필요가 없다.

        [*] /dev/pts file system for Unix98 PTYs

          “Unix98 PTY support” 를 선택했다면 필요하다. /dev/pts 에 마운트 되는 가상 파일시스템을 지원한다.
          “mount -t devpts” 를 추가하고 /dev/ptmx를 사용하면 가상터미널을 지원해 준다. 가상터미널 장치는 /dev/pts/xx에 만들어 진다.

        < > QNX4 file system support (read only) (EXPERIMENTAL)    

          QNX 4 운영체제에서 사용하는 파일시스템이다.

        < > ROM file system support    

          리눅스 설치시 초기의 램디스크 적재를 위해 주로 사용되는 읽기 전용의 매우 작은 롬파일시스템이다.

        <*> Second extended fs support        

          리눅스의 기본 파일시스템이다. UMSDOS를 사용하는 경우가 아니면 필히 지정해야 한다.
          (UMSDOS를 사용하는 경우에도 다른 리눅스에서 포맷한 플로피를 읽기 위해서는ext2는 필요하다.)

          지운 ext2 파일을 복구하려면 Ext2fs-Undeletion mini-HOWTO를 참고하라.

        < > System V and Coherent file system support (read only)            

          SCO, Xenix, Coherent 하드 및 플로피를 읽게 해준다. 아래의 “SYSV file system write support” 를 선택하면 쓰기도 가능하다.(주의해야 한다.)

        [ ]   SYSV file system write support (DANGEROUS)

          SCO, Xenix, Coherent 하드 및 플로피에 쓰기를 가능하게 한다.(주의)

        < > UDF file system support (read only)  

          UDF 파일시스템은 일부 CD와 DVD에서 사용하는 최근에 나온 파일시스템이다.
          패킷모드로 쓰여진 CDRW나 DVD 디스크를 마운트 하거나 DirectCD 같은 UDF 프로그램으로 쓰여진 CD를 마운트(읽기만 가능) 하려면 필요하다.
          UDF 파일시스템에 쓰기를 하려면 아래의 “UDF write support (DANGEROUS)” 을 선택해야 한다.

        [ ]   UDF write support (DANGEROUS)

          UDF 파일시스템에 쓰기를 가능하게 한다.
          위의 “UDF file system support (read only)” 도 같이 선택해야 한다.

        < > UFS file system support (read only)

          UFS 파일시스템은 SunOS, FreeBSD, NetBSD, OpenBSD, NeXTstep에서 사용한다.
          일부 System V 유닉스도 이 파일시스템을 만들거나 마운트한다.
          UFS 파일시스템을 읽으려면 지정한다. 쓰기도 가능하게 하려면 아래의 “UFS file system write support (DANGEROUS)”을 추가로 선택해야 한다.
          Documentation/filesystems/ufs.txt를 참고하라.

        [ ]   UFS file system write support (DANGEROUS)

          UFS 파일시스템에 쓰기를 가능하게 한다.

          ◀ Network File Systems  --->

          <> Coda file system support (advanced network fs)

          CODA는 NFS보다 개선된 네트워크 파일시스템이다.
          비연결 작업 지원, 읽고 쓰기 서버 복제, 인증, 암호화 등의 개선된 기능을 지원한다.

          * NFS file system support  

          네트워크에 연결된 다른 유닉스(리눅스) 호스트(NFS 서버)의 하드를 마운트해서 사용하게 해 준다.
          NFS 서버 호스트는 nfsd, mountd 프로그램을 실행해 주어야 한다.( NFS 파일 시스템 은 필요 없다.)

          []   Provide NFSv3 client support    

          NFS V3 는 새로운 NFS 표준이다.

          * NFS server support

          리눅스를 NFS 서버로 사용할 경우 지정한다. 리눅스에서 NFS 서버를 구현하는 방법은 두 가지가 있다. nfsd프로그램과( 이 옵션은 필요 없다.) 이 옵션을 선택해서 커널 기반의 nfs 서버를 만드는 것이다.
          어느 경우든 별도의 사용자 프로그램이 필요하다. 커널 기반의 NFS 서버가 속도가 빠르다.
          이 옵션은 NFS V2를 지원한다.

          [ ]   Provide NFSv3 server support  

                  NFS V3 서버를 지원한다.

          < > SMB file system support (to mount Windows shares etc.)

          SMB (Server Message Block)은 WfW, Windows 95/98, Windows NT, Lan Manager 운영체제가 LAN에서 파일 및 프린터를 공유하는데 사용하는 프로토콜이다.

          이 옵션을 선택하면 리눅스에서 이들 운영체제의 하드를 마운트해 유닉스 디렉토리처럼 사용할 수 있게
          해준다. 단 이들 윈도우 시스템이 전송프로토콜로 TCP/IP 를 사용할 경우에만 가능하다.
          (NetBEUI 에서는 안된다.)
          리눅스의 하드 및 프린터를 윈도우에서 공유하게 해줄 경우는 이 옵션은 필요 없다.(SMB 서버)
          SAMBA 프로그램을 리눅스에 설치하면 된다. (윈도우에 TCP/IP 를 추가해야 한다.)

          [ ]    Use a default NLS (NEW)

            smbfs 에서 NLS 번역을 사용하게 한다.

          Default Remote NLS Option:  (NEW)

            SMB 서버의 코드 페이지를 지정한다. 지정하지 않으면 NLS 번역을 사용하지 않는다.

          < > NCP file system support (to mount NetWare volumes)?

          NCP (NetWare Core Protocol) 는 노벨 네트웨어 클라이언트가 서버와 연결하는데 사용하는 프로토콜이다. 리눅스에서 네트워어 파일서버 볼륨을 마운트해 사용하게 해준다.

          ◀ Partition Types  --->

          [*] Advanced partition selection

          아래의 메뉴를 추가해 준다.  리눅스 시스템과 다른 아키텍쳐를 갖는 운영체제에서 파티션한 하드를 리눅스에서 사용할 경우에 해당되는 아키텍쳐를 아래 메뉴에서 선택한다.

          [ ]   Acorn partition support
          [ ]   Alpha OSF partition support
          [ ]   Amiga partition table support
          [ ]   Atari partition table support
          [ ]   Macintosh partition map support
          [*]   PC BIOS (MSDOS partition tables) support

          x86 PC에서 파티션한 하드를 리눅스에서 사용할 경우 지정한다.(도스에만 해당되는 건 아니다.)

          [ ]     BSD disklabel (FreeBSD partition tables) support
          [ ]     Minix subpartition support
          [ ]     Solaris (x86) partition table support

          Solaris x86 파티션 테이블을 리눅스에서 읽게 해주므로 이들 하드를 마운트할 수 있다.
          “UFS file system support” 를 필요로 한다.
          (하드의 파티션 테이블을 읽을 수 있다고 그 하드의 파일시스템을 사용할 수 있지는 않다. 둘은 무관하다.)

          [ ]     Unixware slices support

          [ ]   SGI partition support
          [ ]   Ultrix partition table support
          [ ]   Sun partition tables support

          SunOS에서 만든 하드디스크 파티션을 읽을 수 있게 하므로 이들을 마운트 할 수 있다.
          “UFS  file system support” 을 같이 선택해야 한다. SunOS가 설치된 Sparc 기종의 데이터를 이동식 하드나 ZIP 드라이브등에 담아 리눅스로 옮기는 경우 등에 필요하다.
          (유닉스에서 리눅스로 데이터를 옮길 때는 tar 를 사용하는 것이 편하다.)

          ◀ Native Language Support  --->

          Default NLS Option: “iso8859-1”    

          파일시스템을 마운트할 때 사용하는 디폴트 NLS 이다. 아래가 선택 가능한 목록이다.
          디폴트는 iso8859-1이다.

          big5, cp437, cp737, cp775, cp850, cp852, cp855, cp857, cp860, cp861, cp862, cp863, cp864, cp865, cp866, cp869, cp874, cp932, cp936, cp949, cp950, euc-jp, euc-kr, gb2312, iso8859-1, iso8859-2, iso8859-3, iso8859-4, iso8859-5, iso8859-6, iso8859-7, iso8859-8, iso8859-9, iso8859-14, iso8859-15, koi8-r, sjis

             < > Codepage 437 (United States, Canada)
             < > Codepage 737 (Greek)
             < > Codepage 775 (Baltic Rim)
             < > Codepage 850 (Europe)
             < > Codepage 852 (Central/Eastern Europe)
             < > Codepage 855 (Cyrillic)
             < > Codepage 857 (Turkish)
             < > Codepage 860 (Portugese)
             < > Codepage 861 (Icelandic)
             < > Codepage 862 (Hebrew)
             < > Codepage 863 (Canadian French)
             < > Codepage 864 (Arabic)
             < > Codepage 865 (Norwegian, Danish)
             < > Codepage 866 (Cyrillic/Russian)
             < > Codepage 869 (Greek)
             < > Codepage 874 (Thai)
             < > Codepage 932 (Shift-JIS, EUC-JP)  
             < > Codepage 936 (GBK)
             < > Codepage 949 (UnifiedHangul)    
             < > Codepage 950 (Big5)      
             < > NLS ISO 8859-1  (Latin 1; Western European Languages)  
             < > NLS ISO 8859-2  (Latin 2; Slavic/Central European Languages)  
             < > NLS ISO 8859-3  (Latin 3; Esperanto, Galician, Maltese, Turkish)  
             < > NLS ISO 8859-4  (Latin 4; Estonian, Latvian, Lithuanian)  
             < > NLS ISO 8859-5  (Cyrillic)    
             < > NLS ISO 8859-6  (Arabic)  
             < > NLS ISO 8859-7  (Modern Greek)    
             < > NLS ISO 8859-8  (Hebrew)        
             < > NLS ISO 8859-9  (Latin 5; Turkish)        
             < > NLS ISO 8859-14 (Latin 8; Celtic)        
             < > NLS ISO 8859-15 (Latin 9; Western European Languages with Euro)    
             < > NLS KOI8-R (Russian)        
             < > NLS UTF8


      25. Console drivers  --->

        [*] VGA text console  

          VGA 표준을 지원하는 그래픽 카드에서 텍스트모드를 지원한다. 필수로 선택해야 한다.
          SVGA 카드에서 텍스트모드를 사용하려면 SVGATextMode 프로그램을 설치해야 한다.

        [ ] Video mode selection support    

          커널로드시 텍스트모드 선택을 가능하게 한다. 이 옵션을 선택 후 lilo.conf에서 “vga= “ 옵션을 추가하면 부트시 텍스트모드 선택이 가능하다.

        < > MDA text console (dual-headed) (EXPERIMENTAL)                

          MDA 혹은 모노 허큘리스 카드를 두 번째의 그래픽 카드로 사용하게 해 준다.

          ◀ Frame-buffer support  --->

          프레임버퍼장치는 그래픽 하드웨어에 대한 단축이다. 이 장치는 몇몇 비디오(그래픽) 하드웨어의 프레임 버퍼를 대표해 주므로 응용프로그램이 그래픽 하드웨어를 접근하는데 필요한 잘 정의된 인터페이스를 제공한다. 따라서  그래픽 프로그램은 저 수준(low level) 하드웨어 장치(레지스터)에 대한 지식을 필요로 하지 않는다.

          [*] Support for frame buffer devices (EXPERIMENTAL)                    
          < >   nVidia Riva support (EXPERIMENTAL) (NEW)                          
          < >   Cirrus Logic support (EXPERIMENTAL) (NEW)                        
          < >   Permedia2 support (EXPERIMENTAL) (NEW)                            
          < >   Cyber2000 support (NEW)                                          
          [ ]   VESA VGA graphics console (NEW)                                  
          < >   VGA 16-color graphics console (NEW)                              
          < >   Hercules mono graphics console (EXPERIMENTAL) (NEW)              
          < >   Matrox acceleration (EXPERIMENTAL) (NEW)                          
          < >   ATI Mach64 display support (EXPERIMENTAL) (NEW)                  
          < >   ATI Rage 128 display support (EXPERIMENTAL) (NEW)                
          < >   3Dfx Banshee/Voodoo3 display support (EXPERIMENTAL) (NEW)        
          < >   SIS 630/540 display support (EXPERIMENTAL) (NEW)                  
          < >   Virtual Frame Buffer support (ONLY FOR TESTING!) (NEW)            
          [ ]   Advanced low level driver options (NEW)                          

          프레임버퍼 콘솔은 그래픽 하드웨어 메모리의 픽셀의 조합에 의거 글자를 표시한다. 이를 로우레벨 프레임버퍼 콘솔 드라이버라고 부른다. 이는 오직 텍스트 콘솔에만 사용된다. 이 옵션을 선택하지 않으면 로우레벨 프레임버퍼 드라이버가 자동으로 사용된다. 이 옵션을 선택하면 로우레벨 드라이버에 대한 보다 세밀한 선택이 가능하다. 예를 들면 사용하지 않는 색상표의 드라이버를 제외하는 것 등이다.

          < >     Monochrome support (NEW)                  
          < >     2 bpp packed pixels support (NEW)                              
          < >     4 bpp packed pixels support (NEW)                              
          < >     8 bpp packed pixels support (NEW)                              
          < >     16 bpp packed pixels support (NEW)                              
          < >     24 bpp packed pixels support (NEW)                              
          < >     32 bpp packed pixels support (NEW)                              
          < >     Amiga bitplanes support (NEW)                                  
          < >     Amiga interleaved bitplanes support (NEW)                      
          < >     Atari interleaved bitplanes (2 planes) support (NEW)            
          < >     Atari interleaved bitplanes (4 planes) support (NEW)            
          < >     Atari interleaved bitplanes (8 planes) support (NEW)            
          < >     Mac variable bpp packed pixels support (NEW)                    
          < >     VGA 16-color planar support (NEW)                              
          < >     VGA characters/attributes support (NEW)                        
          < >     HGA monochrome support (EXPERIMENTAL) (NEW)

          [ ]   Support only 8 pixels wide fonts (NEW)                            

            8x8 폰트만을 사용하게 한다.

          [ ]   Select compiled-in fonts (NEW)

            프레임버퍼 콘솔에서 사용하는 디폴트 폰트 외의 다른 폰트를 선택할 수 있다. 이 옵션은 단지 아래 메뉴를 표시해 준다.

          [ ]     VGA 8x8 font                                                      
          [*]     VGA 8x16 font                                                      

            VGA 80x25 모드에서 사용하는 기본 폰트이다.

          [ ]     Sparc console 8x16 font (NEW)                                      
          [ ]     Sparc console 12x22 font (not supported by all drivers) (NEW)      
          [ ]     Mac console 6x11 font (not supported by all drivers) (NEW)        
          [ ]     Pearl (old m68k) console 8x8 font (NEW)                            
          [ ]     Acorn console 8x8 font (NEW)


      26. Sound  --->

        사운드 카드를 사용할 경우 해당 드라이버를 선택한다. ISA 사운드 카드를 사용할 경우는 사운드 카드의 설정에 대한 자세한 정보를 미리 알아야 한다.( IO Address, IRQ, DMA )

        PnP 사운드 카드를 사용하면서 부팅시 ISA PnP tools 를 사용해 설정하려면 아래에서 해당 카드 지원을 모듈로 선택하고 PnP 설정이 끝난 후 모듈로 올려야 한다.

            <*> Sound card support                                                    
            < >   C-Media PCI (CMI8338/8378)                                          
            < >   Creative SBLive! (EMU10K1)                                          
            < >   Crystal SoundFusion (CS4280/461x)                                  
            < >   Crystal Sound CS4281                                                
            < >   Ensoniq AudioPCI (ES1370)                                          
            <*>   Creative Ensoniq AudioPCI 97 (ES1371)                              
            < >   ESS Technology Solo1                                                
            < >   ESS Maestro, Maestro2, Maestro2E driver                            
            < >   S3 SonicVibes                                                      
            < >   Trident 4DWave DX/NX, SiS 7018 or ALi 5451 PCI Audio Core          
            < >   Support for Turtle Beach MultiSound Classic, Tahiti, Monterey      
            < >   Support for Turtle Beach MultiSound Pinnacle, Fiji                  
            < >   VIA 82C686 Audio Codec                                              
            < >   OSS sound modules

        OSS 는 Open Sound System 사운드 드라이버이다. 위에 해당하는 카드가 없으면 아래에서 고른다.

          Verbose initialisation (NEW)
          Persistent DMA buffers (NEW)
          AD1816(A) based cards (EXPERIMENTAL) (NEW)
          Aztech Sound Galaxy (non-PnP) cards (NEW)
          Adlib Cards (NEW)
          ACI mixer (miroPCM12) (NEW)
          Crystal CS4232 based (PnP) cards (NEW)
          Ensoniq SoundScape support (NEW)
          Gravis Ultrasound support (NEW)
          Loopback MIDI device support (NEW)
          MediaTrix AudioTrix Pro support (NEW)
          Microsoft Sound System support (NEW)                                  
          MPU-401 support (NOT for SB16) (NEW)                                  
          NM256AV/NM256ZX audio support (NEW)
          OPTi MAD16 and/or Mozart based cards (NEW)                            
          ProAudioSpectrum 16 support (NEW)
          PSS (AD1848, ADSP-2115, ESC614) support (NEW)                          
          100% Sound Blaster compatibles (SB16/32/64, ESS, Jazz16) support (NEW)
          AWE32 synth (NEW)                                                      
          Full support for Turtle Beach WaveFront (Tropez Plus, Tropez, Maui) syn
          Limited support for Turtle Beach Wave Front (Maui, Tropez) synthesizers
          Yamaha FM synthesizer (YM3812/OPL-3) support (NEW)                    
          Yamaha OPL3-SA1 audio controller (NEW)                                
          Yamaha OPL3-SA2 and SA3 based PnP cards (NEW)                          
          Yamaha YMF7xx PCI audio (native mode) (NEW)                            
          6850 UART support (NEW)                                                
          Gallant Audio Cards (SC-6000 and SC-6600 based) (NEW)

        <M>   TV card (bt848) mixer support (NEW)


      27.  USB support  --->

        Universal Serial Bus (USB)는 기존의 피시의 시리얼포트보다 빠른 데이터 이동 속도, 다양한 기능을 갖는 새로운 시리얼버스 하부시스템 표준이다. 연결 주변기기에 대한 전원 공급 기능과 핫스왑(전원을 끄지 않고 장치를 연결하거나 제거하는 것) 기능을 지원한다.

        한 개의 USB 포트에 트리 구조로 127 개의 USB 장치를 연결할 수 있다. 스캐너, 키보드, 마우스, 프린터 등 상당수의 주변기기가 USB를 지원한다.

        시스템이 USB 를 지원한다면 USB 하드웨어에 따라 “UHCI support” 또는 “OHCI support” 중에서 하나를 선택하고 해당 USB 장치 지원을 추가해야 한다.

        <*> Support for USB        
        [ ]   USB verbose debug messages        

          USB 드라이버에서 자세한 디버그 정보를 시스템 로그 파일에 기록해 준다.

        --- Miscellaneous USB options                                              
        [ ]   Preliminary USB device filesystem                                    

          “/proc file system support” 옵션과 이 옵션을 선택하면 /proc/usb/devices에서 USB 버스에 연결된 장치를 알 수 있다. /proc/usb/drivers 에서는 현재 로드된 USB 커널 클라이언트 드라이버를 확인할 수 있다.

        [ ]   Enforce USB bandwidth allocation (EXPERIMENTAL)                      

          USB 서브시스템이 USB 대역폭 할당을 감시할 수 있게 한다. 이 옵션을 선택하면 USB 버스 대역폭 사용율이 90% 이상으로 올라가면 이 장치의 사용을 제한한다.

        --- USB Controllers                                                        
        <*>   UHCI Alternate Driver (JE) support                                  

          Universal Host Controller Interface 는 피시에서의 USB 하드웨어 접근에 대한 Intel 사의 표준이다.
          Intel PCI 칩셋 (intel 430TX, 440FX, 440LX, 440BX, i810, i820 등)이 이 표준을 따른다. 모든 VIA PCI 칩셋 (VIA VP2, VP3, MVP3, Apollo Pro, Apollo Pro II, Apollo Pro 133)도 해당된다.

        < >   OHCI (Compaq, iMacs, OPTi, SiS, ALi, ...) support                    

          Open Host Controller Interface 는 Compaq/Microsoft/National 의 USB 표준이다. 대부분의 비 인텔 기종과 인텔 칩셋을 사용하지 않는 일부 x86 호환 기종- SiS (aktual 610, 610 등), ALi (ALi IV, ALi V,  Aladdin Pro 등 )이 이 표준을 따른다.

           --- USB Device Class drivers                                              
           < >   USB Audio support                                                    
           < >   USB Bluetooth support (EXPERIMENTAL)                                
           <*>   USB Mass Storage support                                            
           [ ]     USB Mass Storage verbose debug                                    
           [ ]     Freecom USB/ATAPI Bridge support                                  
           < >   USB Modem (CDC ACM) support                                          
           < >   USB Printer support                                                  
           --- USB Human Interface Devices (HID)                                      
           ---   Input core support is needed for USB HID                            
           --- USB Imaging devices
           < >   USB Kodak DC-2xx Camera support                                    
           < >   USB Mustek MDC800 Digital Camera support (EXPERIMENTAL)              
           < >   USB Scanner support                                                  
           < >   Microtek X6USB scanner support (EXPERIMENTAL)                        
           --- USB Multimedia devices                                                
           < >   DABUSB driver                                                        
           --- USB Network adaptors                                                  
           < >   PLUSB Prolific USB-Network driver (EXPERIMENTAL)                    
           < >   USB ADMtek Pegasus-based ethernet device support (EXPERIMENTAL)      
           < >   NetChip 1080-based USB Host-to-Host Link (EXPERIMENTAL)              
           --- USB port drivers                                                      
           USB Serial Converter support  --->                                        

                <M> USB Serial Converter support                                              
                [ ]   USB Serial Converter verbose debug (NEW)                                
                [ ]   USB Generic Serial Driver (NEW)                                        
                < >   USB Belkin and Peracom Single Port Serial Driver (EXPERIMENTAL) (NEW)  
                < >   USB ConnectTech WhiteHEAT Serial Driver (EXPERIMENTAL) (NEW)            
                < >   USB Digi International AccelePort USB Serial Driver (NEW)              
                < >   USB Empeg empeg-car Mark I/II Driver (EXPERIMENTAL) (NEW)              
                < >   USB FTDI Single Port Serial Driver (EXPERIMENTAL) (NEW)                
                < >   USB Handspring Visor Driver (NEW)                                      
                < >   USB Keyspan PDA Single Port Serial Driver (EXPERIMENTAL) (NEW)          

                < >   USB Keyspan USA-xxx Serial Driver (EXPERIMENTAL) (NEW)                  
                < >   USB MCT Single Port Serial Driver (EXPERIMENTAL) (NEW)                  
                < >   USB ZyXEL omni.net LCD Plus Driver (EXPERIMENTAL) (NEW)

        --- USB misc drivers                                                      
           < >   USB Diamond Rio500 support (EXPERIMENTAL)


      27.  Kernel hacking  --->

        [*] Magic SysRq key

        커널 디버깅 도중에 시스템이 중단되더라도 시스템에 대한 일부 통제가 가능하다.

신고

':::::Computer:::::' 카테고리의 다른 글

현대 기아 자동차 공모전  (0) 2007.09.28
Kernel compile make menuconfig  (0) 2007.02.26

책이라는 물건.

분류없음 2007.02.18 01:12 by LoofBackER

나에게 있어서 책이라는 물건은 정말 많이 갖고 싶은 물건임에 틀림없다.
책은 많이 가지고 있을 수록 좋은것 같다.
내가 요새 많이 읽는 분야는 리눅스 커널쪽으로 많이 읽고 있다.
이제야 커널에 대해 조금 알것 같다.

처음에는 프로그래밍쪽 책만 몽창 봤었다.
C C++ C# 등등등....
그러다가 API같은 윈도우 프로그래밍쪽으로 넘어가서 API MFC 윈도우관련책을 많이 보다가
네트워크 쪽에 관심이 많이 생겨서 그쪽으로 많은 책을 보았다.
윈도우 네트워크쪽....
tcp/ip wireless 이런쪽만 보다가..

현재는 os 개념에 관한 책을 주구장창 보다가 이제는 Linux쪽으로만 보고 있다.

나에게 있어서 책은 정말 재미있는 도구이다.

책을 통해 저자와 대화를 할수 있다.
내 책을 누군가가 빌려 가는것은 정말 싫다.
내책이 상처 입는 것은 정말 싫다.

그렇지만 관심없는 토익책은 정말 버리도 싶다.
보지도 않는 토익책...
ㅋㅋㅋ

토익책은 사기만 하고 잘 보지도 않는다.
나는 토익을 이겨야 하지만. 적을 알고 나를 알아야 하는데.
나도 나를 잘 모르겠고
적은 도통 모르겠다.
젠장.........

신고
2006년 멤버십에 들어오고
2월까진 신입집중 세미나를 하고
3월에 헐레 벌떡 지나가고
복학하고 그렇게 바라던 학생이 되었지만.
학생인척 하면서 학교는 가질 않는 날라리 학생이 되어 버렸다.
왜냐면..
4월부터 준비한 우리 ZBOS팀이 3개월에 걸친 두번의 과제를 마쳤다.
횟수로 치자면 6개월뿐이지만 준비 기간 중간에 쉬는 기간까지 합치면 거의 1년을 쏟아 부은 프로젝트 였는데.

네트워크 멀티미디어 에 강한 OS를 만들겠다고 .....
시작한 총 3차에 걸쳐 계획된 과제였지만.
2차로 그만두게 되었다.
1차때는 우리에 던져진  EZ-X5 보드 세개.
우리는 이것을 가지고 시작을 해야 한다.
부트로더를 올려서 부팅을 한번 시켜 보았다.
부트로더는 ez_boot를 사용 하였다.
이것은 FALINUX에서 제공하는 BSP중에 하나이다.
원래 EZ-X5는 리눅스가 올라가게 설계 되어 있는 보드이다.
FALINUX는 보드를 팔면서 친절하게도 EZBOOT와 EZ-X5용 리눅스 커널을 제공한다.
흔히들 BSP라고 하는 그런것들을 제공한다.
우리는 EZ-X5의 스펙을 보고 EZBOOT와 같은 부트로더를 만들어도 되지만 우리가 만들 커널을 시작 시켜줄 부트로더는 그렇게 많은 기능이 필요 하지 않았으므로 그냥 많은 수정을 가한 EZBOOT를 사용 하기로 했다.
많은 수정은 물론 우리가 했다.
이렇게 많은 수정을 한 ZBBOOT라고 이름 지어진 부트로더를 올리고 아주 작은 커널을 만들었다.
처음엔 이것이 커널인지 아닌지를 알기위해 무엇을 해볼까 하다가 LED를 켜봐야 겠다는 생각을 해서 LED를 켜는 루틴만이 들어간 커널을 제작 하였다.
하지만 아무리 켜라고 켜라고 해도 켜지지가 않았다.
완벽한 바이너리가 만들어지지 않은것이었다.
arm-linux-gcc를 컴파일러로 사용 했지만 gcc의 컴파일러 옵션도 제대로 모르는 우리는 당황했고 더이상 진척이 되지 않았다.
Makefile을 만들어야 하는데......
상수형의 도움이 컸다.
Makefile을 제대로 만들고 이제 다시 시도 하였다.
LED가 켜졌다.
감격이었다.
ㅋㅋ
이제 다 끝났다 라는 생각이 조금 들었다.
우리만의 커널이 보드에 올라간것이다.
LED만 껌뻑이는 OS
사실 이건 OS라 불리울수 없지만...
이제 하나 하나씩 정복해나간다.
커널 초기화 루틴
인터럽트
타이머
프로세스
스케쥴러
동기화
메모리 관리
디버깅 함수
라이브러리 함수
메시지큐
네트워크 프로토콜 스택
등등등
차례대로 수순을 밟아가며 여러가지 일을 했다.
많이 공부 했다.
암프로세서를 공부하고
OS를 공부하고
임베디드 시스템을 공부하고
리눅스를 공부하고
모든것이 처음이었다.
모든것을 우리가 만들어야만 했다.
간단한 printf뿐만 아니라
모든것은 그냥 있는것이 아니었다.
모든것은 무에서 유로 나아가는 것이었다.
처음부터 다 있었던것은 아니었다.

다 없던것이 었다.
그런것들이 있으므로 해서 개발자들은 편하게 개발을 할 수 있는것이다.

나는 차려준 밥상에서 숫가락을 이용해서 밥을 퍼먹는 사람이 되는것 보단

밥상은 나무를 키워서 자른다음에 못으로 박아서 만들고
그릇은 흙으로 빚어서 만들고
반찬은 산에서 바다에서 들에서 오는 것이고
숫가락은 철로 만들고
나의 정성으로 밥상이 배치 되는 과정을 하나 부터 끝까지 내손으로 직접 해서
밥을 먹는 사람에게 주고 싶다.

난 하드웨어 시스템이 달랑 던져 졌을때
그 시스템을 살리는 기계에 영혼을 불어 넣어주는 사람이 되고 싶다.

멤버십에서 프로젝트를 해보면서 느낀점이다.
나는 원래 MS 개발자들이 만들어준 MS-Windows xp 를 설치하고
MS-Visual Stdio 6.0을 설치해서 거기에 설치된 라이브러리를 이용하여
윈도우  api를 이용하여 프로그램을 만드는 사람이었다.
MS가 독점을 하기위해 많은것을 우리것을 쓰라는 강요 아닌 강요를 당연 한 듯이 받아들이는
사람이었지만.
나도 이제 애플리케이션 개발자에게 나의 시스템을 쓰라고 강요 하는 사람이 되고 싶다.
내가 만든 소프트웨어는 기계들을 통솔하며 관리 할것이다.

이러한 부분에 흥미가 간다......

2과제에서는
1차과제에서 만든 커널에 GUI SYSTEM과 FILESYSTEM DEVICE DRIVER를 만드는것이다.
GUI는 정말 어려웠다.
윈도우의 대단함을 느꼈고
왜 윈도우 프로그래밍을 저렇게 하는지도 알았다.
윈도우 프로그래밍을 하면서 당연히 썼던
CreateWindow나 FindWindow 모든 API 함수가 어떠한 루틴을 따라 이동할지
모든걸 상상해 보았다.
왜냐하면 GUI는 공개된 코드가 거의 없다고 봐도 되기때문이다.
그리고 공개된것은 어마어마 하게 커서 분석은 되지만 적용 할 수는 없다.
그리고 코어부분은 모두 비공개이다.
돈이 되거덩..
우리는 다 새롭게 만들었지만 메시지 드리븐 방식을 바꿀수는 없었다.
스레드 기반으로 GUI를 만들수가 없다 라는 것을 알았다.
멀티쓰레딩으로 GUI를 못짜는것은 이유가 있었다.
동기화의 높은 비용을 감당할수 없으며
버그 투성이의 멀티 쓰레드 코드를 커널에 집어 넣은다면 OS의 안정성은
보장 받을수 없다.
라는 결론을 다른 커널 개발자들은 몇년전에 깨달았을 것이다.
나도 깨달았다.
FILE SYSTEM은 정말 어려운 구조임에 틀림없다.
EXT3와 FAT32
YAFFS 등등을 개발할 생각이었지만
FAT와 YAFFS만을 추가하는데 그쳤다.
디바이스 드라이버는 LCD TOUCHPAD PS2 TOUCHSCREEN  등등 여러가지를 개발 하였다.
디바이스드라이버 개발은 순조로웠다.
데이터 시트가 다 말해주고 있고 그걸 코드화 시키면 되느것였지만.
장비의 부족으로 시간이 많이 소요 됐다.
LCD Device Driver 없이 상상의 GUI System을 짜고 상상의 Font를 만드는 작업은
쉽지 않은 작업이었다.

이렇게 2차과제도 끝나고
지금은 쉬고 있다.
네트워크 멀티미디어에 강한 OS 인지 아닌지 확인을 3차에서 해야 하는데
3차를 못하게 되서 아쉽다.

그렇지만 많은것을 얻었다.
내가 나아갈 길을 알았고
친구를 얻었으며 나를 알았다.
계속 전진 하는 나를 보고 싶다.
신고

2007년도 1학기 시간표

분류없음 2007.02.13 01:28 by LoofBackER

사용자 삽입 이미지


신고

성공한 기업인의 특징

분류없음 2007.02.09 15:54 by LoofBackER

기자는 지난 24년간 오직 "중소기업"만 담당해왔다.


그동안 받아놓은 "대표이사"의 명함만해도 1만6백장에 이른다.

이 명함속의 사장들 가운데 참 많은 기업인들이 부도를 내거나 도산한 뒤 사라져버렸다. 그래서 이미 못 쓰게 된 대표이사 명함이 2천1백여장에 달한다.


이와 반대로 약 2천5백여명의 기업인들은 갈수록 승승장구하고 있다. 이처럼 승승장구하는 기업인들은 과연 어떤 공통점을 가졌을까.

이들의 공통점을 차근히 찾아봤다.


결국 성공하는 기업인들에겐 5가지의 독특한 체질을 가졌다는 판단을 내리게 됐다.


성공하는 기업인들의 첫 번째 조건은 "새벽체질"을 가졌다는 것이다. 사람들은 새벽을 좋아하는 체질과 저녁을 더 좋아하는 체질로 나뉜다.어김없이 사업을 잘하는 사람들은 새벽을 더 좋아한다.

새벽부터 일어나서 설쳐댄다.


이에 비해 문학인 화가 예능인 등은 저녁을 좋아한 나머지 새벽이 돼야 잠자리에 들어 해가 중천에 떠야 일어난다.


한국에서 새벽에 일찍 일어나기로 유명한 기업인은 명화금속의 임정환 사장이다. 그는창업을 한 이후 40여년간 단 한번도 하루 4시간 이상을 자본 적이 없다고 한다. 덕분에 건축용 나사를 만들던 그는 자전거용 나사를 개발해냈고 이어 자동차용 나사를 개발했으며 현재는 항공기용 나사까지 개발,미국에 공급하고 있다. 인천공항과 상암경기장의 거대한 구조물이 단단히 걸쳐져 있는 것도 임정환 사장이 개발한 특수나사 덕분이다.


벤처에셋 에듀컴 ATA 등 3개 벤처기업을 경영하면서 전경련 벤처경영자협회 회장을 맡고 있는 김성수 회장도 새벽체질로 유명하다.


두 번째의 성공조건은 허풍을 잘쳐야 한다는 것이다. 조금 어처구니 없는 조건인 듯 보이지만 참 중요한 성공조건이다. 허풍이란 부정적으로 보면 거짓말을 잘 한다는 얘기일수도 있다.


그러나 긍정적으로보면 허풍은 의욕적이란 뜻이다. "창업을 한 뒤 3년만에 코스닥에 상장하겠다"고 공언하는 기업인을 보고 어느 누가 허풍쟁이라고 말하지 않겠는가. 하지만 미래의 비전을 제시하는 사람은 허풍을 떨지 않을 수가 없다.


서인원 넥스콘웨이 회장이 창업 3년만에 코스닥에 상장하겠다고 했을 때 아무도 믿지 않았지만 진짜 3년이내에 코스닥에 진입하지 않았던가.


그러나 허풍을 치는데는 조건이 있다. 차분하게 치고 그 허풍을 이루도록 최대한 실천을 해야 한다. 여기서 말하는 허풍은 허황한 것과는 전혀 다르기 때문이다.


세번째 조건은 사람을 믿는다는 것이다. 성공한 기업인들을 보면 "좋다" "싫다"가 분명하다. 신규사업을 선택할 때도 그렇고 사람을 선택할 때도 그렇다. 일단 좋아하는 사람을 선택하면 그 사람을 철저하게 믿는다. 사람을 믿는 사장은 그 사람에게 일을 철저하게 맡긴다. 남에게 일을 맡길 수 없는 사람은 구멍가게는 할 수 있어도 큰 사업을 해내진 못한다.


리모델링업체인 끌과정의 조일환 사장도 호오(好惡)가 분명한 기업인이다. 대신에 부하직원을 한번 믿으면 끝까지 믿는다. 덕택에 한국에서 가장 선도적인 리모델링업체로 성장했다.


유완영 IMRI 회장도 부하직원을 철저히 신뢰하기로 유명하다. 한번 일을 맡기면 결국 해낼때까지 격려해준다. 이런 신뢰가 북한 평양에 4개의 컴퓨터 모니터공장을 운영하는 발판이 됐음에 틀림없을 것이다.


네 번째 조건은 "아낀다"는 것이다. 구두쇠가 아닌 사람은 일단 기업인으로서는 탈락이다. 기업이란 언제나 "밑빠진 독"과 마찬가지이기 때문이다. 부하직원이 접대를 할 때 설렁탕 한그릇이면 충분한 식사를 고급일식으로 접대했다면 회사돈을 횡령한거나 마찬가지란 생각을 가져야 성공할 수 있다.


사원들이 제출한 영수증을 최종점검하는 습관을 가져야 승승장구할 수 있다. 60년간 중소기업인으로서 최고의 성공가도를 달려온 삼화인쇄의 유기정 회장의 사무실을 방문했을 때 수백장에 이르는 영수증과 견적서를 일일이 점검해보는 것을 보고 놀란 일이 있다. 그는 식사때 단 한톨의 밥알도 남기지 않는 습관을 가졌다. 이국노 지주 회장은 대규모 플라스틱 파이프 생산업체의 사장이지만 15년전의 양복을 아직도 입고 다닌다.


다섯째 조건은 잔돈을 꼭 갚는다는 것이다. 학교 다닐 때 친구중에 잔돈을 빌려가면 꼭 갚는 친구가 있는가 하면 곧 잊어버리는 친구가 있었을 것이다. 그때 잔돈을 잘 갚지않던 친구와는 절대 동업을 해서는 안된다. 남의 돈을 잘 갚는다는 것은 신용 즉 크레딧이 높다는 뜻이다.


기업인으로서는 돈 거래가 분명해야 한다. 거래업체나 은행에 결제해주는 걸 차일피일 미루는 사람은 언젠가는 신용을 잃고 만다. 신용이 낮으면 신보 기술신보 등 보증기관을 활용하기가 힘들어진다.

중소기업청 및 중소기업진흥공단을 통해 정책자금을 활용하기도 어려워진다.


자,여기서 각자 자신의 점수를 매겨보는 것이 바람직 할 것 같다.

이 다섯가지 중에 3가지 이상 합격점을 맞으면 기업인으로 그럭저럭 꾸려나갈 수 있다.

4가지가 맞으면 성실한 기업인이 될 수 있다.

5가지를 다 맞으면 최고의 성공기업인으로 보장받을 수 있다.

5가지가 다 맞아떨어지는 사람이 아직 월급쟁이라면 당장 사표를 내고 창업을 해도 좋다.

신고

coding and memory status

분류없음 2007.02.07 23:34 by LoofBackER
Program sections
reflect different logical parts of program

text - program code
data - initialized variables
bss (block started by symbol) - uninitialized variables
stack - automatically allocated variables (local variables) and other stack frame entries
heap - dynamically allocated variables

사용자 삽입 이미지



 

신고

성적은 이렇게 받아야지

분류없음 2007.02.07 18:33 by LoofBackER

사용자 삽입 이미지

어떤놈이 이렇게 받았나보다.
어떤놈이.,.
그 어떤놈이 내가 되어야만 한다.

신고

Qplus

분류없음 2007.02.06 05:43 by LoofBackER
Qplus는 지능형 로봇이나 셋탑박스 같은 다양한 임베디드 기기들을 지원하고 있는
리눅스 기반의 임베디드 운영체제이다. 단일한 인터페이스 API를 지원을 목표로 하여
플랫폼에 관계없이 포팅이 가능하도록 개발을 수행하고 있다. 국제 표준규격인 POSIX와
호환되며, 정보 가전 기기의 국제표준 포럼인 CELF(Consumer Electronics Linux Forum)의
공식 릴리즈 패치를 지원하고 있다.

Qplus는 풍부한 응용 프로그램의 지원 및 빠른 업그레이드 등의 리눅스 시스템의 장점을 그대로
살리고 있으며, 또한 일반적인 리눅스 시스템의 취약한 기능들을 보완하여 임베디드 운영체제로
서의 기능을 충실하게 제공하고 있다.
Qplus는 규모에 따라서 크게 표준형, 마이크로형, 나노형의 3가지 형태가 있다. 표준형은 DTV
셋탑박스, 홈서버 등과 같은 내장형 시스템을 주 대상으로 하며, 마이크로 형은 실시간성이
강화되는 지능형 로봇이나 텔레매틱스 단말, 스마트 폰과 같은 소형 기기에 적합하다. 나노형
Qplus<링크 연결>는 유비쿼터스 컴퓨팅의 핵심인 스마트 센서 네트워크를 구성하는데 사용
된다. 표준형과 마이크로형의 경우는 정확한 분류를 하기 보다는 하드웨어 단말과 응용 분야의
특성에 맞춰서 권장 소프트웨어 스택이 존재하므로 각각에 특성에 알맞게 표준형 및 마이크로형
Qplus가 탑재될 수 있다.

또한 Qplus는 사용 분야에 따라서 구성을 달리하여 크게 두 가지의 Edition으로 나뉜다.
일반적인 정보 가전 기기들을 지원하는 것을 목표로 하는 CE(Consumer Electronics)
Edition과 스마트폰, 텔레매틱스 단말 등을 지원하고자 하는 Mobile Edition의 두 가지
형태로 나누어, 임베디드 시스템 개발자들이 목적에 맞는 Edition을 사용하여 쉽고 편한
환경을 제공하고 있다.

사용자 편의 GUI를 통한 최적화된 타겟 시스템 설정 및 자동화된 적재를 지원하는 타겟 빌더
임베디드 시스템용 파일 시스템, 실시간 통신 라이브러리, 빠른 부팅지원
모바일기기에 특히 중요한 밧데리 사용 시간을 늘리기 위한 능동형 전력관리
기존 임베디드 리눅스의 실시간성 향상을 위한 경.연성 실시간 스케쥴러
멀티미디어 파일시스템 지원
특정 임베디드 시스템에 최적화된 임베디드 OS를 위한 쉽고 빠른 타겟 시스템 설정 및 구축


세부 요소 기술
1. 운영체제 설정 및 Embedding 도구 - 타겟빌더
다양한 타겟 시스템에 최적화된 형태로 임베디드 리눅스를 구축 및 적재 할 수 있도록 해주는 설정
 툴킷으로써 다음과 같은 기능을 제공한다.
- 이클립스에 기반을 둔 GUI 방식의 IDE를 통해 커널 및 기본 응용, 그리고 타겟 시스템 환경의
쉽고 편리한 통합 설정 기능 제공
- 각종 타겟 시스템에 대한 위저드 방식의 간편한 프로젝트 생성 및 다양한 설정 옵션간의
의존성 자동 체크 등의 부가 기능 제공
- 타겟 시스템을 위한 rootfs(루트 파일시스템) 이미지 자동 생성 및 적재 기능 제공
- 리눅스 커널 버전 2.6 지원 및 다양한 Architecture 지원에 따른 BSP 제공
- GPL에 기반한 자유로운 사용 가능
2. 능동형 전력관리 기술
사용단말이 소형화, 휴대화 될수록 사용시간을 늘리기 위해 전력관리의 중요성은 더욱 부각되고
있다. Qplus에서는, CELF(Consumer Electronics Linux Forum)에서 논의하는 능동형전력관리
(Dynamic Power Management) 프레임워크 위에서 시스템의 워크로드를 분석해 필요한 성능을
충족시키면서 최소한의 전력을 소모하는 것을 목표로 다음과 같은 솔루션을 제공할 예정이다.
- 커널 모니터를 제공하여 커널에서 자동으로 CPU의 Frequency를 변동
- 응용에서 필요한 최소 성능을 요구하여 CPU의 Frequency를 동적으로 변동
- 하드웨어 디바이스별로 sleep, 또는 power on/off 기능 제공
3. 실시간 스케쥴러 기술
본래 성능(Throughput)적인 측면에 초점을 맞추어 개발되던 리눅스 커널은 임베디드 시스템에
적용됨으로써 성능(Throughput)보다는 실시간성이 보다 더 중요한 이슈로 떠오르게 되었다.
이에 실시간성을 높인 리눅스 커널을 위해 아래와 같은 기술을 제공한다.
- 자발적 선점 기능 지원
- 고해상도 타이머 지원
- 인터럽트 쓰레드
- 커널 동기화 메커니즘
4. 멀티미디어 파일시스템 기술
임베디드 시스템의 경우 가격경쟁력을 위해서 저 사양의 시스템으로 구성된다. 그럼에도불구하고
 멀티미디어 응용 프로그램의 경우 과도한 입출력을 요구하는게 일반적이다. 또한 기존의 파일
시스템으로는 QoS나 데이터의 빠른 복구 등과 같은 기능은 제공할 수 없다. 멀티미디어 파일
시스템은 이러한 점을 보완하여 아래와 같은 기능을 제공한다.
- 기존의 파일 저장 구조 개선
- 멀티미디어 실시간 성능을 위한 수용제어 및 스케쥴러 개선
- I/O 우선순위와 CPU 우선순위의 연동 및 디스크 입출력 요청 큐 개선
- 파일시스템의 저널링 기능 지원
5. 운영체제 footprint 최소화 기술
비교적 적은 양의 제한된 자원 내에서 시스템을 구동시켜야 하는 임베디드 시스템을 구성하는
운영체제의 footprint는 End 제품의 가격과 탑재 응용의 한도를 결정지을 수도 있는 중요한 이슈
이다. 이에 다음과 같은 솔루션을 지원한다.
- 각 보드의 응용에 적합한 footprint를 가지는 최적화된 운영체제 지원
- footprint 최적화된 루트 파일시스템 지원
- 운영체제 커널의 세부 모듈화
- ulibc 지원 예정
6. 부팅 시간 최소화 기술
데스크톱 시스템과 달리 개인 휴대용 장비 , 셋톱 박스와 같이 부팅후 사용자가 즉각적으로
서비스의 사용을 기대하는 임베디드 시스템에서 운영체제 부팅 시간의 최소화 역시 중요한
이슈이다. 커널을 포함하는 운영체제 부팅 프로세스에서 부팅 overhead를 줄이는 기술이
주 연구 대상이다.
- 부팅 프로세스에서 시간이 오래 걸리는 구간 분석 및 단축

• Preset Loop per jiffy 지원
• Timimg API 지원

- LinuxBIOS를 사용하여 기존 BIOS를 대체하여 부팅 시간을 단축하는 기술 (x86 only) :
각 하드웨어마다 다르며 현재 2가지 종류의 보드만 지원
• SIS 5513 chipset
• VIA EPIA-M board


기술 비교
 
ETRI에서 개발한 타겟 시스템 설정 구축 및 최적화 도구인 타겟빌더는 리눅스 전문가로부터 동종
기술 분야에서 세계 제일이라 극찬한 바 있음
http://www.linuxdevices.com/articles/AT5640843706.html 참조
Qplus 마이크로 버전은 100us 수준의 최악 지연 시간 실시간 성능
세계 임베디드 리눅스 1위 업체인 Montavista의 경우 약 300us의 최악 지연 시간
세계 수준의 멀티미디어 특화된 임베디드 파일시스템, 커널 수준의 실시간 통신(RTP/RTCP)
프로토콜 지원
세계 수준의 전력관리 기술 보유. 응용의 워크로드를 분석해 지능적인 능동형 전력관리 기술을
제공함.


지원 BSP 및 하드웨어
 
x86
- Home server of ETRI ; Hestia I, II (Pentium III)
- VIA EPIA-M (VIA C3)
- Transmeta PDA Development Board
- Home server based on Samsung i815 chipset
ARM
- SMDK2400/2440 Development Board (Samsung S3C2400/S3C2440)
- PDA: iPaq (SA1110), Zaurus (SA1110)
- Tynux Box (xscale)
- IXDP425 (Xscale)
MIPS
- SmarTV Terminal Platform(PMC-SIERRA RM5231A)
- DBAu1500 Development Board (Au1500)
PPC
SWAN-II Development Board (PowerQUICC 860P/T)


릴리즈 로드맵
 
1. Qplus CE Edition 1차 릴리즈 : 2005. 04. 01.
셋탑박스(DTV, IPTV등)용 X86 하드웨어 기반
최신 2.6 커널 기반 각종 세부 기술 통합
2. Qplus CE Edition 2차 릴리즈 : 2005. 08. 31.
구성 패키지 업그레이드
3. Qplus Mobile Edition 릴리즈 : 2005. 12. 31.
전력관리 및 소형화 기술 적용
지원 BSP 확장(PXA27x 지원)
스마트폰용 기본 응용 통합
4. Qplus CE Edition 3차 릴리즈 : 2005. 12. 31.
개선된 시스템 설정도구 제공
성능 향상된 임베디드 파일시스템 제공
신고
TAG Qplus, RTOS
1 

카테고리

분류 전체보기 (107)
::::::Dairy::::: (5)
:::::what?::::: (1)
:::::Computer::::: (5)
:::::Idea::::: (2)
:::::Want::::: (1)

달력

«   2007/02   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28      

티스토리 툴바