嵌入式开发教程之自己定制软盘上的Linux系统方案.pptx
- 文档编号:1562714
- 上传时间:2022-10-23
- 格式:PPTX
- 页数:23
- 大小:85.25KB
嵌入式开发教程之自己定制软盘上的Linux系统方案.pptx
《嵌入式开发教程之自己定制软盘上的Linux系统方案.pptx》由会员分享,可在线阅读,更多相关《嵌入式开发教程之自己定制软盘上的Linux系统方案.pptx(23页珍藏版)》请在冰豆网上搜索。
嵌入式开发教程之自己定制软盘上的Linux系统方案,引言一.前言二.Linux启动过程三.定制Grub引导程序四.定制Linux内核五.制定initrd六.定制根文件系统七.其他方法八.前景,嵌入式Linux是由一个几百KB的Linux内核和一个根据需要制定的文件系统所构成了,由于Linux是开放源代码的操作系统,所以在嵌入式领域有着非常广阔的前景,并已经广泛应用在许多手机、PDA、MP3播放器等许多电子产品中。
本文将介绍一种两张软盘上的Linux系统,它可以当作系统应急修复盘、路由器或防火墙等许多地方,通过对它的研究,也可以加深对嵌入式系统的理解。
引言,嵌入式Linux是由一个几百KB的Linux内核和一个根据需要制定的文件系统所构成了,由于Linux是开放源代码的操作系统,所以在嵌入式领域有着非常广阔的前景,并已经广泛应用在许多手机、PDA、MP3播放器等许多电子产品中。
本文将介绍一种两张软盘上的Linux系统,它可以当作系统应急修复盘、路由器或防火墙等许多地方,通过对它的研究,也可以加深对嵌入式系统的理解。
一.前言,所有的PC机在加电之后,BIOS会寻找到启动盘第一个扇区,并将其复制到RAM中来执行它,对于两种不同的启动方式,这个扇区通常含有两种不同的代码:
引导程序(比如Lilo或Grub等)的代码,引导程序会帮助定位内核的位置。
内核的代码,这通常是从软盘启动时使用的引导的方式。
对于前者,通常需要内核支持initrd。
如果是后者,使用的BootLoader就是arch/i386/boot/bootsect.S。
当内核被编译的时候,这段执行代码就被链接到内核image的最开始的地方。
这样很容易就能只要把内核复制到起始位置为第一个扇区的软盘上就能得到可自启动的软盘。
内核会初始化设备驱动和内部的数据结构,之后它会到一个特定的位置RamdiskWord来获得根文件系统的位置。
内核必须知道去那里寻找这个根文件系统,否则它将停机。
二.嵌入式开发教程:
Linux启动过程,在使用软盘启动的方式时,内核可以把一个压缩的文件系统释放到RAM中,称之为Ramdisk,这是一个内存区域,但内核会把它当作磁盘一样使用。
本文中介绍的例子使用Grub做为引导程序,并使用initrd来辅助Linux的启动。
两张软盘分别命名为bootldr盘和rootfs盘,在bootldr盘中内容为grub、内核、initrd,rootfs盘中是压缩过的根文件系统。
系统启动时bootldr盘的Grub定位并执行内核,然后内核解开initrd,并执行linuxrc文件,这个文件负责提示用户更换rootfs盘并将其中内容解压至内存中,然后执行刚刚解压的init继续启动过程。
嵌入式开发教程,插入一张软盘,然后将其格式化,然后加载到/mnt/floppy#mke2fs/dev/fd0#mount-text2/dev/fd0/mnt/floppy-oloop在其中创建/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=0timeout=10titleFloppyLinuxkernel(fd0)/bzImageroot=/dev/ram0initrd(fd0)/initrd.gz,三.嵌入式开发教程:
定制Grub引导程序,然后创建一个链接#ln-sgrub.confmenu.lst执行/sbin/grub-batch-device-map=/dev/nulldevice(fd0)/dev/fd0root(fd0)setup(fd0)quitEOF这样grub就被安装到bootldr盘上了。
嵌入式开发教程,由于软盘大小的限制,内核应尽可能只包含必要的一些支持,对于本文中的例子一定要选上initrd支持。
比如如果做为系统修复盘的话,必要的支持包括:
IDE,PCI,和需要的文件系统类型等等就可以了,而没有必要网络支持,当然,如果做为路由器或者防火墙的话,网络支持是必要的,而其他的这可相应的删除掉。
#makexconfig|menuconfig|config#makebzImage如果添加了模块的支持,还需要#makemodules之后就得到了内核镜像bzImage。
如果bzImage的大小超出了软盘的限制,就需要重新再来配置一下。
将编译好的bzImage放到bootldr盘的根目录下,如果把bzImage改了名字,要注意与grub.conf中的名字一致。
四.嵌入式开发教程:
定制Linux内核,在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提供了其中大部分。
bzip2,dd,cpio用来解压缩第二张软盘上的内容,chroot,pivot_root用来转换根目录。
编辑initrd/local/linuxrc文件:
#!
/bin/sh把sysroot目录mount到一块内存上,并建立tmpfs文件系统。
echoMountingnewrootfilsystem.mounttmpfs/sysroot-ttmpfscd/sysroot,五.嵌入式开发教程:
制定initrd,下面的readkey是一个很简单的程序,当启动过程执行到这里的时候暂停,等待换入第二章软盘,然后接受任意键输入继续执行启动过程。
这个小程序读者可以自己实现,要注意的是最好使用静态链接。
echoecho-enInserttheseconddiskandpressANYkey.readkey/dev/nullecho将第二章软盘上的内容解压到sysroot目录(内存)中。
echoLoadingroot-archivefromfloppy.ddif=/dev/fd0bs=1k|bzip2-d|cpio-idv,嵌入式开发教程,下面将initrd中的文件copy到sysroot/bin目录下,这样可以把根文件系统中一部分内容放到initrd(第一张软盘)中,因为软盘容量有限,当第一张软盘空间有剩余,而第二章软盘空间紧张的时候这会非常有用。
echoCopying:
forfileinbzip2chrootcpcpioechoreadkey;doecho-en;echo-n$filecp/bin/$file./bin/$filedone下面将/目录设定为当前目录,即sysroot,并执行刚刚从rootfs盘中解压出来的init。
嵌入式开发教程,echoechoPivoting/.pivot_root.mnt/initrdechoStartinginitprocess.execchroot./sbin/init/dev/console2&1echo-enSomethingwentwrong./bin/sh|/mnt/initrd/bin/sh当initrd所有必须的文件都放到bootldr/initrd/local目录下之后,就可以执行bootldr/initrd/mkinitrd.sh来创建initrd镜像文件。
mkinitrd.sh的内容为:
#!
/bin/shmount-text2/dev/fd0/mnt/floppyrm-f/mnt/floppy/initrd.gzrm-finitrd.gz,取4M大小的内存块格式化为ext2格式,并将其mount到bootldr/initrd/ramdisk上。
ddif=/dev/zeroof=/dev/ram9bs=1kcount=4096mke2fs/dev/ram9mount-text2/dev/ram9ramdisk/把local中的文件复制到ramdisk目录中,也就是那块内存中。
cp-Rlocal/*ramdisk/umountramdisk将内存中的内容压缩为initrd.gz,并复制到bootldr盘中ddif=/dev/ram9bs=1k|gzip-v9initrd.gzcpinitrd.gz/mnt/floppy/umount/mnt/floppy这样,bootldr盘就完成了。
一个根文件系统需要包含支持Linux系统运行的所有文件。
通常包括:
基本的文件系统结构基本的目录:
/dev,/proc,/bin,/sbin,/etc,/usr,/tmp等。
基本的工具:
sh,ls,cp,cd,mv等。
基本的配置文件:
rc,inittab,fstab等。
设备:
/dev/hd*,/dev/tty*,/dev/fd0,/dev/ram*,/dev/console等.基本的运行库。
Busybox和Tinylogin是在嵌入式系统上常用的工具包,它们包含了上面提到的常用的工具和目录结构等,而且经过重新改写后所生成的代码比普通的Linux系统上的工具要小的多。
六.定制根文件系统,编辑Busybox的Config.h文件,选择自己需要的工具。
修改Busybox和Tinylogin的Makefile文件,制定它们使用静态链接方式(DOSTATIC=true),这样就不需要在生成的系统中添加运行库了。
将编译好的Busybox和Tinylogin文件放到rootfs/local中。
在rootfs/local中在自己创建下面几个目录:
dev/,tmp/,etc/,proc/可以将系统中/dev下的设备复制到这个目录下,只需要复制必要的就可以了,例如:
#cp-dpR/dev/tty0-9/mnt/rootfs/dev#cp-dpR/dev/ram*/mnt/rootfs/dev但是要注意一定要包含必要的接各设备/dev/console,/dev/kmem,/dev/mem,/dev/tty,/dev/ram0,/dev/null等。
etc/目录下包含了目标系统运行所必须的配置文件,它包括的内容依赖与目标系统所要运行的程序。
最低限度,它包括下面几个文件:
inittab、rc、fstab、passwd、group、shadow、termcap等。
做为init进程的参数,inittab可以非常简单,仅需要包括下面几行即可:
:
sysinit:
/etc/rc:
askfirst:
/bin/logintty2:
askfirst:
/bin/logintty3:
askfirst:
/bin/logintty4:
askfirst:
/bin/login:
ctrlaltdel:
/sbin/reboot:
restart:
/sbin/init:
shutdown:
/bin/umount-a-r:
shutdown:
/sbin/swapoff-a,其中sysinit指明系统初始化脚本rc。
rc所包含内容也可以非常少:
#!
/bin/sh/bin/mount-av/bin/umount/mnt/initrd/bin/hostnamepapayafstab的内容为:
none/procprocdefaults00none/tmptmpfsdefaults00其他的配置文件可以从原来的系统中获得,然后修剪掉不必要的内容即可。
现在在/mnt/rootfs中已经包含了运行一个最低限度Linux系统所必须的所有文件和工具,下面需要将它们压缩成一个文件系统了。
插入rootfs软盘并执行bootldr/rootfs/mkrootfs.sh,#!
/bin/shrm-frootfs.cpio.bz2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 开发 教程 自己 定制 软盘 Linux 系统 方案
![提示](https://static.bdocx.com/images/bang_tan.gif)