嵌入式操作系统的实现(几年前的毕业设计之四)
2008-04-04 15:27
295 查看
第五章 嵌入式操作系统的实现
当系统在虚拟机中测试完毕,就可以将其移植到U盘上了。本系统是在U盘上实现的,如在其他载体上类同。
5.1 U盘的分区格式化
首先将U盘分区格式化。可用Linux下的fdisk分区工具进行分区,用mkfs工具进行格式化。本人就一块32MB的U盘,还要用来保存一些windows文件,故将其分为两个区,一个linux分区,一个windows分区。
#fdisk /dev/sdc
利用fdisk命令对U盘进行分区。
Disk /dev/sdc: 32 MB, 32768000 bytes
3 heads, 32 sectors/track, 666 cylinders
Units = cylinders of 96 * 512 = 49152 bytes
device Boot Start End Blocks Id System
/dev/sdc1 1 600 28784 83 Linux
/dev/sdc2 601 666 3168 5 Extended
/dev/sdc5 601 666 3152 4 FAT16 <32M
分区中sdc1是用来装linux系统的(28M)
sdc5是fat16格式,主要用来下载网页用。
#mkfs –t ext2 /dev/sdc1
#mkfs –t vfat /dev/sdc5
用mkfs对分区格式化。
5.2 U盘的初始化
如果在系统剪裁中进行了第四步剪裁,即压缩了根文件系统,将内核模拟成硬盘使用,将不必考虑U盘的初始化问题。如不进行第四步,虽然usb-storage模块已包括在内核,但是由于U盘的初始化过程比执行/sbin/init慢,导致内核已经启动完成了,优盘还没有完成初始化工作,因此根文件系统没有加载,这时执行/sbin/init命令肯定不成功。有两种方式能使内核等待3秒等待U盘初始化完毕再启动。
(1)利用busybox重新构造initrd.
在启动内核时加载initrd.img文件到内存中,利用initrd文件中的busybox的sleep命令,使内核等待3秒使U盘完成初始化工作,再执行/sbin/init指令。该方式需要自己构造initrd文件,而且会增大initrd文件(增大300kb)。
①建立initrd.img文件
#mkdir -p /mnt/initrd
#cd /tmp
#cp /usr/src/linux-2.6.0/drivers/scsi/BusLogic.ko /lib/modules/2.6.0/kernel/drivers/scsi
//mkinitrd需要BusLogic.ko
# mkinitrd /tmp/initrd.gz 2.6.0
②编译busybox
由于initrd中没有libc.so.6和ld-linux.so.2两个库文件,所以在编译busybox时要把选择不带共享库,因这里只用到它的sleep命令功能,所以编译选项中只选sleep选项。具体详见文件系统剪裁中busybox的使用方法。
③解压initrd.img文件,修改启动脚本linuxrc
#gunzip initrd.gz
#mount -o loop /tmp/initrd /mnt/initrd
#cp /sbin/busybox /mnt/initrd/bin
#cd /mnt/initrd/bin
#ln -s busybox sleep
#vi /mnt/initrd/linuxrc
加入如下内容:
echo 'wait 3 seconds.....'
/bin/sleep 3
④重新生成initrd.img文件
由于缺省建立的initrd文件比较大(为4MB),为了加快优盘的启动,必须减小它。具体操作如下:
#mkdir -p /mnt/initrdusb
#cd /tmp
#dd if =/dev/zero of= /tmp/initrdusb bs=1M count=1
#mke2fs -m 0 initrdusb
#mount -o loop /tmp/initrdusb /mnt/initrdusb
#cp -a /mnt/initrd/* /mnt/initrdusb
#cd /mnt/initrdusb
#rm ./bin/insmod //因不用加载模块,故不//insmod可节省200K空间。
#rm ./bin/modporbe //同上
#rm ./lib/BusLogic.ko // BusLogic.ko已编入内核,//故可删。
#cd /
# umount /mnt/initrd
# umount /mnt/initrdusb
# cd /tmp
# gzip -9 initrdusb
# cp initrdusb.gz /boot/initrd-2.6.0-usb.img
(2)通过更改linux2.6.0/init/do_mounts.c内核文件,再重新编译内核,使系统初始化时等3秒。该方式不会增大initrd文件,但需要修改内核文件。文件修改如下(+号后面为添加的内容):
[align=left]void __init mount_block_root(char *name, int flags)[/align]
[align=left]{[/align]
[align=left] char *fs_names = __getname();[/align]
[align=left] char *p;[/align]
[align=left] char b[BDEVNAME_SIZE];[/align]
[align=left] get_fs_names(fs_names);[/align]
+ printk("Please wait for 3 seconds....../n");
[align=left]+ __set_current_state(TASK_INTERRUPTIBLE);[/align]
+ schedule_timeout(HZ);
[align=left]+ __set_current_state(TASK_INTERRUPTIBLE);[/align]
[align=left]+ schedule_timeout(HZ);[/align]
[align=left]+ __set_current_state(TASK_INTERRUPTIBLE);[/align]
[align=left]+ schedule_timeout(HZ); [/align]
5.3 系统整合及测试
当完成U盘初始化initrd的构造后(也可以重新编译内核或采用ramdisk),就可以在U盘上整合系统了。
(1) 将测试好的系统打包
[align=left]#mount /dev/sdb1 /mnt/sdb1[/align]
[align=left]#cd /mnt/sdb1[/align]
#tar cvzf /mnt/hgfs/windows/redhat9-usb-ok.tar.gz *
(2) 将打包好的系统恢复到U盘上(被系统识为sdd)
[align=left]#mkdir p /mnt/sdd1[/align]
[align=left]#mount /dev/sdd1 /mnt/sdd1[/align]
[align=left]#cd /mnt/sdd1[/align]
#tar zxvf /mnt/hgfs/windows/redhat9-usb-ok.tar.gz
(3) 修改U盘系统中的grub.conf文件
[align=left]改为:[/align]
[align=left]default=0[/align]
[align=left]timeout=10[/align]
[align=left]splashimage=(hd0,0)/boot/grub/splash.xpm.gz[/align]
[align=left]title Red Hat Linux (2.6.0)[/align]
[align=left] root (hd0,0)[/align]
kernel /boot/vmlinuz-2.6.0 ro root=LABEL=/
[align=left] initrd /boot/initrd-2.6.0.img[/align]
(4) 增加根目录标识
[align=left]#e2label /dev/sdc1 /[/align]
[align=left]如不进行这步,系统将无法启动。[/align]
[align=left]mount: error 6 mounting ext2[/align]
pivotroot pivot_root(/sysroot,/sysroot/initrd) failed:2
[align=left]umount /initrd/proc[/align]
[align=left]的错误提示。[/align]
(5) 安装grub
[align=left]因为系统最终将在机器上运行,不是在虚拟机上运行,故安装grub应在真实的linux下进行。而且虚拟机上的BOIS不支持从U盘启动。在机器上启动Redhat9.0[/align]
[align=left]#grub[/align]
[align=left]grub>root (hd1,0)[/align]
[align=left]grub>setup (hd1)[/align]
(6) 设置BIOS
[align=left]在BIOS中设置[/align]
[align=left]Advanced BIOS Features[/align]
[align=left] First Boot Device (USB-HDD)[/align]
[align=left]First Boot Device (HDD-0)[/align]
[align=left]这需要你的主板支持从U盘启动。[/align]
[align=left]最后插入U盘,重新启动系统。测试系统的网络功能和安全服务是否正常运转。[/align]
[align=center]本章小结[/align]
本章主要介绍了嵌入式操作系统如何在U盘上实现的,其中详细介绍了如何实现U盘的初始化以使内核在U盘上能正常启动,简单说明了在整合系统时要注意的几个要点。
当系统在虚拟机中测试完毕,就可以将其移植到U盘上了。本系统是在U盘上实现的,如在其他载体上类同。
5.1 U盘的分区格式化
首先将U盘分区格式化。可用Linux下的fdisk分区工具进行分区,用mkfs工具进行格式化。本人就一块32MB的U盘,还要用来保存一些windows文件,故将其分为两个区,一个linux分区,一个windows分区。
#fdisk /dev/sdc
利用fdisk命令对U盘进行分区。
Disk /dev/sdc: 32 MB, 32768000 bytes
3 heads, 32 sectors/track, 666 cylinders
Units = cylinders of 96 * 512 = 49152 bytes
device Boot Start End Blocks Id System
/dev/sdc1 1 600 28784 83 Linux
/dev/sdc2 601 666 3168 5 Extended
/dev/sdc5 601 666 3152 4 FAT16 <32M
分区中sdc1是用来装linux系统的(28M)
sdc5是fat16格式,主要用来下载网页用。
#mkfs –t ext2 /dev/sdc1
#mkfs –t vfat /dev/sdc5
用mkfs对分区格式化。
5.2 U盘的初始化
如果在系统剪裁中进行了第四步剪裁,即压缩了根文件系统,将内核模拟成硬盘使用,将不必考虑U盘的初始化问题。如不进行第四步,虽然usb-storage模块已包括在内核,但是由于U盘的初始化过程比执行/sbin/init慢,导致内核已经启动完成了,优盘还没有完成初始化工作,因此根文件系统没有加载,这时执行/sbin/init命令肯定不成功。有两种方式能使内核等待3秒等待U盘初始化完毕再启动。
(1)利用busybox重新构造initrd.
在启动内核时加载initrd.img文件到内存中,利用initrd文件中的busybox的sleep命令,使内核等待3秒使U盘完成初始化工作,再执行/sbin/init指令。该方式需要自己构造initrd文件,而且会增大initrd文件(增大300kb)。
①建立initrd.img文件
#mkdir -p /mnt/initrd
#cd /tmp
#cp /usr/src/linux-2.6.0/drivers/scsi/BusLogic.ko /lib/modules/2.6.0/kernel/drivers/scsi
//mkinitrd需要BusLogic.ko
# mkinitrd /tmp/initrd.gz 2.6.0
②编译busybox
由于initrd中没有libc.so.6和ld-linux.so.2两个库文件,所以在编译busybox时要把选择不带共享库,因这里只用到它的sleep命令功能,所以编译选项中只选sleep选项。具体详见文件系统剪裁中busybox的使用方法。
③解压initrd.img文件,修改启动脚本linuxrc
#gunzip initrd.gz
#mount -o loop /tmp/initrd /mnt/initrd
#cp /sbin/busybox /mnt/initrd/bin
#cd /mnt/initrd/bin
#ln -s busybox sleep
#vi /mnt/initrd/linuxrc
加入如下内容:
echo 'wait 3 seconds.....'
/bin/sleep 3
④重新生成initrd.img文件
由于缺省建立的initrd文件比较大(为4MB),为了加快优盘的启动,必须减小它。具体操作如下:
#mkdir -p /mnt/initrdusb
#cd /tmp
#dd if =/dev/zero of= /tmp/initrdusb bs=1M count=1
#mke2fs -m 0 initrdusb
#mount -o loop /tmp/initrdusb /mnt/initrdusb
#cp -a /mnt/initrd/* /mnt/initrdusb
#cd /mnt/initrdusb
#rm ./bin/insmod //因不用加载模块,故不//insmod可节省200K空间。
#rm ./bin/modporbe //同上
#rm ./lib/BusLogic.ko // BusLogic.ko已编入内核,//故可删。
#cd /
# umount /mnt/initrd
# umount /mnt/initrdusb
# cd /tmp
# gzip -9 initrdusb
# cp initrdusb.gz /boot/initrd-2.6.0-usb.img
(2)通过更改linux2.6.0/init/do_mounts.c内核文件,再重新编译内核,使系统初始化时等3秒。该方式不会增大initrd文件,但需要修改内核文件。文件修改如下(+号后面为添加的内容):
[align=left]void __init mount_block_root(char *name, int flags)[/align]
[align=left]{[/align]
[align=left] char *fs_names = __getname();[/align]
[align=left] char *p;[/align]
[align=left] char b[BDEVNAME_SIZE];[/align]
[align=left] get_fs_names(fs_names);[/align]
+ printk("Please wait for 3 seconds....../n");
[align=left]+ __set_current_state(TASK_INTERRUPTIBLE);[/align]
+ schedule_timeout(HZ);
[align=left]+ __set_current_state(TASK_INTERRUPTIBLE);[/align]
[align=left]+ schedule_timeout(HZ);[/align]
[align=left]+ __set_current_state(TASK_INTERRUPTIBLE);[/align]
[align=left]+ schedule_timeout(HZ); [/align]
5.3 系统整合及测试
当完成U盘初始化initrd的构造后(也可以重新编译内核或采用ramdisk),就可以在U盘上整合系统了。
(1) 将测试好的系统打包
[align=left]#mount /dev/sdb1 /mnt/sdb1[/align]
[align=left]#cd /mnt/sdb1[/align]
#tar cvzf /mnt/hgfs/windows/redhat9-usb-ok.tar.gz *
(2) 将打包好的系统恢复到U盘上(被系统识为sdd)
[align=left]#mkdir p /mnt/sdd1[/align]
[align=left]#mount /dev/sdd1 /mnt/sdd1[/align]
[align=left]#cd /mnt/sdd1[/align]
#tar zxvf /mnt/hgfs/windows/redhat9-usb-ok.tar.gz
(3) 修改U盘系统中的grub.conf文件
[align=left]改为:[/align]
[align=left]default=0[/align]
[align=left]timeout=10[/align]
[align=left]splashimage=(hd0,0)/boot/grub/splash.xpm.gz[/align]
[align=left]title Red Hat Linux (2.6.0)[/align]
[align=left] root (hd0,0)[/align]
kernel /boot/vmlinuz-2.6.0 ro root=LABEL=/
[align=left] initrd /boot/initrd-2.6.0.img[/align]
(4) 增加根目录标识
[align=left]#e2label /dev/sdc1 /[/align]
[align=left]如不进行这步,系统将无法启动。[/align]
[align=left]mount: error 6 mounting ext2[/align]
pivotroot pivot_root(/sysroot,/sysroot/initrd) failed:2
[align=left]umount /initrd/proc[/align]
[align=left]的错误提示。[/align]
(5) 安装grub
[align=left]因为系统最终将在机器上运行,不是在虚拟机上运行,故安装grub应在真实的linux下进行。而且虚拟机上的BOIS不支持从U盘启动。在机器上启动Redhat9.0[/align]
[align=left]#grub[/align]
[align=left]grub>root (hd1,0)[/align]
[align=left]grub>setup (hd1)[/align]
(6) 设置BIOS
[align=left]在BIOS中设置[/align]
[align=left]Advanced BIOS Features[/align]
[align=left] First Boot Device (USB-HDD)[/align]
[align=left]First Boot Device (HDD-0)[/align]
[align=left]这需要你的主板支持从U盘启动。[/align]
[align=left]最后插入U盘,重新启动系统。测试系统的网络功能和安全服务是否正常运转。[/align]
[align=center]本章小结[/align]
本章主要介绍了嵌入式操作系统如何在U盘上实现的,其中详细介绍了如何实现U盘的初始化以使内核在U盘上能正常启动,简单说明了在整合系统时要注意的几个要点。
相关文章推荐
- 嵌入式防火墙的实现(几年前的毕业设计之五)
- [连载]嵌入式实时操作系统TINIUX设计与实现 - 启航
- [连载]嵌入式实时操作系统TINIUX设计与实现 – 准备
- 嵌入式视频监控毕业设计过程中保存的标签。。。嵌入式系统视频信号接收、显示 与存储程序设计与实现
- [连载]嵌入式实时操作系统TINIUX设计与实现 – 为内存管理“画个轮廓”
- [连载]嵌入式实时操作系统TINIUX设计与实现 – 内存管理之实现篇
- 操作系统设计与实现 第一章 引言(三)
- Linux嵌入式实时操作系统开发与设计(二)
- Linux嵌入式实时操作系统开发与设计(三)
- 基于DSP/BIOS和NDK的嵌入式网络操作系统设计方案
- 文件系统的设计与实现(操作系统课程设计)
- 资源分享:嵌入式stm32项目开发 心率检测仪的设计与实现
- 嵌入式设计模式:有限状态自动机的C语言实现
- 毕业设计论文撰写指南(07)—— 第五章 ***系统详细设计与实现
- 我的毕业设计论文——利用HOOK技术实现应用层网络抓包
- 嵌入式实战项目:基于嵌入式linux花卉大棚温湿度监测与调节系统的设计与实现
- ParalleX OS 设计与实现 Parallex 操作系统设计方向讨论
- 嵌入式 环形缓冲区的设计与实现
- (转)嵌入式Linux系统BSP的设计与实现
- Android 操作系统的设计与实现--框架