DiskOnChip 启动 Linux HOWTO

Rohit Agarwal


        
     

Vishnu Swaminathan


     
     

20060907

修订历史
修订 1.02006-09-07修订者:MG
LDP 出版物的最后审阅

本文档讨论了如何使闪存驱动器可启动 Linux。我们将描述如何从这样的驱动器启动,而不是从普通的硬盘驱动器启动。


目录
1. 简介
1.1. 为何编写本文档?
1.2. NFTL 与 INFTL
1.3. 实际目标
2. 参考配置
3. 假设
4. 在 Linux 中使用 M-Systems DiskOnChip 2000 TSOP 作为额外的存储驱动器
4.1. 步骤 1:修补内核
4.2. 步骤 2:编译内核
4.3. 步骤 3:创建节点
4.4. 步骤 4:使用新内核重启
4.5. 步骤 5:在新内核中插入 M-Systems 驱动程序/模块
4.6. 步骤 6:在 DiskOnChip 上创建文件系统
4.7. 步骤 7:挂载新创建的分区以开始访问 DOC
5. 在 DiskOnChip 上安装 Linux 和 LILO
5.1. 步骤 1:将 DOC 固件复制到 DiskOnChip 上
5.2. 步骤 2:使用 Dos 实用程序格式化 DiskOnChip
5.3. 步骤 3:修补和编译内核 2.4.18
5.4. 步骤 4:创建节点
5.5. 步骤 5:修改 /etc/module.conf 文件
5.6. 步骤 6:创建 initrd 镜像
5.7. 步骤 7:将 DOC 驱动程序插入到新内核中
5.8. 步骤 8:在 DiskOnChip 上创建文件系统
5.9. 步骤 9:在 DiskOnChip 上构建根文件系统
5.10. 步骤 10:使用 rdev 指定内核镜像的 DOC 根文件系统位置
5.11. 步骤 11:编译 lilo-22.3.2
5.12. 步骤 12:将 boot.b 文件复制到 DOC 的 boot 目录中
5.13. 步骤 13:修改 /etc/lilo.conf 文件
5.14. 步骤 14:将新的 LILO 配置存储在 DiskOnChip 上
5.15. 步骤 15:修改 DiskOnChip 根文件系统的 etc/fstab
5.16. 步骤 16:更新固件
5.17. 步骤 17:从 DiskOnChip 启动
6. 在 DiskOnChip 上安装开发工具链
6.1. 步骤 1:获取 root_fs_i386.ext2 的最新副本
6.2. 步骤 2:替换 DiskOnChip 的根文件系统
6.3. 步骤 3:修改 DiskOnChip 根文件系统的 etc/fstab
6.4. 步骤 4:重启
7. 参考
A. dinfo 的输出
B. 许可证
C. 关于作者
D. 致谢

1. 简介

1.1. 为何编写本文档?

DiskOnChip (DOC) 是一种由 M-Systems 制造的闪存驱动器。闪存驱动器的使用正在兴起,成为嵌入式设备中硬盘的替代品。嵌入式 Linux 作为嵌入式系统社区首选的操作系统越来越受欢迎;因此,对可以从闪存驱动器启动到 Linux 的嵌入式系统的需求不断增加。

目前关于该主题的大部分文档要么不正确,要么不完整;此类文档提供的信息的呈现方式可能会让新手用户感到困惑。


1.2. NFTL 与 INFTL

另一个根本问题是,大多数文档都假设 DiskOnChip 是 NFTL(NAND 闪存转换层)设备,并继续描述 NFTL 设备的启动过程。DiskOnChip 架构有两种变体,每种变体都需要不同的启动程序:NFTL 和 INFTL(反向 NFTL)。Dan Brown 编写了一个名为 DOCBoot 的引导加载程序,他在 DOCBoot 包附带的 README 文档中解释了这些变体之间的差异:http://ftp.arm.linux.org.uk/pub/people/dwmw2/mtd/cvs/mtd/docboot/

INFTL 设备的组织结构如下

IPL

介质头

分区 0 (BDK 或 BDTL)

(可选)分区 1 (BDK 或 BDTL)

.. 最多分区 3

在 Linux MTD 下,为 INFTL 分区表中列出的每个分区创建 MTD 分区。因此,最多创建 5 个 MTD 设备。

相比之下,NFTL 设备的组织结构如下

固件

介质头

BDTL 数据

在 Linux 下,通常会创建两个 MTD 设备。

根据以上摘录,引导加载程序在获取 INFTL 设备的内核镜像时使用的过程与 NFTL 设备使用的方法不同,因为两种设备具有不同的物理布局。(重复)

对于 INFTL DiskOnChip 设备,使用 2.4.x 内核很复杂,因为 pre-2.6.x 内核缺少原生支持(尽管存在原生 NFTL 支持)。这种功能只能通过修补内核来获得;这种方法是不明智的。

不鼓励使用外部 INFTL 支持修补内核;MTD 驱动程序(DiskOnChip 的开源驱动程序)的开发者也对这种方法感到担忧。有关此事的更多信息,请随时查阅邮件列表上的对话,网址为 http://lists.infradead.org/pipermail/linux-mtd/2004-August/010165.html

在 2.6.x 内核中提供原生 INFTL 支持的驱动程序未能识别用于此练习的 DiskonChip 设备,系统报告了以下消息

INFTL no longer supports the old DiskOnChip drivers loaded via docprobe.  
Please use the new diskonchip driver under the NAND subsystem.

因此,我们决定使用 M-Systems(DiskOnChip 制造商)提供的驱动程序。然而,根据供应商提供的关于这些驱动程序的文档,它们仅为 NFTL 设备设计。因此,我们决定编写本 HOWTO,以解决 INFTL 设备的使用问题。我们特别注意消除步骤中的任何歧义,并尝试给出特定步骤的必要性原因,以便使事情在逻辑上清晰。我们以这样一种方式解释事情,即使是 Linux 经验较少的人也可以按照步骤进行操作。


1.3. 实际目标

本文档旨在作为以下方面的指南:

  • 将 M-Systems DiskOnChip 2000 TSOP 用作额外的存储驱动器,同时 IDE HDD 上运行 Linux。

  • 在 DiskOnChip 2000 TSOP 上安装 Linux 并从中启动 Linux。

  • 安装开发工具链,以便直接在 DiskOnChip 上编译和执行程序。

此处描述的方法已针对 DiskOnChip 2000 TSOP 256MB 和 DiskOnChip 2000 TSOP 384MB 进行了测试。


2. 参考配置

我们使用了以下硬件和软件

  1. VIA Eden CPU 1GHz 时钟速度 256MB RAM

  2. RTD Enhanced Phoenix - AwardBIOS CMOS Setup Utility (v6.00.04.1601)

  3. 内核 2.4.18 源代码,从 www.kernel.org/pub/linux/kernel/v2.4 下载

  4. 256 MB M-Systems DiskOnChip 2000 TSOP (MD2202-D256)

  5. M-Systems TrueFFS Linux 驱动程序版本 5.1.4,来自 http://www.m-sys.com/site/en-US/Support/SoftwareDownload/Driver+Download.htm?driver=linux_binary.5_1_4.tgz

  6. LILO 版本 22.3.2(随驱动程序分发)

  7. DiskOnChip DOS 实用程序版本 5.1.4 和 BIOS 驱动程序版本 5.1.4,来自 http://www.m-sys.com/site/en-US/Support/SoftwareDownload/TrueFFS5.x/BIOSDOSdriverandtools.htm

  8. 双启动硬盘,带有 Knoppix 3.9 和 Windows XP,使用 Grub 0.96 作为引导加载程序

  9. GNU GCC-2.95.3

  10. 最新的 root_fs_i386 镜像,来自 http://www.uclibc.org/downloads/root_fs_i386.ext2.bz2http://www.uclibc.org/downloads/root_fs_i386.ext2.tar.gz


3. 假设

我们对工作目录和挂载点做了一些假设,我们想在列出将 Linux 放到 DiskOnChip 上的完整步骤之前提及这些假设。


4. 在 Linux 中使用 M-Systems DiskOnChip 2000 TSOP 作为额外的存储驱动器

以下是为此目的执行的步骤。


4.1. 步骤 1:修补内核

https://linuxkernel.org.cn/pub/linux/kernel/v2.4 下载内核 2.4.18 的全新副本。

从站点下载的内核不支持 M-Systems 驱动程序,因此我们需要添加此功能。这通过向内核添加补丁来完成。

执行修补的步骤如下

  1. 解压内核源文件和 M-systems TrueFFS Linux 驱动程序版本 5.14。如果源代码在.tar.gz格式中,请使用

    tar-xvzf linux-2.4.18.tar.gz

    如果源代码在.tar.bz2格式中,请使用

    bunzip2linux-2.4.18.tar.bz2

    使用 bunzip2 后,您将获得一个名为linux-2.4.18.tar的文件。使用命令解压它

    tar-xvf linux-2.4.18.tar

    使用命令完成驱动程序的解压缩

    tar-xvzf linux_binary.5_1_4.tgz

    这会导致创建两个目录linuxlinux_binary.5_1_4.

  2. TrueFFS Linux 驱动程序包包含三个不同的文件夹

    • Documentation:其中包含描述 TrueFFS 各个功能的 PDF 文档。

    • dformat_5_1_4_37:其中包含实用程序 dformat,用于更新 DiskOnChip (DOC) 上的固件并在 DOC 上创建低级分区。

    • doc-linux-5_1_4_20:其中包含补丁、initrd脚本和其他实用程序。

  3. 现在将补丁应用于内核。我们将使用linux-2_4_7-patch文件,该文件位于linux_binary.5_1_4/doc-linux-5_1_4_20/driver中。以下命令用于此目的

    cdlinux_binary.5_1_4/doc-linux-5_1_4_20/driver

    patch-p1 -d /usr/src/linux < linux-2_4_7-patch

    这将创建一个名为doc的目录,位于linux/drivers/block目录中。

  4. 补丁创建了doc目录,但未将构建驱动程序所需的 M-Systems 驱动程序的源文件复制到此目录中。因此,执行以下命令

    cplinux_binary.5_1_4/doc-linux-5_1_4_20/driver/doc/* /usr/src/linux/drivers/block/doc

Warning内核版本
 

对于 2.4.18 以外的内核,补丁将失败,因为要应用补丁的源文件在不同的内核中可能略有不同。该补丁专门为内核 2.4.18 提供。

在继续步骤 2 之前,请执行以下操作

  • 以 root 用户身份登录。

  • 确保 gcc 版本为 2.95.3,否则构建将失败。使用 gcc --version 检查这一点。如果您的 gcc 版本不同,请编译 gcc-2.95.3。有关此目的,请参阅 http://xlife.zuarvra.net.columns/20020316


4.2. 步骤 2:编译内核

完成以下任务以编译内核

  1. cdlinux

  2. makemenuconfig

    检查以下选项

    • “块设备菜单” 中,选择

      • M-Systems 驱动程序作为模块,即 (M)

      • 环回设备支持作为内置,即 (*)

      • RAM 磁盘支持作为内置,即 (*)

      • 初始 RAM 磁盘 (initrd) 支持作为内置,即 (*)

    • “处理器类型和特性菜单” 中,选择 “禁用对称多处理器支持”

    • “文件系统菜单” 中,选择

      • Ext3 日志文件系统支持作为内置

      • DOS FAT fs 支持作为内置a

      • MSDOS fs 支持作为内置b

      • VFAT (Windows-95) fs 支持作为内置c

    Note文件系统菜单
     

    如果您想挂载 MS Windows 分区,则应激活 a、b、c 选项,否则可以忽略它们。但是,通常建议使用它们。

    关于内核编译的优秀资源是 内核重建指南

    配置文件,linux/.config应主要包含以下行(仅给出了配置文件的一部分)

    #
    # Loadable module support
    #
    CONFIG_MODULES=y
    CONFIG_MODVERSIONS=y
    CONFIG_KMOD=y
    
    #
    # Processor type and features
    #
    
    # CONFIG_SMP is not set
    
    
    #
    # Memory Technology Devices (MTD)
    #
    # CONFIG_MTD is not set
    
    #
    # Block devices
    #
    # CONFIG_BLK_DEV_FD is not set
    # CONFIG_BLK_DEV_XD is not set
    # CONFIG_PARIDE is not set
    # CONFIG_BLK_CPQ_DA is not set
    # CONFIG_BLK_CPQ_CISS_DA is not set
    # CONFIG_BLK_DEV_DAC960 is not set
    CONFIG_BLK_DEV_LOOP=y
    # CONFIG_BLK_DEV_NBD is not set
    CONFIG_BLK_DEV_RAM=y
    CONFIG_BLK_DEV_RAM_SIZE=4096
    CONFIG_BLK_DEV_INITRD=y
    CONFIG_BLK_DEV_MSYS_DOC=m
    
    #
    # File systems
    #
    # CONFIG_QUOTA is not set
    # CONFIG_AUTOFS_FS is not set
    # CONFIG_AUTOFS4_FS is not set
    CONFIG_EXT3_FS=y
    CONFIG_FAT_FS=y
    CONFIG_MSDOS_FS=y
    # CONFIG_UMSDOS_FS is not set
    CONFIG_VFAT_FS=y
    # CONFIG_EFS_FS is not set
    # CONFIG_JFFS_FS is not set
    # CONFIG_JFFS2_FS is not set
    # CONFIG_CRAMFS is not set
    CONFIG_TMPFS=y
    # CONFIG_RAMFS is not set
    CONFIG_ISO9660_FS=y
    # CONFIG_JOLIET is not set
    # CONFIG_HPFS_FS is not set
    CONFIG_PROC_FS=y
    # CONFIG_DEVFS_FS is not set
    # CONFIG_DEVFS_MOUNT is not set
    # CONFIG_DEVFS_DEBUG is not set
    CONFIG_DEVPTS_FS=y
    # CONFIG_QNX4FS_FS is not set
    # CONFIG_QNX4FS_RW is not set
    # CONFIG_ROMFS_FS is not set
    CONFIG_EXT2_FS=y
    
  3. makedep

  4. makebzImage

  5. makemodules

  6. makemodules_install

  7. 复制新创建的bzImage/boot目录并将其命名为vmlinuz-2.4.18,使用此命令

    cp/arch/i386/boot/bzImage /boot/vmlinuz-2.4.18

检查lib/modules/2.4.18/kernel/drivers/block/doc.o。这是我们访问 DiskOnChip 所需的 M-Systems 驱动程序。


4.3. 步骤 3:创建节点

现在我们将创建块设备,这是访问 DOC 所必需的。这些块设备将使用在 第 4.2 节 中构建的 M-Systems 驱动程序来访问 DOC。 mknod_fl 脚本位于linux_binary.5_1_4/doc-linux-5_1_4_20/driver中,用于此目的。

我们需要创建主设备号为 62 的块设备。为此,我们将在创建节点时传递参数 62

./mknod_fl 6262

这将在/dev/msys中创建以下设备,主设备号为 62

fla...fla4
flb...flb4
flc...flc4
fld...fld4

4.4. 步骤 4:使用新内核重启

为了使 Linux 操作系统识别 DiskOnChip,我们需要将 DOC 驱动程序模块插入到内核中。由于当前运行的内核不支持 M-Systems 驱动程序,我们需要启动到我们在 第 4.2 节 中刚刚编译的新内核。

为此,我们需要在/boot/grub/menu.lst文件中添加以下条目

title Debian GNU/Linux,Kernel 2.4.18
root (hd0,7)
kernel /boot/vmlinuz-2.4.18 root=/dev/hda8
safedefault
boot

其中 (hd0,7) 是保存内核镜像的分区vmlinuz-2.4.18/dev/hda8是保存根文件系统的分区。这些分区可能因系统而异。现在重启并选择内核 2.4.18 选项(在步骤 2 中编译的内核)在 grub 菜单中启动到新内核。


4.5. 步骤 5:在新内核中插入 M-Systems 驱动程序/模块

M-Systems 驱动程序默认加载的主设备号为 100,但我们新创建的节点(参见 第 4.3 节)的主设备号为 62。因此,我们需要插入主设备号为 62 的模块。可以通过以下两种方式完成此操作

  1. 在使用 insmod 插入模块时,还要提及需要分配给模块的主设备号,否则它将采用默认主设备号 100

    insmod doc major=62doc major=62

  2. 将以下行添加到/etc/modules.conf:

    options doc major=62

    然后使用 modprobe doc 插入模块。

使用不带选项的 lsmod 命令检查模块是否正确加载。


4.6. 步骤 6:在 DiskOnChip 上创建文件系统

在我们开始使用 DiskOnChip 之前,我们需要在其上创建一个文件系统。我们将创建一个 ext2 文件系统,因为它体积小。

这涉及到使用 fdisk 在 DOC 上创建分区的隐藏步骤。实际步骤如下

  1. fdisk /dev/msys/fla/dev/msys/fla

    此命令将要求创建分区。创建一个主分区号 1,起始柱面为 1,最终柱面为 1002。

    检查分区表,它应该如下所示

    Device             Boot  Start      End        Blocks    ID     System
    /dev/msys/fla1            1         1002        255984   83     Linux
    
  2. /dev/msys/fla1上创建文件系统,使用命令

    mke2fs -c /dev/msys/fla1-c /dev/msys/fla1

    其中fla1是 DOC 上的第一个主分区。(我们只创建了一个分区,以避免不必要的复杂性。)


4.7. 步骤 7:挂载新创建的分区以开始访问 DOC

/mnt目录中为 DiskOnChip 创建一个新的挂载点

mkdir /mnt/doc/mnt/doc

将 DOC 分区挂载到新创建的目录

mount -t auto /dev/msys/fla1 /mnt/doc-t auto /dev/msys/fla1 /mnt/doc

您现在可以像访问额外的存储驱动器一样读取和写入 DOC。

当您重启系统时,通过将驱动程序插入到内核中(参见 第 4.5 节)并挂载设备来使 DOC 可用。


5. 在 DiskOnChip 上安装 Linux 和 LILO

在本节中,我们将学习如何在未格式化的 DOC 上安装 Linux 操作系统,并使用 LILO 作为引导加载程序从中启动。

为了达到这种状态,将讨论一个过程。此过程中的某些步骤与本文档前面讨论的步骤类似。即便如此,这也应该被视为一个单独的过程,而不是 第 4 节 中步骤的延续。

一般来说,为了使设备启动到 Linux,它应该具有以下组件

本节将主要尝试满足以上三个要求。

应遵循以下步骤以实现本节的目标。


5.1. 步骤 1:将 DOC 固件复制到 DiskOnChip 上

我们将使用 dformat 实用程序,来自linux_binary.5_1_4/dformat_5_1_4_37.

M-Systems 不提供在 Linux 平台上使用 DOC 的固件。我们通过将 M-Systems dos 实用程序附带的固件副本复制到此目录(“dos 实用程序” 是 M-Systems 人员使用的术语,因此我们也使用了此名称)来解决此问题。在我们的系统中,我们通过挂载 Windows 分区并从中提取来复制它

mount -t auto /dev/msys/fla1 /mnt/doc-t automount /dev/hda5 /mnt/d

cp/mnt/d/dos\ utilities/doc514.exb linux_binary.5_1_4/dformat_5_1_4_37/

现在格式化驱动器,使用 dtformat,来自linux_binary.5_1_4/dformat_5_1_4_37/:

cdlinux_binary.5_1_4/dformat_5_1_4_37/

cd linux_binary.5_1_4/dformat_5_1_4_37/./dformat -WIN:D000 -S:doc514.exb

D000指定 DiskOnChip 在 BIOS 中的地址。

以下是我们系统上的 BIOS(RTD Enhanced Phoenix - AwardBIOS CMOS Setup Utility (v6.00.04.1601))设置。

BIOS 菜单的集成外围设备应具有

SSD Socket #1 to Bios Extension
Bios Ext. Window size 8k
Bios Ext. window [D000:0000]
Fail safe Boot ROM [Disabled]

Bios Ext. Window 表示您的 DiskOnChip 的地址。

NoteBIOSes
 

设置可能因您的 BIOS 版本而异。

现在关闭系统并启动到 Windows XP。

从现在开始,您将注意到 TrueFFS 消息和 Grub 菜单出现之前的一些时间延迟。


5.2. 步骤 2:使用 Dos 实用程序格式化 DiskOnChip

启动到 Windows XP。我们将使用 M-Systems Dos 实用程序来格式化 DiskOnChip。Dos 实用程序 dformat 会将固件复制到 DOC,然后将其格式化为 fat16 设备。

使用命令提示符,从 DOS 实用程序文件夹运行以下命令(假设您已经下载了 DOS 实用程序)

dformat /WIN:D000 /S:doc514.exb/WIN:D000 /S:doc514.exb

使用另一个名为 dinfo 的实用程序检查 DOC 分区。dinfo 示例输出在附录中给出。

再次关闭系统,现在启动到 Linux。

Note始终关闭
 

格式化后,您应该始终执行完全关机(断电),而不仅仅是重启。

即使步骤 1 和步骤 2 看起来相同,唯一的区别是步骤 1 从 Linux 完成,步骤 2 从 Windows XP 完成,但它们都必须完成。


5.3. 步骤 3:修补和编译内核 2.4.18

这必须以与 第 4.1 节第 4.2 节 中描述的完全相同的方式执行。

还要在/boot/grub/menu.lst/boot/grub/menu.lst


5.4. 步骤 4:创建节点

这使用与 第 4.3 节 中描述的相同过程完成。


5.5. 步骤 5:修改 /etc/module.conf 文件

必须修改文件/etc/modules.conf/etc/modules.conf

options doc major=62

,在文件末尾添加此行initrd这是必需的,因为我们的节点使用主设备号 62,而 doc 驱动程序模块使用主设备号 100。当创建

镜像时,如果您不编辑模块配置文件,驱动程序将加载主设备号值 100(而不是 62)。这将使节点无法使用驱动程序。使用 initrd 镜像的原因将在下一步中解释。linux_binary.5_1_4/doc-linux-5_1_4_20/drivermkinitrd_doc 脚本,来自/etc/modules.conflinux_binary.5_1_4/doc-linux-5_1_4_20/driver/initrd读取/etc/modules.conf/etc/modules.confinitrd文件,并查找有关 DOC 驱动程序主设备号的任何内容。默认情况下,mkinitrd_doc 将创建一个


镜像,该镜像加载主设备号为 100 的 DOC 模块。但是,通过我们对

/etc/modules.conf文件的修改,:

镜像将加载主设备号为 62 的模块。

5.6. 步骤 6:创建 initrd 镜像

  cp: cannot stat ./sbin/insmod.static.: No such file or directory
  cp: cannot stat ./dev/systty.: No such file or directory

运行 mkinitrd_doc 脚本,来自initrdlinux_binary.5_1_4/doc-linux-5_1_4_20/driver/./mkinitrd_doc这可能会给出类似于以下的警告消息,可以安全地忽略这些消息检查新创建的目录中。

镜像,initrdinitrd-2.4.18.img

,在

/boot


中。运行 mkinitrd_doc 脚本会生成此镜像。制作

镜像的原因是,提供的 M-Systems 驱动程序无法作为内置支持添加到内核中,这使得除了将其添加为可加载模块之外别无选择。如果我们想从 DOC 启动,内核应该在启动时知道如何访问 DOC,以便在 DOC 上的根文件系统中搜索 /sbin/init(根文件系统是使 Linux 系统启动所必需的)。

在 Linux 的启动顺序中,/sbin/init 是内核查找的文件(实际上是一个命令),以便启动各种服务,并最终为用户提供登录 shell。下图说明了问题

图 1. 为什么我们需要 initrd 镜像doc

5.7. 步骤 7:将 DOC 驱动程序插入到新内核中

fl : Flash disk driver for DiskOnChip
fl: DOC devices(s) found: 1
fl: _init:registed device at major 62
.
.
.
.

重启系统并启动到新创建的内核。

现在插入 doc 模块/etc/modules.confmodprobe docinitrd这将给出以下消息/etc/modules.conf要访问 DOC,请确保分配给节点的主设备号为 62。initrd如果分配了主设备号 100,请检查是否已成功修改


/etc/modules.conf

。如果未修改,则重复 第 5.5 节。然后您还必须重复 第 5.6 节,因为


镜像取决于

/etc/modules.conf/dev/msys/fla1。如果此文件中的 DOC 条目不正确,则

镜像将毫无用处。

5.8. 步骤 8:在 DiskOnChip 上创建文件系统执行 第 4.6 节。这是在 DOC 上创建分区所必需的。.

5.9. 步骤 9:在 DiskOnChip 上构建根文件系统在开始此步骤之前,请确保您尚未挂载/dev/msys/fla1到任何挂载点,因为此步骤将涉及重新格式化 DiskOnChip。此外,为了理解根文件系统的详细信息,请参阅 Linux 启动盘 HOWTO,网址为 http://www.tldp.org

我们将使用 mkdocimg 脚本,位于在开始此步骤之前,请确保您尚未挂载

linux_binary.5_1_4/doc-linux-5_1_4_20/build

我们还将使用/dev/msys/fla1redhat-7.1.files/mnt/doc目录,该目录位于同一目录中(即

mount -t auto /dev/msys/fla1 /mnt/doc-t auto /dev/msys/fla1 /mnt/doc

cd/mnt/doc

build

),其中包含将在 DOC 上创建的根文件系统中复制的文件列表。

cd linux_binary.5_1_4/doc-linux-5_1_4_20/buildvmlinuz-2.4.18./mkinitrd_doc./mkdocimg检查新创建的此步骤将需要几分钟才能完成。

现在挂载

  • /dev/msys/fla1

  • 分区到挂载点

/mnt/doc

并检查已创建的文件在开始此步骤之前,请确保您尚未挂载运行脚本后,将在 DOC 上创建以下目录

bin dev sbin etc lib usr home mnt tmp var boot/最重要的是 boot 目录。其中包含

boot.b/,它从lilo-22.3.2, 目录复制而来。从 DiskOnChip 启动时,需要此目录。, 除了这些文件之外,还有一些其他文件必须删除System.map-2.4.18

boot.3E00

这两个文件稍后由 LILO 创建。

redhat-7.1.files目录包含文件和目录列表,当我们使用 mkdocimg 脚本时将创建这些文件和目录。 此脚本不会创建在 DOC 上创建根文件系统所需的所有文件。因此,将 mkdocimg 脚本创建的目录替换为

redhat-7.1.files目录包含文件和目录列表,当我们使用 mkdocimg 脚本时将创建这些文件和目录。 主机

redhat-7.1.files目录包含文件和目录列表,当我们使用 mkdocimg 脚本时将创建这些文件和目录。 文件系统(当前运行的根文件系统)的目录。

redhat-7.1.files目录包含文件和目录列表,当我们使用 mkdocimg 脚本时将创建这些文件和目录。

cp目录包含文件和目录列表,当我们使用 mkdocimg 脚本时将创建这些文件和目录。 主机

cp目录包含文件和目录列表,当我们使用 mkdocimg 脚本时将创建这些文件和目录。 下的目录,例如

cp目录包含文件和目录列表,当我们使用 mkdocimg 脚本时将创建这些文件和目录。 etc

cp目录包含文件和目录列表,当我们使用 mkdocimg 脚本时将创建这些文件和目录。 sbin

redhat-7.1.files目录包含文件和目录列表,当我们使用 mkdocimg 脚本时将创建这些文件和目录。 bin

等等,包含许多无用的文件,理想情况下不应在为 DOC 构建根文件系统时复制。但是,由于我们尚未讨论哪些文件是必不可少的,哪些文件可以删除,因此我们建议应该复制目录的全部内容。我们知道这是一种笨拙的构建根文件系统的方式,并且会不必要地占用大量内存;请耐心等待,因为在下一节中,我们将解释如何在 DOC 上放置开发工具。然后,我们将从 DOC 的根文件系统中删除无用的文件。

如果您知道如何构建根文件系统,我们鼓励您仅复制必要的文件。


以下是我们用于修改根文件系统的命令集

rm -rf /mnt/doc/sbin /mnt/doc/etc /mnt/doc/lib /mnt/doc/dev

cp -a /sbin /mnt/doccp -a /etc /mnt/doc


cp -a /dev /mnt/doc

cp -a /lib /mnt/doc

rm -rf /mnt/doc/lib/modules

现在我们的文件系统已准备就绪。

此文件系统占用的总大小约为 35Mb。5.10. 步骤 10:使用 rdev 指定内核镜像的 DOC 根文件系统位置.

此步骤是必需的,以将 DOC 根文件系统的位置指定给我们步骤 3 中编译的内核。可以通过在引导加载程序配置文件中提供根文件系统位置的详细信息来避免此步骤,但我们在使内核在启动时定位根文件系统时遇到了一些问题,因此我们建议执行此命令

  1. 为 kernel-2.4.18 源代码创建一个软链接,名称为linux.

    当您解压文件时linux-2.4.18.tar.gz它将创建一个目录linux。所以我们需要重命名该目录linuxlinux-2.4.18在创建同名的软链接之前

    mvlinux linux-2.4.18

    ln-s linux-2.4.18 linux

    如果未执行上述步骤,构建可能会失败。

  2. 补丁文件linux_binary.5_1_4/doc-linux-5_1_4_20/lilo/lilo-22.3.2/common.h:

    M-Systems 提供的 lilo-22.3.2 源代码linux_binary.5_1_4.tgz存在错误,因为其中一个变量PAGE_SIZE未定义。我们需要按如下方式修补 LILO 源代码

    在以下文件中添加以下行common.h在行 "#include .lilo.h." 之后

    + #ifndef PAGE_SIZE
    + #define PAGE_SIZE 4096U
    + #endif
    #define 0_NACCESS 3
    

    其中 "+" 表示要添加的行。

  3. 通过使用 gcc --version 确保 gcc 版本为 2.95.3。

现在我们可以开始构建过程。运行

makeclean&& make

这将创建一个新的 LILO 可执行文件,linux_binary.5_1_4/doc-linux-5_1_4_20/lilo/lilo-22.3.2/lilo。将此 LILO 可执行文件复制到/sbin/lilo/mnt/doc/sbin/lilo:

cplinux_binary.5_1_4/doc-linux-5_1_4_20/lilo/lilo-22.3.2/lilo /sbin/lilo

cplinux_binary.5_1_4/doc-linux-5_1_4_20/lilo/lilo-22.3.2/lilo /mnt/doc/sbin/lilo


5.12. 步骤 12:将 boot.b 文件复制到 DOC 的 boot 目录

我们需要复制文件boot.blinux_binary.5_1_4/doc-linux-5_1_4_20/lilo//mnt/doc/boot.

该文件包含 LILO 引导加载程序的必要 *stage1* 和 *stage2*。


5.13. 步骤 13:修改 /etc/lilo.conf 文件

首先,删除现有的/etc/lilo.conf:

redhat-7.1.files目录包含文件和目录列表,当我们使用 mkdocimg 脚本时将创建这些文件和目录。 /etc/lilo.conf

现在创建一个新的/etc/lilo.conf,使用文本编辑器,并将以下行添加到其中

boot=/dev/msys/fla
compact
install=/boot/boot.b
map=/boot/System.map
disk=/dev/msys/fla
bios=0x80
prompt
delay=50
timeout=50
image=/boot/vmlinuz
label=linux
root=/dev/msys/fla1
initrd=/boot/initrd.img
read-only

根据添加到/etc/lilo.conf的上述行,需要为以下项创建软链接vmlinuz-2.4.18./mkinitrd_doc/mnt/doc/boot:

cd/mnt/doc/boot

ln-s vmlinuz-2.4.18 vmlinuz

ln-s initrd-2.4.18.img initrd.img

复制新创建的/etc/lilo.confmnt/doc/etc/lilo.conf.


5.14. 步骤 14:将新的 LILO 配置存储在 DiskOnChip 上

此步骤将在 DiskOnChip 的 MBR 中配置 LILO,从而使 DiskOnChip 可引导。

确保/dev/msys/fla1(DOC 的根文件系统分区) 已挂载到挂载点/mnt/doc.

执行以下命令以将 LILO 配置存储在 DOC 上

lilo-v -C /etc/lilo.conf -r /mnt/doc

/mnt/doc表示 BootLoader 将安装的位置,因此它安装在 DiskOnChip 上,因为/mnt/doc是配置 LILO 的 DOC 主分区的挂载点。

它将在 DOC 的 boot 目录中创建以下两个文件 (即/mnt/doc/boot):

  1. /dev/msys/fla1

  2. 分区到挂载点

现在您应该备份整个 DiskOnChip,以便在可能发生的致命错误损坏文件时轻松恢复

cd/home

tar-cvzf docimg.tgz /mnt/doc

这将创建一个名为以下名称的 DiskOnChip 所有内容的压缩副本docimg.tgz/home.


5.15. 步骤 15:修改 DiskOnChip 根文件系统的 etc/fstab

打开/mnt/doc/etc/fstab文件并编辑挂载点所在的行/。将该行更改为

/dev/msys/fla1  /  ext2  rw.noauto 0 1

5.16. 步骤 16:更新固件

此步骤是更新 DiskOnChip 固件所必需的。我们将使用来自以下位置的 dformat 实用程序linux_binary.5_1_4/dformat_5_1_4_37:

cd linux_binary.5_1_4/dformat_5_1_4_37/-W:D000 -S:doc514.exb -Y -NOFORMAT

Warning不要格式化!
 

并检查已创建的文件NOFORMAT标志很重要,否则它将重新格式化 DiskOnChip 设备,并且内容将丢失。

上述命令将导致 DiskOnChip 在没有任何其他可引导设备的情况下启动。因此,我们需要移除硬盘才能允许 DOC 启动。


5.17. 步骤 17:从 DiskOnChip 启动

查看您的 BIOS 手册,了解如何启用从 BIOS 扩展设备(即 DiskOnChip)启动。在我们的系统中,我们必须禁用硬盘和 CDROM,并将第一个可引导设备设置为 HDD-0。

在 BIOS 中进行必要的更改后,重新启动系统。

您将看到 LILO 菜单,按下 Enter 键后,Linux 将从 DiskOnChip 启动。


6. 在 DiskOnChip 上安装开发工具链

如果不需要在 DiskOnChip 上拥有开发环境,则可以忽略此部分。以下步骤将安装在 DiskOnChip 上开发和执行程序所需的必要库和工具。这将完全消除拥有主机系统和目标系统的概念,因为现在可以在目标系统本身上完成完整的应用程序开发。为此,我们将使用 uClibc,它是一个主要为嵌入式系统开发的 C 库。此外,由于我们在上一节中创建的根文件系统很大 (35 MB),我们将删除不必要的文件并使其更小,大约 11MB。

我们将使用来自 www.uclibc.org 的 Buildroot 包来替换 DOC 现有的庞大根文件系统,并安装必要的开发工具链,其中包括 uClibc 库、gcc、g++、make、ncurses、busybox、GNU tar、GNU grep 和 GNU coreutils。有关 Buildroot 的更多详细信息,请参阅 http://buildroot.uclinux.org/buildroot.htmlhttp://www.uclibc.org 网站提供了一个包含所有工具的预编译包,可以下载和使用。我们将使用可用的预编译包,即root_fs镜像。有关更多详细信息,请参阅 uClibc FAQ

按照以下步骤在您的 DOS 上使软件正常工作


6.1. 步骤 1:获取 root_fs_i386.ext2 的最新副本

下载root_fs_i386.ext2.tar.gzwww.uclibc.org/downloads/root_fs_i386.ext2.tar.gz 下载。

它的大小约为 22MB。这实际上会被解压缩为一个 100MB 大小的文件。

在以下位置解压文件/usr/src:

tar-xvzf root_fs_i386.ext2.tar.gz

这将创建一个文件root_fs_i386.ext2.

我们需要使用环回设备挂载此文件。执行以下步骤

mkdir /mnt/docroot_fs

mount -t auto /dev/msys/fla1 /mnt/doc-o loop root_fs_i386.ext2 root_fs

现在您可以访问文件的内容root_fs_i386.ext2通过root_fs目录中。root_fs目录包含许多构成根文件系统的目录,例如除了这些文件之外,还有一些其他文件必须删除, var, 目录复制而来。从 DiskOnChip 启动时,需要此目录。, opt, root, home, lilo-22.3.2, usr, lib, tmp, dev,以及proc.

并检查已创建的文件usrlib目录包含开发工具,如 gccg++


6.2. 步骤 2:替换 DiskOnChip 的根文件系统

替换除了这些文件之外,还有一些其他文件必须删除, var, 目录复制而来。从 DiskOnChip 启动时,需要此目录。, lilo-22.3.2, lib, usr, proc, mnt, homeoptDiskOnChip 的目录,替换为root_fs镜像的目录。

Warning不要替换 boot 和 dev!
 

并检查已创建的文件bootDiskOnChip 的 目录必须保持完整,因为它包含内核镜像,initrd镜像和 Map 文件,LILO 使用它们将内核加载到内存中。

并检查已创建的文件dev目录也不应被替换,因为它包含 DOC 的设备节点 (替换任务将需要 5-10 分钟。)


6.3. 步骤 3:修改 DiskOnChip 根文件系统的 etc/fstab

打开新替换的/mnt/doc/etc/fstab并编辑挂载点所在的行/。将该行更改为

/dev/msys/fla1  /  ext2  rw.noauto 0 1

6.4. 步骤 4:重启

从 DiskOnChip 重新启动并享受 uClibc 开发环境。

您将收到消息

Welcome to the Erik.s uClibc development environment.

整个根文件系统 + boot 目录 + 开发工具占用 84Mb 的空间。


7. 参考

除了引用的网站外,以下是我们发现有用的一些书籍和文档


A. dinfo 的输出

以下是由 dinfo 实用程序生成的 Linux 可引导 DiskOnChip 2000 TSOP 256MB (MD2202-D256) 内部结构的详细信息

图 A-1. dinfo 的输出

根据屏幕截图,我们的 DOC 使用 INFTL 转换层。


B. 许可证

本文档版权归 Rohit Agarwal 和 Vishnu Swaminathan 所有,(c) 2006 年。

允许复制、分发和/或修改本文档,但必须遵守 GNU 自由文档许可证 1.2 版或 Free Software Foundation 发布的任何更高版本的条款;不得包含不变章节、封面文字和封底文字。许可证副本可在 https://gnu.ac.cn/copyleft/fdl.html 获取。


C. 关于作者

Rohit Agarwal 获得了印度 IIIT-Bangalore 的信息技术硕士学位和印度 I.E.T. Lucknow 的计算机科学学士学位。他与他人合著了另一篇 HowTo "Libdc1394 Library support for IEEE1394 camera HowTo",由 TLDP 于 2006 年 1 月发布。访问他的 主页 了解更多详细信息。

Visnu Swaminathan 拥有美国北卡罗来纳州杜克大学的博士和硕士学位。他目前在印度西门子中央研究院工作

作者可以通过以下方式联系

rohdimp_24@rediffmail.com (rohit)

vishnu.swaminathan@siemens.com


D. 致谢

我感谢所有朋友为完成这项工作提供的支持。我将特别感谢 Vikram 和 Chinmaya 提出的宝贵建议。

最后,我想将本文档献给我的教授 S.Nagarajan 先生,他激励我为开源社区做出贡献

Rohit Agarwal