¡@³oùؤ¶²Ð¤@­Ó¥i¥H¤£¥Îªá¶O«Ü¦h¿ú¥hÁʶR±MªùªºµwÅé¦ý¬O¤S¥i¥H¾Ç²ß´O¤J¦¡Linux¨t²Îªº¤èªk¡C³o´N¬O§Q¥Î¥@®a(Sega Dreamcast)¹CÀ¸¾÷¨Ó¾Ç²ß»s§@´O¤J¦¡Linux¡C(Embedded Linux) ³o½g¤å³¹±N·|¸Ô²ÓªºÁ¿¸Ñ¦p¦ó¦bSega Dreamcast¤W­±¦w¸ËLinux.¥]¬ALinux Kernel, Boot loader©MUtility kernel patches. ¦P®É¤]´£¨Ñ¥H¤W¤u¨ãªº¤UºI³s±µ¦a§}¡C

¡@

¡@

²¤¶¡G

¦b¾Ç²ßEmbedded Linuxªº®É­Ô¡A³Ì­«­nªº´N¬O»ù¿ú©M¨t²Îªº¬Û®e©Ê¤F¡C¤H¤H³£ª¾¹D¡ALinux¦b®à­±¹q¸£©M¦øªA¾¹¤W­±³£¥i¥H«D±`¦nªº¹B§@¡C¦ý¬O¡A³o¨Ç³£¤£¯àºÙ§@´O¤J¦¡¨t²Î¡C§Aª¾¹D¶Ü¡A¨ä¹ê§Q¥Î§AªºSega Dreamcast¹CÀ¸¾÷¡A§A´N¥i¥H¦Û¤v¾Ç²ß»s§@¤@¦¸´O¤J¦¡ªºLinux¤F¡C

­n¾Ç²ß´O¤J¦¡Linux¡A­º¥ý¡A·íµM§A­n¦³¨¬°÷ªº¤å¥ó¡C¦P®É¡A§A­n¥²¶·­n¦³¤@­Ó¤£¬O°ò©óX86ªºµwÅ饭»O¡A¥]¬A¤@Áû¤£¬OX86ªº·L³B²z¾¹¡C°£¤F¹q¸£¥H¥~¡A¤ñ¸û²z·Qªº´N¬O¡GPDA, Internet appliances ©M¹CÀ¸¾÷°Õ¡C

¨S¿ù¡A´N¬O¹CÀ¸¾÷¡C¨ººØ爲¤FÅý¤j®aÁʶR¹CÀ¸¦Ó´X¥G¤£ÁÈ¿ú¡A©ÎªÌÁ«¿ú¦b½æªºªF¦è¡C²{¦b»ù¦ì³Ì¦X¾Aªº´NÀ³¸Óºâ¬OSega Dreamcast¤F¡C¦]爲Sega ¤w¸g¥X¤F·sªº産«~¤F¡A¥Ø«eSega Dreamcast¤w¸g³Q¼t®a¤w¸g°±¤î¥Í産¡C©Ò¥HSega Dreamcastªº»ù¦ì²{¦b«D±`ªº¦n¡C¤U­±§Ú­Ì´N¬Ý¬Ý¦p¦ó¦bSega Dreamcast¤W­±¶]Linux.

Linux ¬O¦p¦ó¹B§@¦b Sega Dreamcast ¤Wªº¡G

¦b°Q½×Linux ¬O¦p¦ó¹B§@¦b Sega Dreamcast¤W¤§«e¡A§Ú­Ì­º¥ý­nª¾¹D¬O¦p¦ó§âLinux¸Ë¨ìSega DreamcastùØ­±¥hªº¡C¨ä¹ê¯µ±K´N¦b©ó©ñ¤JSega DreamcastùØ­±ªº¨º­ÓCDªº®æ¦¡°Õ¡C¤]´N¬O»¡¡A¨Ã¤£»Ý­n¤°¤\¯S®íªº¤u¨ã¡C

 Sega Dreamcast:

        Sega Dreamcast¤ä´© Hitachi SH7750 CPU¡A¹B¦æ³t«×¬O200MHz. ¦³ 16MBªºRAM.§A¥i¥H¿ï¾Ü¨Ï¥Î¹qµø¾÷¡]PAL¨î¦¡©ÎªÌNTSC¨î¦¡¡^©ÎªÌ§Q¥Î¤A¤Óºô°t¸m¾¹¡]Ethernet Adapter¡^

ª½±µ³s±µ¨ìVGAªº¹q¸£¿Ã¹õ¤W­±¡CSagaÃö³oºØ¥d¥s°µ¡§Broadband Adapter¡¨©ÎªÌ¡§BBA¡¨¡A¤]¯à¶R¨ì±Mªùµ¹Saga Dreamcast¨Ï¥ÎªºÁä½L©M·Æ¹«¡C 

¦bDreamcast¤W¦w¸ËLinux:

        ¦bSaga Dreamcast¹CÀ¸¾÷啓°Êªº®É­Ô¡ASaga Dreamcast¤º«Øªº¤@­Ó啓°Êµ{¦¡·|¹Á¸ÕŪ¨ú CD-R¡]­n½T©w¡A¤£¯à¥ÎCD-RW¡^¡A¹Á¸Õ§ä¨ì³Ì¤Ö¨â­ÓCD-Rªºrecording sessions.²Ä¤@­Ósession¬O­µ­y¡Aboot loader¨Ã¤£·|¥hºÞ¥¦¡C¦ý²Ä¤G­Ósession¥²¶·¬OCD/XA¸ê®Æ­y¡C¡]mode 2, form 1¡^³o­Ó¸ê®Æ­y¥²¶·¬O¼Ð·ÇªºISO9660ªº¤å¥ó¨t²Î¡A¦P®É³o­Ó¤å¥ó¨t²Îªº«e16­ÓºÏ°Ï¥²¶·¥]§t¤@­Ó§t¦³啓°Ê¸ê°Tªº¤å¥óIP.BIN¡CIP.BIN¥]§t啓°Ê«á¡A啓°Êµ{¦¡»Ý­n¶}啓ªºÀɮצW¡CIP.BIN¦P®É¥]§t¤¸¸ê®Æ¥Î¥HÃѧOµwÅé¡A¥H½T©wCD¤Wªº­þ­Óµ{¦¡±N³Q°õ¦æ¡C¡]¨Ò¦p¦Û°Ê¿ï¾Ü¹CÀ¸¬O¦bSega Dreamcast¤W°õ¦æ¡AÁÙ¬O¦bSaga¨ä¥LÃþ«¬ªº¹CÀ¸¾÷¤W°õ¦æ¡^¦a°Ï¼Ð»x¡A·|±±¨î¹CÀ¸¥H¨ººØ®æ¦¡Åã¥Ü¡]PAL©ÎªÌNTSC¡^¡A¦P®É¤]Åã¥Ü¹CÀ¸©Ò»Ý­nªº±±¨î¾¹¡]¹CÀ¸¤â¬`°Õ¤°¤\ªº¡^©MCRC.

 ¤@¦ýSaga Dreamcast¤º«Øªº啓°Êµ{¦¡Åª¨ì¦³®ÄªºIP.BIN¤å¥ó¡C¨t²Î´N·|¦Û°Ê§â©R¦Wªº¤å¥ó±qISO9600ªº¤å¥ó¨t²ÎŪ¨ì°O¾ÐÅ餤¡A¨Ã¥æ¥X¥þ³¡ªº±±¨î³\¥iÅv¡C³oùØ¡A§Ú­Ì°µªº´N¬O¡A·íSaga Dreamcast¨t²Î¶}¾÷¥H«á¡A啓°Êµ{¦¡·|§âLinux¶i¥h¡CÁÙ¥i¥H§Q¥ÎSaga Dreamcastªº¦ê¦C¤¶­±¡]serial port¡^©ÎªÌ¤A¤Óºô¤¶­±¡]enthernet port¡^¨Ó¤UºI¤@¨ÇªF¦è¡C¤@­ÓRTOS¡A¦n¤ñeCos´N¤£¿ù¡C

 Saga Dreamcastªº¨t²ÎµwÅé¦P®É´£¨Ñ¤@­ÓÃþ¦ü©óBIOS¥\¯àªºªF¦è¥Î©ó¨t²Î¥i¥H±qGD-ROM driveŪ¨ú¸ê®Æ¡A¡]GD-ROM drive¬O¤@ºØ±qCD-ROM§ï¸Ë¥X¨ÓªºªF¦è¡A¥¦¸òCD-ROM³Ì¤jªº°Ï§O´N¬OGD-ROM¥i¥H®e¯Ç1GBªº¸ê®Æ¡^³X°Ý¤º«Øªºflash memoryµ¥µ¥¡C¥i±¤ªº¬O¥Ø«e³o¨ÇªF¦èÁÙ¨S¦³¤ä´©¡C¤]³\·í§AŪ¨ì³o¤ù¸ê®Æªº®É­Ô´N¤w¸g¦³¤F³o¤è­±ªº¤ä´©¤F¡C

  

±µ¤U¨Ó°µ¤°¤\¡H

        §Ú­Ì­nª¾¹D¤F¦p¦ó»s§@¤@­Ó¥i¦bSaga Dreamcast¤W¹B¦æªº¨t²Îimage, §Ú­Ì´N¥²¶·¹ïLinux¦³¤@©wªºÁA¸Ñ:

 LinuxªºKernel¥»¨­¬O¤£¯à啓°Êªº¡C¦o»Ý­n¤@­Ó啓°Êµ{¦¡¡A¤ñ¦plilo¨ÓÀ°§U¦o¡CLilo·|§â¶}©l¨t²Îªº¤@¨Ç¸ê°T¡A¨Ò¦p¨t²Î±¡ªp¡A¨t²Î¥­»Oµ¥µ¥¶Ç°eµ¹Kernel. Lilo¦P®É¤]¤ä´©¸ÑÀ£ÁY¡A³o¼Ë¥i¥H§âÀ£ÁYªºKernel imageª½±µ®³µ¹¥Î¡C¦b´O¤J¦¡¨t²Î¤¤¡A§Ú­Ì¤]¦P¼Ë»Ý­n¤@­ÓÃþ¦ü©óliloªºboot loader.

 Â²³æªº¨Ó»¡¡ALinuxªº啓°Ê¤À爲¥H¤U´X­Ó¨BÆJ¡G

  1. Boot loader ³Ì¥ý±o¨ì¨t²Îªº±±¨îÅv¡C³o­Ó±±¨îÅv¬O±qBIOS©Î啓°ÊµwÅ餤±o¨ìªº¡C
  2. Boot loader §âkernelªºimage¥á¨ìmemoryùØ­±¥h¨Ã¥B¸Ñ¶}À£ÁY¡C
  3. Boot loader ¶i¤J¤w¸g¸ÑÀ£ÁYªºmemory image¤¤¡C³o­Ómemory imageùØ­±´N¬OLinuxªº Operation System Kernel°Õ¡C
  4. Kernel ¹ï¦Û¤v¶i¦æªì©l¤Æ¡AµM«ámount root ¥Ø¿ý¡C¸ü¤Jdevice drive¡Aªì©l¤ÆµwÅé¡A³Ì«á¶}©l¹B¦æÀ³¥Îµ{¦¡¡C

²{¦b§Ú­Ìª¾¹D¤F³o¨Ç¡AÀ³¸Ó²M·¡CD¤WªºimageùØ­±ªº¤º®e¤F§a¡C§Ú­Ì»Ý­n¤@­Óboot loader,©M¤@­ÓLinux ªº Kernel, §Ú­Ì»Ý­nÅý§Ú­Ìªºboot loader¦bSaga Dreamcast啓°Ê«á¡A¯à±o¨ì±±¨îÅv¡A¥B§ä¨ìLinuxªºKernel¡A¦P®ÉÂà´«±±¨îÅv¡C

 

Linux ©MÀ³¥Îµ{¦¡¡G

        ±µ¤U¨Ó¡A§Ú­ÌÁÙ¦³«Ü¦hªº¨Æ±¡­n°µ¡C¤@¥¹kernel¥i¥H¦¨¥\ªº¹B¦æ¤F¡A§Ú­ÌÁٻݭnÀ³¥Îµ{¦¡¡C®à­±¨t²Î¸ò´O¤J¨t²Î¦³­Ó«Ü¤jªº°Ï§O¡C®à­±¨t²Î³q±`¨t²Î¥u­t³d¸òÀ³¥Îµ{¦¡¤§¶¡ªº¥æ´«¡C¦ý¬O´O¤J¨t²Î´N¤£¦P¤F¡A¦b´O¤J¦¡¨t²Î¤¤¡A³q±`¨t²Î©MÀ³¥Îµ{¦¡¬O¦P¤@­Ó¡C¤]´N¬O»¡¡A¥L­Ì¬O¸j¦b¤@°_ªº¡C¦]爲¥L­Ì¸jªº¹ê¦b¬O¤Óºò¤F¡A«ÜÃø¤À¿ë¥X¨Ó¡A©Ò¥H«j±jªº°Ï¤À¿ë¨º­Ó¬O§@·~¨t²Î¨º­Ó¬OÀ³¥Îµ{¦¡´N¦³ÂI¤£²Å¦X¹ê»Ú¤F¡C

 Linux¬O¤@­Ó³q¥Î©Êªº«Ü¦nªº®à­±§@·~¨t²Î¡A¤]´N¬O»¡¡A§Ú­Ì»Ý­n¦³À³¥Îµ{¦¡¤~¥i¥H¡C¦b³o½g¤å³¹ªºµ²§À¡C·|¤¶²Ð¤@­ÓÃþ¦üªºÀ³¥Îµ{¦¡¡Gshell

 

Linux©M¤å¥ó¨t²Î¡G

        ¦pªG§AÆ[¹î¤@¤ULinuxªºstartup code,§A´N·|µo²{¡A³Ì«á¤@¨B´N¬Okernel´M§ä¤@­Ó¥i°õ¦æªº¥s°µ¡§init¡¨ªºÀɮסA¨Ã¥B§â¥¦ºI¤J¨ì°O¾ÐÅéùØ¡C³oùب䣥u¬O»¡§Ú­Ì»Ý­n¤@­Ó¥s°µ¡§init¡¨ªº¤å¥ó¡C³oùئP®É«ü¥X¡A§Ú­Ì»Ý­n¤@­Ó¤å¥ó¨t²Î¥h¨ú¥X³o­ÓÀɮסC

 ¤]³\§A·|·Q¡ASaga Dreamcast¨Ã¨S¦³µwºÐ¡A¨º¤\¦p¦ó¦s©ñ¨t²Î¤å¥ó©O¡H¨ä¹ê¡A«Ü¦hªº¹q¸£¤u§@¯¸¤]¬O¨S¦³µwºÐ----³Ì¤Ö¡A¦b¨t²ÎÁÙ¨S¦³ªì©l¤ÆIDE©ÎªÌSCSI±±¨î¥d¤§«e¡C©Ò¥H¡A¨ä¹êLinux¦b¶}¾÷ªº®É­Ô¬O·|¦Û°ÊÃþ¤ñ¥X¤@­ÓµwºÐ¨Óªº¡C 

·í¨SLinux¶}¾÷ªº®É­Ô¡ALinux·|¦Û°Ê¥Îramdiskªº¥\¯à¡A§â¤@³¡¤À°O¾ÐÅéÃþ¤ñ¦¨¤@­ÓµwºÐ¡C¤u§@¯¸ªºboot loader¦b¶}¾÷®É±q³nºÐ¤¤¿W¨úimage¡AµM«á«áºI¤Jramdisk¡A¦A§âramdiskªº¦a§}¶Ç°eµ¹kernel. Kernel±qramdiskŪ¨úºÏ¤ù±±¨î¥dªºªº¸ê®Æ¡AµM«á¶i¦æªì©l¤Æ¡A¸ü¤J¡C³o®É­Ô¯u¥¿ªºª«²zµwºÐ¤~¤u§@¡C¤@¥¹ª«²zµwºÐ¤u§@¤F¡Aramdisk´N·|³QÄÀ©ñ¡C

 Ramdisk´£¨Ñ©Ò¦³Linux»Ý­nªººÏ¤ù¾É¦V³]³Æ¡C©Ò¥H»¡¡A¤@­Ó¨t²Î¥u­n¦³¨¬°÷ªº¦s©ñµ{¦¡©Mdevice driveªº°O¾ÐÅé¡C¨º¤\³o­Ó¨t²Î¥i¥H§¹¥þ¤£»Ý­nµwºÐ¡CSaga Dreamcast´N¬O¦b¥Îramdisk¥N´À¶Ç²ÎµwºÐªº¡C

 

Saga¥´³yLinux¡A§A³£»Ý­n¨Ç¤°¤\¡G

 ­º¥ý¡A§A¥²¶·¾Ö¦³¤@¥x¹q¸£¡A³o¥x¹q¸£¥²¶·¬OLinux©ÎªÌUnix-likeªº§@·~¨t²Î¡C§A¥²¶·¦³rootªº³\¥iÅv¡C

 ¨ä¦¸¡A§A»Ý­n¤@¥xCD-RªºÅª¼g¾¹¡]Writer¡^¡AŪ¼g¾¹©M¿N¿ýµ{¦¡¥²¶·­n¤ä´© multisession CD using CD/XA data track (mode 2, form 1)®æ¦¡¡C¨ä¹ê¤j¦h¼ÆªºCD-R writer©Mµ{¦¡³£¤ä´©­Ó¡C­nª`·Nªº¬O¡GSaga DreamcastªºGD-ROMÅX°Ê¾¹¤£¯àŪ¨úCD-RW¡A¤£¹L¥ÎCD-RW¿N¿ýªºCD-R¬O¨S¦³°ÝÃDªº¡C¤]´N¬O»¡¡A¥u¯à¥ÎCD-Rªº¤ù¤l¡A¤£¯à¥ÎCD-RW.

 ³Ì«á¡A´N¬O»Ý­n¤@¨Ç¤u¨ã°Õ¡A³o¨Ç¤u¨ã°ò¥»¤W§A¦bºô¤W³£¯à§ä±o¨ìªº¡G

¤U­±§Ú¤]§âlink³£µ¹¤F¥X¨Ó 

¡@

¥´³y§Ú­Ì»Ý­nªº¤u¨ã¡G

        ·Q¦bSaga Dreamcast¤W¹B¦æLinux.²Ä¤@¨B´N¬O§Ú­Ì»Ý­n¥´³y¤@¨Ç¤u¨ã¥]¬A¡Gcross assembler, linker, compiler, C runtime library¡C¤U­±¡A§Ú­Ì´N¥Î³o¨Ç¤u¨ã¥´³y¥X¤@­ÓSaga Dreamcast¥Îªº§@·~¨t²Î¡A¨Ã¥B¦b¨t²Î¶}¾÷¥H«á¡A¹B¦æ¤@­Ó²³æªºshell¡C³Ì«á¡A§Ú­Ì§â©Ò¦³ªºªF¦è¤è¨ì¤@­Óramdisk imageùØ¡C¨Ã¿N¿ýCD.

 

Build cress assembler, linker, and bootstrap compiler

        §Ú­Ì­º¥ý»Ý­n¥´³y¤@­Ócross assembler©Mlinker¡AµM«á¬Obootstrap compiler.¥Î¤@­Ó°g§Aªºcompiler¥i¥H¥´³yruntime libraries©Msystem kernels¡C¦ý¬O¤£¯à¥´³yÀ³¥Îµ{¦¡¡C

 ­º¥ý¡A½T©w/usr/local/bin/¦³¦bPATHùس]©w¾¾

login as root user,µM«á«ö·Ó¤U­±ªºscript: 

# export TARGET=sh4-linux                                               //³oùجO³]©wÀô¹ÒÅܼÆ

# export PREFIX=/usr/local                                                //³o¼Ë¦n³B´N¬O¤£¥Î¥H«á¦Ñ¥´¨º¤\¦h¦r

# export PATH=${PATH}:${PREFIX}/bin                        //µ²§ô

 # tar xzf binutils-2.11.2.tar.gz     

# patch -p0 < binutils-2.11.2-sh-linux.diff

# mkdir -p build-binutils && cd build-binutils

# ../binutils-2.11.2/configure --target=$TARGET \

   --prefix=$PREFIX

# make all install

# cd ..

 

# tar xzf gcc-3.0.1.tar.gz

# patch -p0 < gcc-3.0.1-sh-linux.diff

# mkdir -p build-gcc && cd build-gcc

# ../gcc-3.0.1/configure \

   --target=$TARGET --prefix=$PREFIX \

   --without-headers --with-newlib \

   --disable-shared --enable-languages=c

# make all-gcc install-gcc

# cd ..

 

³Ì«áªº¥i°õ¦æÀɮצb/usr/local/bin¤U­±¡A¦W¦r¬O sh4-linux-as, sh4-linux-ld.

¥Î¦P¼Ëªº¤èªk´N¥i¥Hbuild bootstrap compiler¤F¡CBootstrap compiler¤]¬O¦b/usr/local/bin¤U­±

°õ¦æÀɮתº¦W¦r¥s°µsh4-linux-gcc.

  

Configure the Kernel source:

³oùØ¥D­n¬O­nconfigure kernelªºheader file. «D±`ªºÂ²³æ¡A¤£¹L½Ðª`·N¡A³oùؤ£­n¹ï¿ï¶µ°µ¥ô¦óªº­×§ï¡C¦bmenuconfigªº®É­Ô¡Aª½±µ¿ï¾ÜExit.¡]«ö¤@¤UÁä½Lªº½bÀY¥kÁä¡AµM«á«öenter´N¦n¤F¡^

#tar vxf kernel-sh-linux-dreamcast.tar.gz

#path ¡Vp0 < kernel-sh-linux-dreamcast.diff

#cd kernel

# make ARCH=sh CROSS_COMPILE=sh4-linux- menuconfig

#cd ..

 

Building a runtime library

 ²{¦b§Ú­Ì¦³¤Fbootstrap compiler©M¤@­Ó³]¸m¾A·íªºkernel¤F¡C§Ú­Ì²{¦b¥i¥H¶}©lbuild runtime library©Mheader files¤F¡C§Ú­Ì¨Ï¥Îªºrun-time library¬OGNUªºglibc.³o­ÓlibraryùØ­±¦³¤j®a³£¼ô±xªºprintf()¤§ÃþªºªF¦è¡C¦P®ÉÁÙ¥]§t°ÊºA³s±µ¡]dynamic linker¡^©M¨ä¥Lªº¤@¨ÇªF¦è¡C

 ­º¥ý¸ÑÀ£ÁY¡AµM«ápatch¡A±µ¤U¨Ó§â Linux kernelªºheader files «þ¨©¹L¥h¡C¹ê»Ú¤W¡A§Ú­Ì»Ý­n½Õ¥Îmake¨â¦¸¨Óbuild glibc. ²Ä¤@¦¸ªº®É­Ô¡A«Ø¥ßlibrary,¦ý¬O¨Ã¨S¦³¦w¸Ë¡A²Ä¤G¦¸¤~¬O¦w¸Ëlibrary. Touchªº©R¥O¹ê»Ú¤W¬O爲¤FÄF¹LglibcÅý¥¦¥H爲©Ò¦³ªºªF¦è³£¤w¸g¦³¤F¡]¹ê»Ú¤W¦³¨ÇªF¦è¬O§Ú­Ì¤£»Ý­nªº¡^³Ì«áecho«ü¥O°µ¤F¤@­Ólink libc.so

 ¦pªG§A¦bbuilt§¹ binutils, bootstrap, gcc¥H«á­«·s啓°Ê¹L§Aªº¹q¸£¡]©ÎªÌ­«·slogin¹L¡^¨º¤\§A¥²¶·­«·s³]©wPATH¡ATARGET,PREFIX³o¤T­ÓÅܼƤ~¥i¥Hbuild gligc.

 Glibc¦bbuildªº®É­Ô¥i¯àªáªº®É¶¡·|¤ñ¸û¦h¡C·íµM¡A¥D­n¤]¬O¬Ý§Aªº¨t²Î¦Ó©w¡C¤£¹L¨ì¬O¥i¥H§Q¥Î²{¦b³o­Ó®É¶¡¥ð®§¤@¤U¡A¦YÂIªF¦è¡AªwªM¯ù¡C

 # tar xzf glibc-2.2.4.tar.gz

# patch -p0 < glibc-2.2.4-sh-linux.diff

# mkdir -p build-glibc && cd build-glibc

# mkdir -p ${PREFIX}/${TARGET}/include

# cp -r ../kernel/include/linux \

   ${PREFIX}/${TARGET}/include

# cp -r ../kernel/include/asm-sh \

   ${PREFIX}/${TARGET}/include/asm

# CC=sh4-linux-gcc ../glibc-2.2.4/configure \

   --host=$TARGET --prefix=$PREFIX \

   --disable-debug --disable-profile \

   --disable-sanity-checks \

   --with-headers=${PREFIX}/${TARGET}/include

# make

# touch iconv/iconv_prog login/pt_chown

# make install_root=${PREFIX}/${TARGET} \

   prefix="" install

# echo "GROUP ( libc.so.6 libc_nonshared.a )" \

    > ${PREFIX}/${TARGET}/lib/libc.so

# cd ..

  

Rebuild the cross compiler¡G

        ¦b¦³¤F¥¿½T§¹µ½ªºheader files©Mruntime library¤§«á¡C§Ú­Ì²{¦b¥i¥Hbuild¤@­Ó§¹¾ãªºc/c++ cross compiler.

 # mkdir -p build-gcc2 && cd build-gcc2

# ../gcc-3.0.1/configure --target=$TARGET \

--prefix=$PREFIX --enable-languages=c,c++

# make all install

# cd ..

  

Building a Dreamcast Linux kernel

 ²{¦b§Ú­Ì¦³¤F§¹¾ãªº¸ó¥­»Oªºtoolchain¤F¡C²{¦b¨ì¤F¸Ó¥Î¨ì³o¨ÇªF¦èªº®É­Ô¤F¡C«e­±§Ú­Ì¤w¸g§â§Ú­ÌªºlinuxªºkernelSaga Dreamcast³]¸m¦n¤F¡C²{¦b¥u­ncompile©Mlink kernel´N¦n¤F¡C³Ì«ácompile¥X¨Óªº¤å¥ó¥s°µzImage¡A¦bkernel/arch/sh/boot/¤U­±¡C³o­Ó¤å¥ó¬O¥H­Ó³QÀ£ÁY¤Fªºkernel image.

 ¥H«á¡A·í§A¥Î³o­Ókernel¥¿±`¶}¾÷¥H«á¡A§A´N¥i¥HÀH·N¥Îmenuconfig¨Ó½Õ¾ãkernelùØ­±ªº¦UºØ³]¸m¤F¡CµM«á¦Arecompile¤@¤Ukernel´N¦n¤F¡C

 # cd kernel

# make ARCH=sh CROSS_COMPILE=sh4-linux- \

   clean dep zImage

# cd ..

  

Building a Saga Dreamcast Bootloader

·í§A¦³¤F¤@­Ó¥¿½Tªºcompiled kernel image.¨º¤\¤U¤@¨B§Ú­Ì´N¸Ó°µ¤@­Óbootloader¥Î¨Ó¦bSaga Dreamcast ¶}¾÷ªº®É­Ô¡A§âkernel¸ü¤J¨ìSaga Dreamcastªº°O¾ÐÅéùØ­±¥h¡C

 ¦ý¬O¡A²{¦bÁÙ¤£¦æ¡CÁÙ°O±o¶Ü¡ASaga DreamcastªºµwÅé¸ü¤J¤@­Ó³æ¤@ªº¥i°õ¦æªºimage¨ì¥¦ªºRAMùØ­±¡C³o¼Ë¡A°£«DÀ³¥Îµ{¦¡ª¾¹D¦p¦ó»PSaga DreamcastªºGD-ROM¥h·¾³q¡A¤£µM´N¨S¦³¿ìªk±qGD-ROMùØ­±Åª¥h§ó¦hªº·s¸ê®Æ¡C§Ú­Ì¨Ï¥Îªºbootloader¨Ã¤£ª¾¹D¦p¦ó¨Ó¸òSaga DreamcastªºGD-ROM¨Ó·¾³q¡C©Ò¥H°ß¤@ªº¤èªk´N¬O¡A§Ú­Ì¦b¤@¶}©l¡A´N§â©Ò¦³»Ý­nªºªF¦è¥þ³¡load¶i¥h¡Gbootloader, kernel image, ramdisk image.

¤@¥¹©Ò¦³ªºªF¦è¥þ³¡load¶i¥h¡A³o®É­Ô¡Abootloader´N»Ý­n¤ÀªR°O¾ÐÅé¡A¤À²M·¡kernel©Mramdisk image.¡C³o´N»Ý­nbootloaderª¾¹Dkernel©Mramdiskªººë½Tªº¤j¤p¡C°ß¤@ªº¤èªk´N¬O¡A·í°µ¦nkernel©Mramdisk¥H«á¡A¥h­pºâ¥L­Ìªº¤j¤p¡AµM«á¦b¥´³y bootloaderªº®É­Ô¡A§â³o¨Ç·Ç½Tªº¸ê®Æ´£¨Ñµ¹bootloader¡C(source code)

 ©Ò¥H¡A§Ú­Ì²{¦b¥ý­n¥h¥´³y¤@­ÓÀ³¥Îµ{¦¡(shell)¡AµM«á¦A°µ¤@­Ó¤j¤p¦X¾Aªºramdiskµ¹¥¦¡C³Ì«á§Ú­Ì¦A¦^¨ìBuilding Saga Dreamcast Bootloader³oùØ¡C

  

¥´³y¤@­ÓÀ³¥Îµ{¦¡

        ¹ïLinux¨Ó»¡¡A¤]³\³Ì­«­nªº¤@­ÓÀ³¥Îµ{¦¡´N¬OLinuxªºshell¤F§a¡C¨S¦³¤Fshell¡A¬Æ¦Ü¤£¥i¯à¥h¸ü¤J¨ä¥Lªºµ{¦¡¡A¤£¯àmount³]³Æ¡A¤£¯à¡K¡K

         ¦pªG§AªºSaga Dreamcast¨S¦³Áä½L¡A¨º¤\§A´N¨S¦³¿ìªk¨É¨üSaga Dreamcast¤Wªºshellªº¨ººØ·Pı°Õ¡C¦]爲¨S¦³Áä½L¡A§A´N¨S¦³¿ìªk¿é¤J«ü¥O¡C

        ¥´³y¤@­Óshellªº¦P®É¡Ashell¤]¥i¥H¹B¦æ§A¦bramdiskùØ­±ªºµ{¦¡©ÎªÌscript.·í§A¯à¦¨¥\ªº¦bSaga Dreamcast¤W­±¹B¦æ¤@­Óshell¡A¨º¤\¤]´N·N¨ýµÛ§A¥i¥HÀH·Nªº¦bSaga Dreamcast¤W­±¹B¦æ¥ô¦ó¤@­Ó§A·Q­n¹B¦æªºµ{¦¡¡C

¤U­±Á¿­z¦p¦ó爲Saga Dreamcast build¤@­ÓBusyBox . ¦b°ò¥»ªºShellªº°ò¦¤W¡ABusyboxÁÙ´£¨Ñ¤F´X­Ó«Ü¦³¥Îªº¤u¨ã¡Gmount, ls and modprobe.

 ²Ä¤@¨B¥ý«Ø¥ß¤@­Ó¥Ø¿ý¥s°µ initrd¡A¥]§t¤F³ÌªìramdiskªºªF¦è¡CPREFIX¬O爲¤F§âBusybox¦w¸Ë¨ì¥¿½Tªº¦ì¸m¡CDOSTATIC¬O§i¶Dsh4-linux-gcc Busybox¤£­n¥Îshared libraries.¦]爲§Ú­Ì¨S¦³¦w¸Ë°ÊºAªºlinker (dynamic linker).

# mkdir -p initrd

# export INITRD=`pwd`/initrd

# tar xzf busybox-0.60.1.tar.gz

# patch -p0 < busybox-0.60.1-sh-linux.diff

# cd busybox-0.60.1

# make CROSS=sh4-linux- DOSTATIC=true \

    CFLAGS_EXTRA="-I ${PREFIX}/${TARGET}/include" \

    PREFIX=${INITRD} clean all install

# cd ..

 §A¥i¥H¹ïBusybox°µ«Ü¦hªº§ïÅÜ¡A¨ãÅé½Ð¬ÝConfig.h©Mlibbb/libbb.h³o¨â­Ó¤å¥ó¡C

 

²{¦b§Ú­Ì­n¦bramdisk¤W­±°µdevice nodes:

 ¦]爲ramdisk¦bSaga Dreamcast¤¤¡A¬O§êºtªºroot directoryªº¸}¦â¡C©Ò¥H¤W­±¥²¶·¦³©Ò¦³ªºkernel¦b¹B¦æ¤¤¥i¯à»Ý­nªºªF¦è¡C°£¤Fshell©ÎªÌ¨ä¥LªºÀ³¥Îµ{¦¡¡A§Ú­Ì¥²¶·´£¨Ñdevice nodes.³o¼Ëµ{¦¡¤~¯à¸ò§Ú­ÌªºµwÅé·¾³q¡C

 ¦bSaga Dreamcast¤¤¡A¥u¦³¤@­Ó¯u¥¿ªº¹ê½è©Êªºdevice node¡G/dev/console node.¦pªG¨S¦³³o­Ónode,¨º¤\¤å¦rµ{¦¡±NµLªk¸òconsole device·¾³q¡C²³æªº»¡¡A´N¬O§A¬Ý¤£¨ì¿Ã¹õ¤WªºÅã¥Ü¡C¥Î¤U­±ªº«ü¥O°µ¥Xdevice node:

 # mkdir -p ${INITRD}/dev

# mknod ${INITRD}/dev/console c 5 1

  

»s§@ramdisk image:

²{¦b¡A§Ú­Ì¤w¸g»s§@¦n¤Framdiskªºdirectory¤F¡C±µ¤U¨Ó§Ú­Ì´N¸Ó§â³o­Ó¥Ø¿ý»s§@¦¨¤@­Óimage file¤F¡C

 # dd if=/dev/zero of=initrd.img bs=1k count=4096

# mke2fs -F -vm0 initrd.img

# mkdir initrd.dir

# mount -o loop initrd.img initrd.dir

# (cd initrd ; tar cf - .) | (cd initrd.dir ; tar xvf -)

# umount initrd.dir

# gzip -c -9 initrd.img > initrd.bin

 

»s§@bootloader:

Saga Dreamcastªºbootloader¬OHitachi SHªºbootloaderªº¤@³¡¤À¡A¥s°µsh-boot¡C¤@¨ÇSaga Dreamcastªº¯S©wªºcode³Q©ñ¦bsh-bootªº¥Ø¿ý¤¤¡C¦b¤l¥Ø¿ýtools/dreamcast¤¤¡A¥]§tMakefile¥Î¨Ó»s§@bootloaderªºimageÀɮסC¥t¥~ÁÙ¦³¤@­Óscript¥s°µroast.sh¡A¥i¥H¥Î¨Ó»s§@¤@­Ó¥]§tSaga Dreamcast bootloaderªºboot CD¡C¤U­±ªº«ü¥O±N«Ø¥ßSaga Dreamcastªºbootloader image:

 # tar xzf sh-boot-20010831-1455.tar.gz

# patch -p0 < sh-boot-20010831-1455.diff

# cd sh-boot/tools/dreamcast

# cp ../../../kernel/arch/sh/boot/zImage ./zImage.bin

# cp ../../../initrd.bin .

# make scramble kernel-boot.bin

 bootloaderªºimage¦b³oùجO¤å¥ókernel-boot.bin.³o­Ó¤å¥ó¥]§t¤Fbootloader¦Û¤v©M«e­±§Ú­Ì°µ¥X¨ÓªºLinux kernelÁÙ¦³ramdisk image.

  

»s§@Dreamcast Boot CD

²{¦b¥u®t³Ì«á¤@¨B¤F¡A¨º´N¬O§âkernel-boot.bin¿N¿ý¨ìCD¤W¥h¡CµM«á§âCD©ñ¨ìSaga Dreamcast¤W¡C¥´¶}Saga Dreamcastªº¹q·½¡A§A´N¥i¥H¬Ý¨ì§Aªºkernel boot¤F¡C

«e­±´£¨ì¹L¡Ash-boot¤¤¦³¤@­Ó¥s°µroast.shªºscript.³o­Óscript·|À°§U§Ú­Ì¦Û°Ê§¹¦¨CD¿N¿ý¨BÆJ¡C³o­Óscript­º¥ý§âkernel-boot.bin§ï¦W爲1ST_READ.BIN¡]啓°ÊÀɮצW¬ö¿ý爲IP.BIN¡^µM«á½Õ¥Îmkisofs¨Ó«Ø³y¤@­ÓISO9660ªº¤å¥ó¨t²Îimage,³Ì¦³¥Îcdrecoder¨Ó¿N¿ýCD.

 爲¤F¯à¥¿½Tªº¨Ï¥Î³o­Óscript¡A¦b³o­Ó¤å¥óªº³Ì¶}©l³¡¤À¡A§A¥²¶·µ¹cdrecoder³]©w¤@¨ÇªF¦è¡A¥Î¥HÃѧO§AªºCD-R¾÷¾¹¡C

 §Q¥Î¤U­±ªº«ü¥Oªº¨ì§AªºCD-r driverªºID¡CµM«á§âroast.sh¤¤ªº¡¨1,0,0¡¨´«¦¨§AªºCD-R driverªº¥¿½TªºID.

¦pªG§AªºCD-R drive¤£¬OSCSIªº¡C¨º¤\§A»Ý­n¥Î¡§ide-scsi¡¨¨Ó°µSCSIªºÃþ¤ñ¡C¤]´N¬O»¡§âIDEªºdriveÃþ¤ñ¦¨SCSI¨Ó¥Î¡CºI¤Jide-scsi³o­Ómodule«e¡A¦pªG§A¶i¤J¤FX-window¡A½Ð°O±o±À¥XX-window.

 # modprobe ide-scsi

# cdrecord -scanbus

scsibus1: 1,0,0 100) 'PHILIPS ' 'PCRW804 ' ' 1.5' Removable CD-ROM

 ·í³]©w¦n¤F¤@¤Á¥H«á¡A²{¦b©ñ¤J¤@¤ùCD-R¡C¨Ã¥B¹B¦æ¤U­±ªºscript¡C·í¤@¤Á§¹¦¨¥H«á¡A§A´N¥i¥H§âCD-R©ñ¨ì§AªºSaga DreamcastùØ­±¡A¥´¶}¹q·½¡A´X¬íÄÁ¥H«á¡A§A´N¥i¥H¦b§AªºSaga Dreamcast¤¤¹B¦æBusybox shell°Õ¡C

 # ./roast.sh kernel-boot.bin

   

«á°O

³o½g¤å³¹Á¿¸Ñ¤F¤@¨Ç²³æªº¨BÆJ¨Ó»s§@¤@­Ó¦Û¤vªº´O¤J¦¡¨t²Î¡A¥]¬A¥´³y¤@­Ócross compiler, GNU C runtime library, linux kernel, Busybox shell, ramdisk image¡C¥H¤Î³Ì«á§â©Ò¦³ªºªF¦è¤è¨ì¤@°_¡A¿N¿ý¥X¤@¤ù¥i¥H¦bSaga Dreamcast¹B¦æªºCD.

 ³oùتº¤@¤Á³£¥u¬O¤@­Ó¶}©l¡C´O¤J¦¡¨t²ÎÁÙ¦³«Ü¦hªºªF¦èµ¥«Ý§A¥hµo±¸¡B±´¯Á¡C§A¥i¥H§â§AªºBusybox´«±¼¡A´«¦¨§A¦Û¤v¼gªºµ{¦¡¡A©ÎªÌ±qºô¤W§ä¨ì¨ä¥Lªºµ{¦¡¡A¤]¥i¥H§â§AªºSaga Dreamcast°µ¦¨¦n¶H§Aªº®à­±«¬¹q¸£¤@¼Ë¡Cµ¹§AªºSaga Dreamcast¥[¤WSega Broadband Adapter (Ethernet)³o¼Ë§A¥i¥H¥Î§AªºSaga Dreamcast¤Wºô¹CÄý¡A¦¬¶l¥ó¡C¤]¥i¥H爲§AªºSaga Dreamcast¥[¤W¤@­ÓRS232ªºserial port¡C³o¼Ë§A´N¥i¥H§Q¥Î³o­Óserial port¨Ó¸ò§Aªº®à¤W«¬

¹q¸£·¾³q¡CÁÙ¦³«Ü¦h«Ü¦hªºªF¦è¥i¥H°µ¡K¡K


Copyright

This article is Copyright (c) 2001 by Bill Gatliff. All rights reserved. Reproduction for personal use is encouraged as long as the document is reproduced in its entirety, including this copyright notice. For other uses, contact the author.

About the Author

Bill Gatliff is an independent consultant with almost ten years of embedded development and training experience. He specializes GNU-based embedded development, and in using and adapting GNU tools to meet the needs of difficult development problems. He welcomes the opportunity to participate in projects of all types.

Bill is a Contributing Editor for Embedded Systems Programming Magazine, a member of the Advisory Panel for the Embedded Systems Conference, maintainer of the Crossgcc FAQ, creator of the gdbstubs project, and a noted author and speaker.

Bill welcomes feedback and suggestions. Contact information is on his website, at http://www.billgatliff.com.

¤¤¤å¥X³B¡Gwww.cosoft.org.cn