上一主题下一主题
«12»Pages: 2/2     Go
主题 : 【讨论】分析DC上安装硬盘是真是假
YZB
级别: 超级版主

UID: 12451
精华: 6
发帖: 19055
威望: 173 星
金钱: 2963 浮游币
贡献值: 9881 点
好评度: 54745 点
人气: 4322 点
在线时间: 19088(时)
注册时间: 2004-10-02
最后登录: 2024-07-01
20楼  发表于: 2006-06-02 14:01

偶然看到的贴个上来

原贴地址:http://www.loveunix.net/html/200312/11242.html
(嵌入式应用)--在DC游戏机上创建嵌入式系统--
*******导论*******

我们学习掌握嵌入式Linux一个富有挑战性的方面就是: 缺乏廉价的兼容硬件。
当然,众所周知,Linux可以"完美"地运行在PC上,不过,当让Linux主宰你的工作站时,是否就意味着你可以自封为"嵌入式Linux高手"?


*(如何让linux工作在DC之上)

在我们能讨论如何将Linux运行于DC之上前,你不得不先了解一点如何让linux进入DC的"脑海"中(哈,和咱们追MM的第一步一样)。要让这件事发生,魔法就在于你重启之前放入DC中的CD。换句话说:不需要其他工具(吁,偶还以为要用小刀把linux五个字母刻进DC的ROM中呢)


*(SEGA最后的硬件遗产 DC)

DC的 日立SH7750 CPU 运行于200M Hz,拥有16M 内存。显示组件可以驱动一台PAL或NTSC制式的TV,也可通过适配器接上一台VGA显示器(so good)。你依然可以在电玩店里发现DC,并大约需要花费100美元获得一台,包括可选的外设:键盘和鼠标。你也可以发现未连结的以太网适配器(SEGA称之为宽带适配器,或BBA---"骗子"!)


*(让linux进驻"圣域"--DC)

上电后,DC的板载引导装载固件(BLF)希望看到一片包含最小化的两个纪录段的CDR(非CDRW)盘片。第一个段假定为一个音轨,被BLF忽略。第二个段应为一个CD/XA数据轨(模式2,排列1),其包含标准的ISO9660文件系统;在FS的起始16个扇区容纳的引导启动信息结构通常指的是IP.BIN。

IP.BIN数据结构中包含着引导进程最后运行的bootloader的文件名。当然,其还包括识别含有CD运行程序的硬件的元数据、控制各种图形兼容性的程式(如NTSC、PAL视频输出)的区域符、程序所需的外设列表(控制器-即手柄、游戏包等等)、循环冗余检校。

一旦DC的BLF读取、生效IP.BIN的信息,从ISO9660FS中把命名文件内容装载进内存,就会完全交出系统控制权。就我们做的这件事中,装载的程序是linux OS,及相关程式和数据;其他可能要做的也许是:需要一个小监视器,知道有时如何从DC中列出的你钟爱的internet拍卖站点下载另外的应用程序。


串行或以太网端口;一个像eCos的RTOS;或和我一起为某类的一个游戏而工作,抑或我曾经听说过的。(注:作者在他的DC上没有游戏。真的。当正是娱乐时间时,他领导着楼上的三个他的自推动的游戏组织。他们不仅为了娱乐,也更多地为了不菲的吃穿。这些造就了DC的价格有相符的更好价值。)

DC的系统固件也提供了一些BIOS类的功能性,这是针对一些系统操作,如从GD-ROM驱动器中读取(GD-ROM:一种CD-ROM的变种,可容纳1GB数据),取得系统信息,访问板载闪存;在DC linux内核中利用这些功能的编码当前正在开发,在你读这篇文章时也许已完成了。


(那下面将发生什么?)

现在我们知道如何获得DC的可执行映像,我们需要确定如何利用这个特性去引导运行linux。为了回答这个问题,我们需要做一点铺垫。传统上linux内核不能自引导。只不过,它们依赖BL(bootloader)建立一个稳定的系统状态,收集主机平台的信息,然后传给内核。许多linux系统的建立也要在BL中包括解压代码,这加速了所有引导进程,通过从像软盘这样慢速廉价的介质上读取一个压缩的(而非原始大小的)内核映像。对于典型的linux PC上的设置,BL被叫做LILO或Grub。在一个嵌入式设置中,BL的名字由你决定。

再详细的重申一下,在一个基于linux的环境中,习惯上的引导进程像这样……
BL从主机的BIOS或者引导固件中被赋予初始的控制权,抑或,BL本身就是系统的引导固件。

1。BL把内核映像"拽"进内存并进行解压。
2。BL"跳进"解压后的内存映像,这里包含了linux OS的内核。
3。内核自初始化,挂装根目录,装载设备驱动初始化硬件,运行应用程序。
4。现在我们知道了需要知道的,CD上的可执行映像的内容变得清楚了一点。映像必须包含

一个BL和linux内核,为了让BL在DC引导进程结尾,找到linux kernel,转移控制权,我们
也必须安排一下这个映像。


(Linux VS 应用程序)

也许你认为获得Linux kernel 的引导和运行,是我们故事的结尾。这确实必须做,但是,这仅仅是个开始;一旦kernel运行,它需要应用程序告诉它该做什么。如果这句话听起来有些奇怪,那么你也许已经丢失了一条基本原则,那就是通用目的,桌面OS不同于它们的嵌入式副本(之所在)。

在桌面OS上,操作系统在应用程序之间调整交互作用。而在嵌入式系统中,OS和应用程序
地位相同,因为两者封装的如此紧密,不可能区分开他们,至少是不切实际。

Linux是一个具有通用目的 的桌面导向的OS。同样地,我们必须有可用的应用程序供它运
行。在文章接近尾声时,我们将制造一个应用程序,如一个运行的shell。

(Linux VS fielsystems)

如果你徘徊在linux的启动代码间,(如果有人感兴趣,这个也许就是未来一篇文章的题目),你会在kernel寻找一个叫做"init"可执行文件来装载并运行的时候结束你的旅程。这不仅意味着我们需要一个叫做init的程序,也表明我们需要个文件系统来从中得到。

你也许意识到DC不包括一个硬盘,这个放文件的最佳场所。但恐怕你不知道,大多数的PC工作站也缺乏硬盘,至少在OS初始化IDE或SCSI控制器以前,这是真的。所以Linux必须在启动时有一个仿文件系统的方法,否则它将不会在工作站类的PC上有太大的用处。当然,这我们都知道。(我受不了啦,这个老外在骗稿费)

当因为没有FS而模仿一个文件系统是可能的,Linux用一个ramdisk:一个被装扮成磁盘分区的内存结构。一个工作站的BL在引导时从计算机磁盘上读取ramdisk映像,并把它的地址传给内核。然后,内核从ramdisk中读取磁盘控制器的设备驱动程式,并开始和物理磁盘设备对话。

一旦真正的磁盘接口开始工作,内存中ramdisk分配的内存将被释放。

ramdisk可以提供Linux需要的所有磁盘导向的设备。(虽然ramdisk设备可以很容易的对数据文件进行写操作,那些文件在系统关闭时将丢失,这是因为在下一次启动时,原始ramdisk映像又将被重新读入。)因此,如果主机系统拥有足够的ramdisk内存来存储系统需要的程式和驱动,根本就不需要硬盘。


以上就是我们针对DC所要做的大致方法。








作者: sky-walker 发布日期: 2003-12-02
********实战阶段********

Chapter 1: 让Linux运行于DC上的软件

在真实的Linux或其他类Unix工作平台上,你必须拥有root权限才可以建立你自己的LinuxonDC系统,因为设置进程需要解释一种被称为设备节点的特殊文件,而这个在非unix类环境中没有同样的提法。

你也需要个CDR烧录软件,利用它能够以CD/XA数轨格式对多段式CDR进行写操作。支持这种配置是由于其得到广泛分布但又需花最少的钱获得CDR burner和相关程式。记住一点:DC的GDROM drive不能读取CDRW,但是可以读取用CDRW burner烧录的CDR。

最后,你需要以下列表中的文件。从FSF官方站点或镜像站点获得标准的GNU发布(软件)是可用的,从表中提及的站点获得的其他软件也同样可用。有关补丁所需的广泛列表是简单的事,这需要得到自动的配置和安装程式的帮助。

********************************
binutils2.11.2.tar.gz------------- 连接器,汇编器,目标管理组件
gcc3.0.1.tar.gz------------------- GUN 编译器集合,包含C/C++编译器
glibc2.2.4.tar.gz----------------- GNU C 运行时库
busybox0.60.1.tar.gz-------------- 小型嵌入式版本的通用Unix组件
kernelshlinuxdreamcast.tar.gz----- DC的linux kernel
shboot200108311455.tar.gz--------- DC的linux BL
binutils2.11.2shlinux.diff-------- 组件补丁
gcc3.0.1shlinux.diff-------------- gcc补丁
glibc2.2.4shlinux.diff------------ glibc补丁
busybox0.60.1shlinux.diff--------- busybox补丁
kernelshlinuxdreamcast.diff------- Linux kernel 补丁
shboot200108311455.diff----------- shboot 补丁
********************************

chapter 2:建立组件和启动编译器的命令

(建立工具)
创建工具是我们让Linux运行于DC上之工作进程的第一步。其包括创建:一个交叉编译器,连接器,编译器,一个C 运行时库。在下一节中我们将用这些工具来建立OS,和一个基本的shell应用程式。最后,我们将把这些东西放入一个ramdisk并烧录一个CD。
这个过程是漫长和棘手的,但却很有意义。

(建立 交叉编译器,连接器,启动编译器)
过程:一个妆ΡΑ程度的编译器可以用于建立运行库和OS kernel,但不会是通用的应用程序。我们不能突然建立一个完整的编译环境,这是因为许多需要的头文件来自C 运行时库,但却不存在于组件自建的运行库中。
以root用户身份登录,按照下面的命令脚本操作。
1〉导入一些环境变量,这是以后需要键入的。确定一下 /usr/local/bin 在PATH变量中。
2〉解压组件包的源代码,把一些"微小"的变化补丁进去,以更好的适合DC的微处理器。续而,组件包被配置,编译,安装。作为执行的结果,将于/usr/local/bin这里以sh4linuxas和sh4linuxld结束。
3〉同样的步骤被启动编译器重复,一些细微的不同之处表明这样一个事实:我们不是在建立一个完整的编译器。启动编译器的可执行部分叫做 sh4linuxgcc,被安装在 /usr/local/bin。

********************************
# export TARGET=sh4linux
# export PREFIX=/usr/local
# export PATH=${PATH}:${PREFIX}/bin
# tar xzf binutils2.11.2.tar.gz
# patch p0 < binutils2.11.2shlinux.diff
# mkdir p buildbinutils && cd buildbinutils
# ../binutils2.11.2/configure target=$TARGET \
prefix=$REFIX
# make all install
# cd ..
# tar xzf gcc3.0.1.tar.gz
# patch p0 < gcc3.0.1shlinux.diff
# mkdir p buildgcc && cd buildgcc
# ../gcc3.0.1/configure \
target=$TARGET prefix=$REFIX \
withoutheaders withnewlib \
disableshared enablelanguages=c
# make allgcc installgcc
# cd ..
********************************


Chapter 3: 配置kernel源码

(配置内核源码)
创建工具链的下一步是配置内核头文件,这是为了创建运行时库时可以摘录多一点的信息。办法是在内核源码中运行等价的配置命令。运行下一列表中的命令,不要对出现的菜单中的设置做任何变更。

********************************
# tar xzf kernelshlinuxdreamcast.tar.gz
# patch p0 < kernelshlinuxdreamcast.diff
# cd kernel
# make ARCH=sh CROSS_COMPILE=sh4linux menuconfig
# cd ..
********************************

在指令中,位于CORSS_COMPILE 末尾的the trailing dash(拖尾的破折号)并不是个错误:被make调用的CORSS_COMPILE宏被视为一个前缀;没有这个破折号,宏将无法工作。

Chapter 4: 创建glibc

(建立运行时库)
现在我们已有了一个引导编译器和适当配置的kernel,下一步就创建运行时库环境和头文件。用到的是glibc;这个库包括和printf()相似的函数集,也包括动态连接器(就像Win32的DLLs)和其他几个程式。
创建glibc的步骤见下表。先解压包,打上补丁,把kernel头文件拷到正确位置。与前面的步骤相比而言,建立glibc要调用两次make:分别是创建和安装 运行时库,详细的指定库中各部分的安装位置。
在有趣的一段存储时间中,两个make 调用之间的touch命令的功能是:欺骗glibc,好让其认为已经完全建立了几个咱们并不需要的程序。最后,echo命令在没有路径信息情况下写了个连接文件libc.so,(也许是直觉上吧)使编译器可以正确位于安装库中。
如果你自 创建组件和启动编译器 以来重启过计算机,或者注销,你就需要重新写入这三个环境变量的值:PATH、TARGET、PREFIX。
Glibc是一个充实而复杂的代码体,你将注意到,创建它将花费很长时间,甚至是相当强大的硬件。在此期间,这将是一个很好的休息时间。(可是对于翻译,就不是这样啦 :=()

*******************************
# tar xzf glibc2.2.4.tar.gz
# patch p0 < glibc2.2.4shlinux.diff
# mkdir p buildglibc && cd buildglibc
# mkdir p ${PREFIX}/${TARGET}/include
# cp r ../kernel/include/linux \
${PREFIX}/${TARGET}/include
# cp r ../kernel/include/asmsh \
${PREFIX}/${TARGET}/include/asm
# CC=sh4linuxgcc ../glibc2.2.4/configure \
host=$TARGET prefix=$REFIX \
disabledebug disableprofile \
disablesanitychecks \
withheaders=${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 ..
********************************

Chapter 5:重建交叉编译器

(重建交叉编译器)
由于已经正确安装了头文件和运行时库,我们现在就可以建立一个完全的C/C++交叉编译器。命令如下。我们从启动编译器中重新利用原(代码)树,所以我们跳过熟悉的步骤。

********************************
# mkdir p buildgcc2 && cd buildgcc2
# ../gcc3.0.1/configure target=$TARGET \
prefix=$REFIX enablelanguages=c,c++
# make all install
# cd ..
********************************

Chapter 6:生成DC Linux 内核
现在我们已有了完整的交叉开发工具链,是让它们发挥作用的时候了。正如我以前提起过的,已经预置了DC的Linux内核源码。如今需要做的只是编译连结内核。生成的文件为:zImage,位于 kernel/arch/sh/boot,
其包含:压缩的内核映像,解压(至内存)的程序。
稍后,你已成功引导了内核後,感到要用menuconfig调节内核设置,就需要重新编译。一个极有价值的练习就是 看看在满足你需要功能的前提下,可以把内核映像做到多小。

************
# cd kernel
# make ARCH=sh CROSS_COMPILE=sh4linux \
clean dep zImage
# cd ..
************

Chapter 7: 创建和安装Busybox的命令
完成一个成功的内核映像,下一步就是创建一个启动时把内核映像装载进DC内存的BL。
重新申请DC固件装载一个简单的可执行映像 进RAM中,除非应用程序知道如何和DC的GDROM一起工作,除此之外没有办法从CD上运行附加程序。BL并不知道如何操作GDROM,所以我们必须装载运行所需要的一切。
一个BL,kernel映像,ramdisk映像。
一旦所有的装载完毕,BL就需要为kernel 和 ramdisk映像分割内存,当然这需要在启动前就需要知道精
确的大小。确定的唯一的方法就是提供信息给BL的源代码。
所以,我们将创建一些应用程序,带有它们的可移植的ramdisk映像。

(创建一个应用程序)
在一个基本的Linux系统中也许最重要的应用程序是command shell。如果没有shell,就不可能交互性的通知OS去载入其他程序,挂在远程目录,或者简单的探测系统设置并解决问题,发现将要发现什么。如果你的DC没有键盘,也会出现同样的情况(废话真多)。
以下是创建BusyBox的过程,除了一个基本的shell工具外,BusyBox还包括一些有用的命令程序:如miunt,ls,modprobe等。
第一步是创建initrd 目录,包含初始化ramdisk映像。PREFIX参数通过make BusyBox去安装自己。DoSTATIC设置告诉 sh4linuxgcc 要用静态库来编译BusyBox,这也是为什么我们没有安装动态链结器的原因。

************************
# mkdir p initrd
# export INITRD=`pwd`/initrd
# tar xzf busybox0.60.1.tar.gz
# patch p0 < busybox0.60.1shlinux.diff
# cd busybox0.60.1
# make CROSS=sh4linux DOSTATIC=true \
CFLAGS_EXTRA="I ${PREFIX}/${TARGET}/include" \
PREFIX=${INITRD} clean all install
# cd ..
************************

Chapter 8: 建立 /dev/console 设备节点

就像所有迄今为止我们用过的其他软件,BusyBox得到了高度的配置。其最重要的设置可以参见在Config.h和 libbb/libbb.h 。

(在初始化ramdisk中建立设备节点)
因为 变量${INITRD} 代表的目录已经被包含进Linux的根目录中,也包含了在内核运行时尽可能需要的一切。除了shell 或者其他的应用程序之外,我们必须提供设备节点,这样才可让应用程序能够和Linux设备驱动通话。
在我们要建立的DC上,有一个至关重要的设备节点:/dev/console 节点。如果没有,文本模式的应用程序就不能和console设备通信。也就是意味在DC的显示器上看不到任何文本输出。

创建命令如下:

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


Chapter 9:建立压缩ramdisk映像

现在我们已有一个看上去像ramdisk的目录结构,是时候为其建立映像,并绑定进DC的BL。
我们通过使用 loop设备 为文件initrd.bin中的 ${INITRD}目录 建立一个压缩快照。initre.img就是未压缩的快照。


**************************************************
# 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
**************************************************



Chapter 10:建立BL映像的命令

DC的BL是被称为shboot的 Hitachi SH bootloaders 组合中的一部分。针对DC体系的特殊代码被烧录进 shboot 目录树中。在子目录 tools/dreamcast/中,不仅包括了自建BL映像的 Makefile 文件,也包括一个从BL映像中创建可引导CD的脚本:roast.sh 。
shboot 也包括一个叫做 scramble 的工具组件,这里的"scramble"包含Dreamcast CD的ISO9660格式的数据被Dreamcast的引导固件所加密。

命令组如下:
********************************************
# tar xzf shboot200108311455.tar.gz
# patch p0 < shboot200108311455.diff
# cd shboot/tools/dreamcast
# cp ../../../kernel/arch/sh/boot/zImage ./zImage.bin
# cp ../../../initrd.bin .
# make scramble kernelboot.bin
*******************************************

Chapter 11: 找到你的 CDR 烧录程序的 设备ID

现在只要在家里就可以做到了!剩下要做的就是 在CD上烧录 kernelboot.bin ,将CD移出Dreamcast,按下 POWER 按钮, 然后看着新内核 引导。
正如我在前面章节提到的, shboot包中含有自动烧录CD的脚本 roast.sh。此脚本重命名kernelboot.bin为 1st_READ.BIN ,调用命令 mkisofs 建立 ISO9660文件系统映像, 然后用 cdrecord 烧录CD。
如要让脚本工作,你必须在脚本文件顶部设置CDRECORD的值,这用来鉴定 CDR烧录程序。用下面列表中的命令来得到 ID ,如果有必要还要在 roast.sh 中改变一下1,0,0为适当的值。
cdrecord程序依赖于Linux的 idescsi 设备驱动,因此在启动程序前调用 modprobe 。可以几乎确定的是,如果要运行 modprobe ,需要退出 XWindow ,因为大多数Linux XWindow 管理器通过安装设备驱动来阻止初始化时的idescsi 。如果 modprobe 显示出"the idescsi device cannot be installed"的错误,只有退出XWindow 再试一次。

*********************
# modprobe idescsi
# cdrecord scanbus
scsibus1: 1,0,0 100) 'HILIPS ' 'CRW804 ' ' 1.5' Removable CDROM
*********************

Chapter 12: 烧录CD
如果 roast.sh中的 CDRECORD 设置得当, 插入一个 CDR 碟片,运行以下的命令脚本,放松然后恭喜你自己(当DC 的Linux CD正在 "烹饪"时)。一旦完成,将CD放入Dreamcast中,接通电源,几秒钟後你就会看到Linux 的引导 和 运行 BusyBox shell 应用程序。

********************************
# ./roast.sh kernelboot.bin
********************************

(瞻望未来)----晕,罗嗦的还不够,偶都累死了……
文章占据了不少篇幅。除了建立 Hitachi SH 的MIPS 交叉编译器工具链外,你也建立了GNU C 运行时库,一个Linux kernel, 一个包含 BusyBox shell 应用程序的 ramdisk 映像,你将所有的部分放在一起(BL 映像),然后烧成CD。

下一步你还想做什么?(偶想休息的说)
如果你认为 嵌入式Linux系统在未来"撒谎",那么在你需要把它当做谋生的饭碗前,你需要的是掌握它,并且将它尽可能的运行在像Dreamcast一样的廉价,非PC的平台上。一个建议就是 用你自己的应用程序取代这里的 BusyBox, 编译和静态链接 Hitachi SH 编译工具。 另一个想法就是 从Internet 上搜刮几个小个头的软件,再试着让你的DC不论看上去还是玩起来都像那么回事………………哈哈哈哈哈,终于翻译完了,偶的键盘也变得更干净了
级别: 模拟之星
UID: 29816
精华: 0
发帖: 637
威望: 0 星
金钱: 0 浮游币
贡献值: 20 点
好评度: 1290 点
人气: 26 点
在线时间: 213(时)
注册时间: 2005-05-24
最后登录: 2023-10-01
21楼  发表于: 2006-06-03 19:13

楼上强问...学文科的人飘过~0~
级别: 模拟专家
UID: 119364
精华: 0
发帖: 388
威望: 0 星
金钱: 3550 浮游币
贡献值: 0 点
好评度: 1151 点
人气: 0 点
在线时间: 7(时)
注册时间: 2006-04-05
最后登录: 2016-10-03
22楼  发表于: 2006-06-05 12:09

这个LINUX FOR DC的压缩包我有,有谁需要吗?

我可以上传到FTP吗?
级别: 模拟小生
UID: 126157
精华: 0
发帖: 10
威望: 0 星
金钱: 2572 浮游币
贡献值: 0 点
好评度: 30 点
人气: 0 点
在线时间: 0(时)
注册时间: 2006-06-28
最后登录: 2008-12-28
23楼  发表于: 2006-07-04 18:32

整点实际的,有谁搞一个样品呀,超期待呀
wo shi you xi mi
上一主题下一主题
«12»Pages: 2/2     Go