Embedded Linux  ²©ö¶}¾÷»s§@

§@ªÌ:  kevin   ³Ìªñ§ó·s¤é´Á¡G2003-5-15
ªþµù¡G¥»¤å¬°¦Û¥Ñ¤å¥ó¡AÅwªïÂà¸ü¡AÂà¸ü¤£»Ý»P¥»¤HÁpô¡A¦ý½Ðµù©ú¥X³B¡C
¡@

¡@

¶}¾÷¹Lµ{²­z
»s§@²©ö Linux Floppy ¶}¾÷¤ù
CF CARD»s§@²©öEmbedded Linux
¡@

²¤¶

³o½g¤å³¹ªº¤º®e¡G­n¨ÏŪªÌ¤F¸Ñ Linux ¶}¾÷ªº¹Lµ{¤Î¦p¦ó²©ö»s§@ Linux ¶}¾÷¸Ë¸m ¡C·íµM¥iÀ³¥Î©ó»s§@¶Ç²ÎªºLINUX ºÏ¤ù¡A¦¹¥~¡A§Ú­ÌÁÙ±N¤¶¶@¦p¦ó§Q¥Î CF¥d¨Ó§@¬°¶}¾÷¸Ë¸m¡A¹ï·Q­n±q¨Æ embedded Linux ªº¤H¦h¦h¤Ö¤Ö¦³ÂIÀ°§U¡C

¶}¾÷¹Lµ{²­z

¦bÁÙ¨S¦³½Í½×¦p¥i»s§@²©ö Floppy Linux ¤§«e¡A­º¥ý­nÁA¸Ñ¾ã­Ó¶}¾÷ªº¹Lµ{¡C·í¤@³¡¹q¸£¤@¥´¶}¹q·½®É¡A¹q¸£¸Ìªº BIOS ´N·|§ä´M¦³µL¨t²Î¶}¾÷ºÏ¤ù¡A¦¹®É·|¦³¨âºØª¬ªp²£¥Í¡G²Ä¤@ºØª¬ªp´N¬O§ä¨ì¨t²Î¶}¾÷ºÏ¤ù¡A¦¹®É´N·|±q¨t²Î¶}¾÷ºÏ¤ù¤¤ªº²Ä 0 ºÏ°Ï¡B²Ä 0 ºÏ¬W¸ü¤J¥i¶}¾÷ºÏ°Ï¡F¥t¤@ºØª¬ªp´N¬O§ä¤£¨ì¨t²Î¶}¾÷ºÏ¤ùªº¸Ü¡A BIOS ´N·|§ä´MµwºÐªº MBR ¡] Master Boot Record ¡^¡A¨Ã¥B°õ¦æ°O¿ý¦b MBR ¤Wªº¶}¾÷¸ü¤Jµ{¦¡¡] Boot Loader ¡^¶i¦æ¶}¾÷¡C(¹ïCF¥d¦Ó¨¥¥²¶·¦Û¤v¦w¸ËMBR)

¤£ºÞ¬O±q³nºÐ¶}¾÷¤]¦n¡AÁÙ¬O±qµwºÐ¶}¾÷¤]½}¡A­º¥ý¾ã­Ó§@·~¨t²Îªº loader ¡]´N Linux ¨ÓÁ¿´N¬O LILO ¡y LInux LOader ¡z¡^·|¸ü¤J Linux Kernel ¡A¦Ó Kernel ¤@°_°Êªº²Ä¤@¥ó¨Æ´N¬O¶i¤J«OÅ@¼Ò¦¡¡] protected mode ¡^¡A©Ò¦³ªºµwÅ饿¥Ñ Kernel ¨Ó±±¨î¡AÂ\ ²æ BIOS ªº²o²Ì¡C(§Ú­Ì¤§«á±N§Q¥ÎSYSLINUX¨Ó°µ¬°LOADER)

¤@¥¹ Kernel ¸ü¤J§¹²¦¤§«á¡A¶}©lªì©l¤Æ¨t²Î©Ò¦³µwÅé³]³Æ¡C·í©Ò¦³ªºµwÅéªì©l¤Æ§¹¦¨¤§«á¡A±µµÛ¨t²Î±N¹Á¸Õ±¾¸ü¡] mount ¡^ root filesystem ¡CRoot filesystem ´N¬O³Q±¾¤W·í§@¡¨ / ¡¨¥Ø¿ýªº filesystem ¡CKernel ¥²¶·ª¾¹D±q­þ¸Ì¥i¥H§ä¨ì root filesystem ¡] PS 

¤@¯ë¨t²ÎºÏºÐ¤ùªº root filesystem ·|³Q»s§@¦¨¥H ramdisk °õ¦æ¤è¦¡ªº¼v¹³ÀÉ¡i image ¡j¡^¡A§_«h¨t²Î´N·|°±¤î¹B§@¡] halt ¡^¡C

·í root filesystem ¦¨¥\ ªº¸ü¤§«á¡A´N·|¥h°õ¦æ init ³o­Óµ{¦¡¡Ainit ´N·|¶}©lÀˬd /etc/inittab ¡A§ä¥X¸ÓÀɤ¤¼Ð©ú sysinit ³o¤@¦æ¡A¨Ã°õ¦æ¸Ó¦æªº script ¡A¦b redhat ¤W¬° rc.sysinit ¡A¦Ó rc.sysinit ·|¶i¦æ¨t²Îªºªì©l¤Æ°Ê§@¡A¦b³o¸Ì§Ú¥´ºâ¤£¤¶²Ð³o¤ä script ¦³¿³½ì¥i¥H°Ñ¦Ò redhat ¤Wªº rc.sysinit ¡C

·í rc.sysinit °õ¦æ§¹²¦¤§«á¡A±±¨îÅv¥ß§YÂà¦^¨ì init ªº¤â¤¤¡A±µ¤U¨Ó°¨¤W¶i¤J¹w³] runlevel ¡C­Y¤º©wªº runlevel ¬° 3 ªº¸Ü¡A init ´N°õ¦æ /sbin/mingetty ±Ò°Ê virtual console ¨Ã¥B¥H : ¡¨ login ¡G¡¨´£¥ÜÅý¨Ï¥ÎªÌµn¤J¡A§¹¦¨¶}¾÷¡Cµn¤J«á¨t²Î·|´£¨Ñ¤@­Ó shell µ¹¨Ï¥ÎªÌ¡A´N¥i¥H¨Ï¥Î Linux ¡C­Y runlevel ¬° 5 ªº¸Ü¡A«h¦b¶}±Ò virtual console ¤§«á¡Ainit ·|¦A°õ¦æ xdm ±Ò°Ê X window system ¡AÅý¨Ï¥ÎªÌ¥H xdm ¬É­±µn¤J¡C

Linux ¶}¾÷ªº¹Lµ{¥i¥H»¡¬O

BIOS ---->Loader ( LILO, SYSLINUX )----> Kernel ---->Init ---->Shell

¡@

---------------------------------------------------------------------------------------------------------------------------------------------------¡@

»s§@²©ö Linux Floppy ¶}¾÷¤ù

§Ú­Ì¥ý§Q¥ÎLinux «ü¥O¥ý»s§@°ò¥»ªº¶}¾÷¤ù 

¥ý®æ¦¡¤ÆºÏ¤ù

#/sbin/mkdosfs /dev/hd0          

 mkbootdisk [--version] [--noprompt] [--mkinitrdargs <args>][--device <devicefile>] [--verbose -v] [--iso]

                    [--kernelargs <args>] <kernel> (ex: mkbootdisk --device /dev/fd1 2.0.31)

¶}¾÷¤ù»s§@µ{§Ç

#cd /lib/modules 

#ls    ¬d¬Ý"kernel ªO¥»"   ¥Hred hat 8.0¬°¨Ò ªO¥»¬°  (2.4.18-14)

#    /sbin/mkbootdisk --device /dev/fd0  "kernel ªO¥»"  (ex:  /sbin/mkbootdisk --device /dev/fd0  2.4.18-14)

Æ[¬Ý¶}¾÷¤ù¤º®e

#mount /dev/fd0 /mnt/floppy/

#cd /mnt/floppy

#ls -al

-rwxr-xr-x 1 root root 203 4¤ë 24     22:33         boot.msg                  <----¶}¾÷´£¥Ü
-rwxr-xr-x 1 root root 143847 4¤ë    24 22:33     initrd.img                <----init
-r-xr-xr-x 1 root root 7112 4¤ë 24    22:32          ldlinux.sys
-rwxr-xr-x 1 root root 122 4¤ë 24    22:33          syslinux.cfg              <----Loder configure
-rwxr-xr-x 1 root root 1125194 9¤ë 5 2002        vmlinuz                    <----kernel

¦p¦ó¬Ý initrd.img ªº¤º®e

¶}¾÷¤ù¤¤³Ì­«­nªº´N¬O initrd.img ©M vmlinuz ¡Avmlinuz ´N¬O linux ªº®Ö¤ß¡A¬OÄÝ©ó make kernel ªº½ÒÃD¡C

¦Ü©ó initrd.img ¬O linux OS ªº¥ý´Á¨t²Î¡A­t³d§G¸m¨t²ÎÀô¹Ò¡A±¾¸üÀÉ®×¸ê®Æ¨Ï¥Îªº¡C¥L¦b kernel ¸ü¤J«á¡A·|³Q¸ÑÀ£ÁY¨ì°O¾ÐÅé°Ï¶ô¤¤¡A°õ¦æ³]©w¨t²ÎÀô¹Òªº¥\¯à¡C

initrd.img ¦pªG§A¥Î mount ¤èªk¥h±¾¸ü¥L¡A¬Û«H¤£ºÞ¥Î¨ººØ fs type ³£¤£¯à¥¿½T¡A¦]¬°¥L¬O¤@­ÓÀ£ÁYÀÉ¡A§A¥²¶·¥ý§â¥L¸ÑÀ£ÁY¡A¤~¯à mount¡C

¦]¦¹§A¥i¥H¥ý¸ÑÀ£¨ì hd:

cat /mnt/floppy/initrd.img | gunzip > /tmp/myinitrdfs

«Ø¥ß±¾¸üÂI¡G

mkdir /mnt/initrdfs

±¾¸ü initrdfs:

mount -t auto -o loop /tmp/myinitrdfs /mnt/initrdfs

³o¼Ë cd ¨ì /mnt/initrdfs ´N¥i¥H¬Ý¨ì initrd.img ªº¤º®e¤F¡C

ªþµù¡G©Ò¿×ªº mount -t auto ¬O«ü¥Î kernel ©Ò¦³»{±oªº fs type ¥h±¾¸ü¡A¦]¬°¨C­Ó distribution ³]­pªÌªº initrd.img ·|¦³¥L­Ì¦Û¤v¨Ï¥Î fs type ªº¦Ò¶q¡A msdos,ext2,minix ³o¨Ç fs type ³£¦³¨Ó°µ initrd.img ªº¡C§Ú­Ì¥i¥Hµo²{Red hat8.0¶}¾÷¤ù¬O§Q¥ÎSYSLINUX °µ¬° Loader, ¦³¤@­Ó¦W¬°syslinux.cfg¤Îldlinux.sysªºÀÉ®×

Ãö©ósyslinux

¨Ï¥Îsyslinux ¤ñ°_¨ä¥¦ªºLoader ¦p(LILO,grub)¨BÆJ²³æ¡A¦Ó¥B¥\¯à§¹¾ã¡C

¤U­±¬°syslinux.cfgªº¤º®e

default linux
prompt 1
display boot.msg
timeout 100
label linux
kernel vmlinuz
append initrd=initrd.img root=/dev/hda6

±ý§ó²`¤J¤F¸Ñ¥i°Ñ¦ÒSyslinux ºô¯¸  http://syslinux.zytor.com/

¡@

-------------------------------------------------------------------------------------------------------------------------------------------------------¡@

CF CARD»s³y²©öEmbedded Linux

CF¥d¥²¶·¸g¥ÑCF¥d->IDE ¼Ò²Õ¤~¯à¶}¾÷¨£¤U¹Ï

 ¥i§âCF¥d·í¦¨¬O¤@¯ëµwºÐ¨Ó¬Ý¡A¤ñFloppy §ó¨ã¦³¼u©Ê¡C

»s§@CFªºMBR (Master Boot Record ¡^

­º¥ý¤UÀ¹ syslinux ­n2.0¥H¤WªºªO¥» ¦p 2.0.4 ¨Ã¥B¸ÑÀ£ÁY

§A·|µo²{¸ÌÀY¦³¤@­Ó mbr.bin ªºÀÉ®×  ±µ¤U¨Ó¥²¶·§PÂ_§AªºCF¥d±µ¦bide1(hda[master]/hdb[slave]) ÁÙ¬Oide2(hdc[master]/hdd[slave])

µ§ªÌ¬O±µ¦bide2ªºmaster©Ò¥H¬Ohdc¡A¦A¨Ó°õ¦æ

#dd if = mbr.bin of = /dev/hdc 

³o¼Ë´N¥i¥H¼g¤Jmbr¨ì§AªºCF CARD¸Ì¤F

Make Kernel

«ØÄ³¶i¤JLinux µøµ¡¤U¤ñ¸û¦n°µ

²Ä¤@¦¸»s§@:

#make xconfig
#make dep
#make zImage ©Î make bzImage ¡]­Y®Ö¤ß¤j©ó 640K ªº¸Ü¡^<--À£ÁY

¦A¦¸»s§@:

#make mrproper

#make xconfig

#make clean
#make dep
#make zImage ©Î make bzImage ¡]­Y®Ö¤ß¤j©ó 640K ªº¸Ü¡^<--À£ÁY

KernelªºImageÀÉ·|¦b /usr/src/linux-2.4.18-14(®Ú¾Ú§Aªº¹q¸£¦Ó©w)/arch/i386/boot ¸Ì­±

»s§@ Ram Disk

  1. dd if=/dev/zero of=/boot.img bs=1k count=2048
  2. /sbin/losetup /dev/loop0 /boot.img
  3. /sbin/mke2fs /dev/loop0                     <--±Nimage ®æ¦¡¤Æ   

³o·|²£¥Í¤@­Ó2MBªºRam Disk, Àɮרt²Î®æ¦¡ext2, «Ü°÷§Ú­Ì¥Î¨Ó°µ¶}¾÷®ÉªºÀɮרt²Î¥Î¤F.

losetup ¬O¥Î¨Óôµ²§A©Ò°µªºimage:

boot.img <----------> loop0 

±¾¤WRam Disk

  1. cd /
  2. mkdir boot
  3. mount /dev/loop0 /boot

»s§@°ò¥»Àɮרt²Î

  1. cd boot
  2. mkdir bin dev etc proc sbin usr tmp mnt
  3. cd dev
  4. cp -f /dev/¸ÌÀYªº console, ram, null, systty, tty1, tty2µ¥ÀɮצÜ/boot/dev/©³¤U

¦w¸ËShell Program

cp /bin/ash.static /boot/bin/sh

init±Ò°Êµ{¦¡ªº³]­p

#vi init.c

#include <stdio.h>
void main(int argc,char **argv)
{
printf("Loading Linux Shell \n");
argv++;
execvp("/bin/sh",argv);
}

½sĶ

½sĶ®É, §Ú­Ì"¥²¶·"±N¥¦½sͦ¨ÀRºAªº, ¦]¬°¶}¾÷¤ù¤¤¨Ã¨S¦³¸Ë¤J¥i¸ü¤Jªº¨ç¼Æ®w.

  1. gcc --static -o init init.c
  2. strip init

strip·|±N¨S¦³¥Î¨ìªº³¡¥÷¥h°£, ´î¤ÖÀɮפj¤p.

¦w¸Ëinitµ{¦¡

²{¦b, §Ú­Ì±Ninit¦w¸Ë¨ìRam Disk¤¤.

  1. cp -f init /boot/bin/init
  2. cd boot
  3. ln -s bin/init linuxrc

¦w¸ËRam Disk¨ì¶}¾÷¤ù¤¤

  1. gzip -9 < boot.img > star.ini
  2. mount /dev/hdc1 /mnt/flash
  3. cp star.ini /mnt/flash

¸Ñ°£losetup³]©w

  1. umount /dev/loop0
  2. /sbin/losetup -d /dev/loop0 

±N½sͦnªºkernel Image©ñ¤J¶}¾÷¤ù¤¤¨Ã©R¦W¬°linux

§ó§ï syslinux.cfg ¦p¤U

TIMEOUT 20
DEFAULT linux 

LABEL linux
KERNEL linux
append root=/dev/ram initrd=star.ini

µ²½×

¨Ì·Ó¤W­±歩ÆJ§¹¦¨«á´N¥i¥H¶}¾÷­«³]BIOS¬Ý¬Ý¯à§_¥¿±`¤u§@¡A¶}§¹¾÷«á¥u¦³³Ì°ò¥»ªºshell¡A

¤§«e´¿¹Á¸Õ§Q¥Îbusybox¨Ó¤H°µ¥i¬OÁÙ¦³¨Ç°ÝÃD¶·­n¥h¸Ñ¨M¡C³Ì«á§O§Ñ¤F³Æ¥÷§A°µ¦nªº¶}¾÷¤ù

dd if=/dev/hdc1 of=/save.img

 

¨ä¥¦¬ÛÃö¸ê°T

¨        Pocket_Linux :  (user_guide)

¨        Busybox : (link)

¨        HOWTO¡GThe Linux Bootdisk (link)

¨        Linux Router Project (LRP) : (link)

¨        uClinux : (link)

¨        Floppy based Linux : (link)

¨        DooChun LINUX : (link) §Þ¥©¤ß±o

¡@

                                      ³Ì«á§ó·s  2003 / 5 / 15