微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 软盘上的Linux系统方案

软盘上的Linux系统方案

时间:05-20 来源:互联网 点击:

本文将介绍一种两张软盘上的Linux系统,它可以当作系统应急修复盘、路由器或防火墙等许多地方,通过对它的研究,也可以加深对嵌入式系统的理解。
  
  一.前言

  嵌入式Linux是由一个几百KB的Linux内核和一个根据需要制定的文件系统所构成了, 由于Linux是开放源代码的操作系统,所以在嵌入式领域有着非常广阔的前景,并已经广泛应用在许多手机、PDA、MP3播放器等许多电子产品中。本文将介绍一种两张软盘上的Linux系统,它可以当作系统应急修复盘、路由器或防火墙等许多地方,通过对它的研究,也可以加深对嵌入式系统的理解。
  
  二.Linux启动过程

  所有的PC机在加电之后,BIOS会寻找到启动盘第一个扇区,并将其复制到RAM中来执行它,对于两种不同的启动方式,这个扇区通常含有两种不同的代码:引导程序(比如Lilo或Grub等)的代码,引导程序会帮助定位内核的位置。内核的代码,这通常是从软盘启动时使用的引导的方式。对于前者,通常需要内核支持initrd。如果是后者,使用的Boot Loader就是arch/i386/boot/bootsect.S。当内核被编译的时候,这段执行代码就被链接到内核image的最开始的地方。这样很容易就能只要把内核复制到起始位置为第一个扇区的软盘上就能得到可自启动的软盘。内核会初始化设备驱动和内部的数据结构,之后它会到一个特定的位置DDRamdisk Word来获得根文件系统的位置。内核必须知道去那里寻找这个根文件系统,否则它将停机。
  
  在使用软盘启动的方式时,内核可以把一个压缩的文件系统释放到RAM中,称之为Ramdisk,这是一个内存区域,但内核会把它当作磁盘一样使用。
  
  本文中介绍的例子使用Grub做为引导程序,并使用initrd来辅助Linux的启动。两张软盘分别命名为bootldr盘和rootfs盘,在bootldr盘中内容为grub、内核、initrd,rootfs盘中是压缩过的根文件系统。系统启动时bootldr盘的Grub定位并执行内核,然后内核解开initrd,并执行linuxrc文件,这个文件负责提示用户更换rootfs盘并将其中内容解压至内存中,然后执行刚刚解压的init继续启动过程。
  
  为了方便理解这个例子,先介绍目录结构如下:
  
  /home/papaya
  ├─bootldr/
  │ ├─grub/
  │ ├─kernel/
  │ │ ├─images/
  │ │ └─linux-2.4.21/
  │ └─initrd/
  │   ├─mkinitrd.sh
  │   ├─local/
  │   └─ramdisk/
  ├─rootfs/
  │ ├─mkrootfs.sh
  │ ├─ramdisk/
  │ └─local/
  └─lib/

  三.定制Grub引导程序

  插入一张软盘,然后将其格式化,然后加载到/mnt/floppy
  
  #mke2fs /dev/fd0
  #mount -t ext2 /dev/fd0 /mnt/floppy -o loop
  在其中创建/boot/grub目录
  #mkdir -p /mnt/floppy/boot/grub
  
  将系统中/boot/grub下的device.map, stage1, stage2 复制到/mnt/floppy/boot/grub中,然后在/mnt/floppy/boot/grub目录下创建grub.conf文件:
  
  default=0
  timeout=10
  title Floppy Linux
  kernel (fd0)/bzImage root=/dev/ram0
  initrd (fd0)/initrd.gz
  
  然后创建一个链接
  
  #ln -s grub.conf menu.lst
  
  执行
  
  /sbin/grub --batch --device-map=/dev/null   device (fd0) /dev/fd0
  root (fd0)
  setup (fd0)
  quit
  EOF
  
  这样grub就被安装到bootldr盘上了。
四.定制Linux内核

  由于软盘大小的限制,内核应尽可能只包含必要的一些支持,对于本文中的例子一定要选上initrd支持。比如如果做为系统修复盘的话,必要的支持包括:IDE,PCI,和需要的文件系统类型等等就可以了,而没有必要网络支持,当然,如果做为路由器或者防火墙的话,网络支持是必要的,而其他的这可相应的删除掉。
  
  #make [xconfig | menuconfig | config]
  #make bzImage
  
  如果添加了模块的支持,还需要
  
  #make modules
  
  之后就得到了内核镜像bzImage。如果bzImage的大小超出了软盘的限制,就需要重新再来配置一下。将编译好的bzImage放到bootldr盘的根目录下,如果把bzImage改了名字,要注意与grub.conf中的名字一致。
  
  五.制定initrd

在initrd/local目录下建立bin, dev, etc, lib, proc, sysroot, usr目录。其中dev目录下包括必要的设备文件,比如tty, ram, console等等, bin中必要的可执行文件有bzip2, chroot, cp, cpio, dd, echo, mount, pivot_root, readkey, sh, test等。Busybox提供了其中大部分。 bz

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top