¡@³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§An¦³¨¬°÷ªº¤å¥ó¡C¦P®É¡A§An¥²¶·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
²{¦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²Î¥ut³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²Î¥un¦³¨¬°÷ªº¦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µ{¦¡³£¤ä´©Ó¡Cnª`·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ùØ¥Dn¬Onconfigure 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 .. ²{¦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¥Dn¤]¬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ªºkernel爲Saga Dreamcast³]¸m¦n¤F¡C²{¦b¥uncompile©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¥hpºâ¥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·Qn¹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 |