当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]把Linux放进软盘里笔者的同事最近在测试AMD 64bit CPU时,遇到这样一个问题:当插入含有AMD官方软件Maxpower64的软盘后,系统提示不能引导。关于这个软件AMD公司提供的信息

把Linux放进软盘里

笔者的同事最近在测试AMD 64bit CPU时,遇到这样一个问题:当插入含有AMD官方软件Maxpower64的软盘后,系统提示不能引导。关于这个软件AMD公司提供的信息很少,只知道它必须在linux环境下执行。所以笔者打开软盘,发现里面只有两个文件:syslinux.cfg,Maxpower64,这样问题就明确了,靠这两个文件是无法引导进入linux系统的,更不用说执行Maxpower64。下面我就介绍一下如何修复这个软件,使得它可以正常使用。

我们首先要得到一张可以引导进入linux环境的软盘,这种软盘必须由两部分组成,即内核和根文件系统。我们首先制作一个内核。

内核的编译要把内核部分放到一张1.44MB的软盘上去,通常要对内核进行压缩,压缩内核的最好方法是进行重新编译内核,将一些不必要的支持去掉,如对网络和其它周边设备的支持,重要的一点是记住内核必须支持RAMDISK及ext2,否则系统不能正常引导。编译之前请确认您是以root的身份在进行操作,否则会返回Permission Denied的提示。

首先要到合适的编译路径,一般路径都在/usr/src/Linux,RH9的路径是在/usr/src/Linux-2.4,只有在这个路径你的命令才会生效。否则会显示

make: *** No rule to make target 'config' , stop的错误提示.

如果你以前编译过内核,那应当先执行#make mrproper 这个命令,它可以删除以前的建构的痕迹。如果你没有编译过,可以不执行它。

接下来执行#make menuconfig 开始配置内核,把你认为不需要的东西都不要编译到内核,比如业余电台,csi,I20,IrDA,isdn,bluetooth.最后保存为.config后退出。

再接下来就依次执行以下命令:

#make dep (设置依赖关系)

#make clean (准备要建构的源码树)

#make bzImage (建构内核 )

#make modules ( 配置模块)

#make modules_install (使用配置的模块)

#make install (把新的内核和相关文件复制到正确的目录)

执行到这里,在/boot下会看到名字为vmlinuz-2.4.22custom的文件。这就是我们编译得到的内核。如果它的size大于1.44M,那就得重新编译,再去掉一些不需要的东西,直到内核小于1.44M,为了便于记忆,我们不妨将它重新命名为newkernel,接下来我们紧接着制作根文件系统。

根文件系统的制作

制作根文件系统前,我们先要解决一个问题:因为一个根文件系统要实现基本的功能,必须包括一些常用工具:如:sh,ls,cd,cat…… 但是常用工具会占用很多空间,要是用原来系统中的这些命令,就是全部用静态编译,不是用动态连接库,大概也要有2MB~3MB,放不进软盘。因此我们我们的解决的方案是使用BusyBox工具。BusyBox 它包含了七十多种 Linux 上标准的工具程序,只需要的磁盘空间仅仅几百 k 。在嵌入式 系统上常用到它 (例如 Linux Router Project 和 Debian boot floppy就使用到它)

建立 BusyBox

首先我们从官方网站上下载BusyBox的最新版本:busybox-1.00-rc3.tar.gz并且解开

#tar zxvf busybox-1.00-rc3.tar.gz

为了压缩空间,我们采用静态编译,修改 Makefile 中的 DOSTATIC 参数为true

DOSTATIC=true

然后修改 BusyBox 中的 init.c,设定系统要执行的第一个程序为: /etc/rc.d/rc.sysinit

#define INIT_SRCIPT \"/etc/rc.d/rc.sysinit\"

开始编译BusyBox

#make

#make install

到这一步我们就得到了可执行命令busybox

解决了这个问题后,我们可以开始制作根文件系统

制作根文件系统

首先为根文件系统建一个目录叫做 floppy-Linux,然后进入 floppy-Linux 目录内

# mkdir floppy-Linux

# cd floppy-Linux

然后为 root filesystem 建立一些标准的目录

# mkdir dev etc etc/rc.d bin proc mnt tmp var

# chmod 755 dev etc etc/rc.d bin mnt tmp var

# chmod 555 proc

# ln -s sbin bin

然后进入 /dev 目录下建立根文件系统必须的一些设备文件。

建立一般终端机设备

# mknod tty c 5 0

# mkdir console c 5 1

# chmod 666 tty console

建立 VGA Display 虚拟终端机设备

# mknod tty0 c 4 0

# chmod 666 tty0

建立 RAM disk 设备

# mknod ram0 b 1 0

# chmod 600 ram0

建立 floppy 设备

# mknod fd0 b 2

# chmod 600 fd0

建立 null 设备

# mknod null c 1 3

# chmod 666 null

到这里我们就有了一个初步的小型根文件系统,但是还需要配置一些有关的 shell script来完善它。

编辑有关的 shell script

首先进入到 /floppy-Linux/etc/ 这个目录下编辑 inittab,rc.d/rc.sysinit,fstab这三个文件 ,内容分别如下:

inittab

::sysinit:/etc/rc.d/rc.sysinit

::askfirst:/bin/sh

rc.sysinit

#!/bin/sh

mount –a

fstab

proc /proc proc defaults 0 0

然后修改inittab,rc.sysinit,fstab这三个文件的权限

# chmod 644 inittab

# chmod 755 rc.sysinit

# chmod 644 fstab

配置完shell script后,我们注意到这些shell script会使用一些 /bin目录下的命令,但是我们的/bin目录下是空的。现在我们就使用BusyBox来制作这些常用命令。

使用BusyBox制作常用命令

将busybox 复制到软盘的/bin目录下,并且改名为init

# cp busybox /floppy-Linux/bin/init

然后创建常用命令的link,具体的工作原理请参阅busybox的官方说明。

# ln -s init ls

# ln -s init cp

# ln -s init mount

# ln -s init umount

# ln -s init more

# ln -s init ps

# ln -s init sh

现在我们就有了所需的常用命令。

到这里我们的根文件系统就制作完成了,但是和内核一样,要把根文件系统部分放到一张1.44MB的软盘上去,也要进行压缩,下面我们就着手压缩它。[!--empirenews.page--]

压缩根文件系统

一般我们会采取 RAM Disk 的方式实现。简单的来说就是将准备好的根文件系压缩成为Ramdisk的镜像文件,当用软盘启动时,再把镜像文件解压到内存中,形成一个虚拟盘(RAMDISK),通过RAMDISK控制系统启动。

我们现在制作Ramdisk的镜像文件

# dd if=/dev/zero of=/tmp/tmp_loop bs=1k count=2048

# losetup /dev/loop0 /tmp/tmp_loop

# mke2fs -m 0 /dev/loop0

# mount -t ext2 /dev/loop0 /mnt

# cp -a /floppy-Linux /mnt

# umount /mnt

# losetup -d /dev/loop0

# dd if=/tmp/tmp_loop | gzip -9 > /tmp/Image.gz

# rm -f /tmp/tmp_loop

# sync

这样我们就得到了压缩过的根文件系统也就是Ramdisk的镜像文件Image.gz。

目前为止我们已经有了内核和压缩过的根文件系统.现在剩下的就是把它们整合在一张软盘里面。

整合核心和根文件系统

根据引导的方式不同,有以下三种整合方案:

用grub引导

依次执行:

# mke2fs /dev/fd0

# mount /dev/fd0 /mnt/floppy

# mkdir /mnt/floppy/boot

# mkdir /mnt/floppy/boot/grub

# cp /boot/grub/stage1 /mnt/floppy/boot/grub

# cp /boot/grub/stage2 /mnt/floppy/boot/grub

#grub

在 grub> 提示符处,输入:

grub> root (fd0)

grub> setup (fd0)

grub> quit

#cp newkernel /mnt/floppy/boot

#cp Image.gz /mnt/floppy/boot

#cp /boot/grub/grub.conf /mnt/floppy/boot/grub

编辑grub.conf, 内容如下:

timeout 10

default 0

title My little Linux

root (fd0)

kernel /boot/newkernel ro root=/dev/ram0

initrd /boot/ Image.gz

然后制作grub.conf的link文件menu.lst

#ln -s /mnt/floppy/boot/grub/grub.conf /mnt/floppy/boot/grub/menu.lst

#umount /mnt/floppy

整合完成!

用sysLinux引导

依次执行:

# mkdosfs /dev/fd0

# sysLinux /dev/fd0

编辑 sysLinux 的组态档 sysLinux.cfg,内容如下

TIMEOUT 20

DEFAULT Linux

LABEL Linux

KERNEL newkernel

APPEND root=/dev/ram0 ro initrd=Image.gz

然后将 sysLinux.cfg、newkernel、Image.gz 拷贝到磁盘中

# mount /dev/fd0 /mnt/floppy

# cp newkernel /mnt/floppy

# cp Image.gz /mnt/floppy

# cp sysLinux.cfg /mnt/floppy

#umount /mnt/floppy

整合完成!

直接引导

依次执行:

# dd if=newkernel of=/dev/fd0 bs=1k

252+1 records in

252+1 records out

在这个例子中,dd 写入了 252 个完整记录(records) + 1个partial record ,所以内核占用了 253 个软盘的 blocks 。这个数字称为 KERNEL_BLOCKS ,请记得它,这个数字还要使用.

#rdev /dev/fd0 /dev/fd0

#rdev -R /dev/fd0 0

#rdev -r /dev/fd0 VALUE

在这里这个VALUE的值应为16384+ KERNEL_BLOCKS(上一步dd 命令所产生的数值)

所以本例应为:

#rdev -r /dev/fd0 16637

#dd if= root system file of=/dev/fd0 bs=1k seek=KERNEL_BLOCKS

在这里这个KERNEL_BLOCKS就是上一步dd 命令所产生的数值

所以本例应为:dd if= Image.gz of=/dev/fd0 bs=1k seek=253

整合完成!

现在我们就拥有了一张可以自激活到Linux环境的软盘。对于本例来讲,想要执行AMD官方测试软件Maxpower64,只要将Maxpower64这个可执行文件复制到 /bin目录就可以了。我们可以在“使用BusyBox制作常用命令“这个阶段来完成它.

# cp Maxpower64 /floppy-Linux/bin

这张软盘会自激活到linux环境下,并显示“#”命令提示符,我们只要执行Maxpower64就可以了。

#/bin/Maxpower64

如果希望系统一开机就直接执行Maxpower64,则需要在“编辑有关的 shell script”这个阶段编辑rc.sysinit文件为:

#!/bin/sh

mount –a

/bin/Maxpower64

这样软盘引导进入linux后会直接执行Maxpower64而不再显示“#”命令提示符。

小结

除了以上的方法,我们也可以通过引导器给内核传递参数来实现内核和根文件系统分别放置在不同的软盘上,这样内核就可以再大一些,支持的功能也就越多。总之制作一张包含小型linux的软盘并不困难,关键是要细心和耐心,此外最好能够了解BusyBox和RAMDISK的工作原理,这对于更好的完善系统是有很大帮助的。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭