Linux内核配置编译与文件系统构建要点.docx
《Linux内核配置编译与文件系统构建要点.docx》由会员分享,可在线阅读,更多相关《Linux内核配置编译与文件系统构建要点.docx(10页珍藏版)》请在冰豆网上搜索。
Linux内核配置编译与文件系统构建要点
Linux内核配置编译与文件系统构建
南京大学
黄开成101180046
2012.11.11
一:
实验目的
1.了解嵌入式系统的开发环境,内核与文件系统的下载和启动;
2.了解Linux内核源代码的目录结构及各自目录的相关内容,了解Linux内核各配置选项内容和作用,掌握Linux内核的编译过程;
3.了解嵌入式操作系统中文件系统的类型和应用、了解JFFS2文件系统的优点及其在嵌入式系统中的作用、掌握利用Busybox软件制作嵌入式文件系统的方法,并且掌握嵌入式Linux文件系统的挂载过程。
二:
实验环境说明
1.PC机使用openSUSE14Enterprise系统。
2.开发板使用深圳市武耀博德信息技术有限公司生产的基于Inter的PXA270处理器的多功能嵌入式开发平台EELIOD。
3.PC机通过RS-232串口与开发板相连,在PC机终端上运行minicom程序构造一个开发板上的终端,用于对开发板的控制。
4.PC机与开发板通过ethernet网络相连接,并可在开发板上通过加载网络文件系统(NFS)与PC机通信。
5.Bootloader可以通过tftp协议从PC机上下载内核镜像和根文件系统镜像。
下载目录为/tftpboot。
6.用于开发板的Linux内核源码为linux-2.4.21-51Board_EDR,busybox版本为busybox-1.00-pre5。
7.交叉编译器的路径为/usr/local/arm-linux/bin/arm-linux。
三:
实验操作过程和分析记录
1.嵌入式系统的开发环境和开发流程:
1.1启动minicom和开发板
在PC机上打开一个终端,输入:
>minicom
按Ctrl+A-o进入minicom的configuration界面。
对串行通信接口进行配置,串口设置为:
/dev/ttyS0(串口线接在PC机的串口1上)、bps=115200、8位数据、无校验、无流控制。
然后打开开发板电源,看到屏幕有反应之后,按任意键进入配置界面,如果长时间没有按下任何键,bootloader将会自动从flash中读取内核和根文件系统并启动开发板上的Linux系统。
分析:
嵌入式系统中,通常并没有像PC机中BIOS那样的固件程序,因此整个系统的加载启动任务完全由bootloader来完成。
bootloader的主要作用是:
初始化硬件设备;建立内存空间的映射图;完成内核的加载,为内核设置启动参数。
按0进入命令行模式,出现51board>,可以设置开发板和PC机的IP地址:
51board>setmyipaddr192.168.208.133(设置开发板的IP地址)
51board>setdestipaddr192.168.208.33(设置PC机的IP地址)
注意IP地址的设置:
使其处于同一网段,并且避免和其他系统的IP发生冲突。
通过bootloader的主菜单可以完成很多功能,3——下载内核,4——将内核烧进flash,5——下载文件系统,6——将文件系统烧进flash,7——启动嵌入式操作系统等。
51board>tftpzImagekernel(下载内核)
51board>tftpramdisk.gzramdisk(下载文件系统)
51board>boot(启动系统,进入目标机终端)
1.2NFS服务器架设
NFS是在不同机器不同操作系统之间进行网络共享文件的服务系统。
在嵌入式系统中目标机可以将宿主机的共享文档挂载在自己的系统中,从而,目标机使用宿主机上的远端文件就像是使用自己本地的文件一样,有利于嵌入式开发。
#ifconfigeth0192.168.208.133(配置网络)
上面的eth0为接口名,eth0表示第一个以太网接口,如果使用其他网络接口,应做相应修改。
#mount192.168.208.133:
/exp/test-onolock-oproto=tcp(将主机上的exp目录挂载到目标机的test目录上)
此时可以对主机上/exp目录下的文件进行操作,就像已经在制作的文件系统里面一样,便于以后开发程序的调试,不必每次都重新烧写文件系统。
1.3编写应用程序并在目标机上运行
编写简单的c程序hello.c:
#include
intmain()
{printf(“hello,world\n”);
return0;
}
然后在主机上用交叉编译器进行编译。
>/usr/local/arm-linux/bin/arm-linux-gcc-ohellohello.c
此外也可以设置好PATH环境变量以方便使用。
>exportPATH=/usr/local/arm-linux/bin:
$PATH
>gcc-ohellohello.c
将可执行文件hello复制到共享目录/exp,在目标机上运行hello
#./hello
显示hello,world
1.4归纳总结嵌入式系统下软件开发的一般流程
PC机上编写软件代码并用交叉编译环器编译——制作内核和文件系统并通过串口完成下载——启动内核并借助于NFS文件系统进行程序测试——完成调试后,将可执行文件加入文件系统并运行。
2.Linux内核配置与编译
本实验中用的内核源码是linux-2.4.21-51Board_EDR,在目录/usr/src/linux下。
源代码树下有如下目录:
arch(支持的微处理器体系结构),include(头文件),init(初始化代码),mm(内存管理代码),kernel(主要的内核代码),drives(所有的设备驱动程序),lib(库文件代码),net(网络相关代码)等。
将目标板的开机画面换成自己设定的画面的做法是:
将/usr/src/linux目录下的内核源代码拷贝到自己的目录下,进入这个目录,在arch/arm下找到开发板启动画面的文件,将其删除,用自己的图画替换。
有两个小的注意事项是目标板只是别.ppm文件,所以需要改变原来图画的文件格式,可直接改文件后缀名,或者在终端中用命令convert。
且图画的文件名必须为linux_logo。
>convertlinux_logo.jpglinux_logo.ppm
2.1内核配置编译的基本流程
在文件夹linux-2.4.21-51Board_EDR打开终端。
>makemenuconfig(进入内核配置菜单)
根据需要对内核配置项进行选择。
配置变量有四种选择:
y——静态编译进内核,m——内核代码被编译成模块,n——表示不编译进内核,[]——表示配置变量的值为空。
按空格键可以切换着几种选择。
下面针对一些比较重要的内核配置项进行说明:
1.Loadablemodulesupport,将不常用的设备模块化,动态地加载。
这样能更加有效利用内存。
所以最好选中。
2.Systemtype,处理器种类。
本实验选中“PXA270/210-based”—>“XSBase270-EDR”。
3.在Networkdevicesupport,网络设备驱动。
选择对应的网卡。
本实验箱的网卡是“Ethernet10Mor100Mbit”“SMSCLAN91C111”。
4.Consoledrivers,终端设备驱动配置。
为了以后实验中要用到的支持图像的功能,要选择“supportforframebufferdevices”和“PXALCDsupport”。
5.在“Generalsetup->Defaultkernelcommandstring”中设定内核启动时的一些参数,在使用ramdisk文件系统时该选项的值为
root=/dev/ram0rwconsole=ttyS0,115200mem=64M
其中root=/dev/ram0表明使用的是randisk,rw表明可读可写,console=ttyS0,115200表明使用串行终端,波特率为115200,mem=64M指定内存大小。
6.由于使用randisk的情况需要内核的支持,故需要将“Blockdevices->RAMdisksupport”编入内核,此外将“Blockdevices->DefaultRAMdisksize(kbytes)”改为8192,因为后续的ramdisk根文件系统将使用8MB大小。
7.在“Multimediacapabilitiesportdrivers->UCB1400TouchscreensupportonthexsBase270Board->GUItobesupported”选中“Qtopia”。
这是因为在使用LCD时将能使屏幕持续亮大约十分钟而不睡眠。
上面的这些配置很重要,其余的配置见讲义P20。
配置完之后选择保存,执行完之后会生成.config文件。
然后执行
>makeclean(清除以前构核过程中生成的目标文件、模块文件、核心和一些临时文件)
>makedep(建立依赖关系)
>make(将生成核心vmlinux)
>makezImage
生成的压缩内核映像文件zImage在arch/arm/boot目录中。
将生成的内核映像文件拷贝到/tftpboot下,以便开发板下载。
在反复地编译启动过程中还需要掌握一些小技巧来帮助加快开发进程,比如在配置选项结束的时候可以“SaveConfigurationtoanAlternateFile”,此时可以方便在下一次修改的时候可以“LoadanAlternateConfigurationFile”来读取上一次的配置,避免一些错误的修改。
2.2总结内核映像文件的生成方法及其对操作系统的作用。
makemenuconfig——makeclean——makedep——make——makezImage
内核文件是操作系统的核心,负责系统的进程管理,内存管理,设备和文件管理等,决定着系统的性能和稳定性。
2.3内核配置中哪些选项对操作系统的正常启动是必须的。
Systemtype(系列选型);Characterdevices(字符设备驱动)中的Virtualterminal,supportforconsoleonserialsupport,supportforconsoleonvirtualterminal;文件系统(FileSystem)。
3.嵌入式文件系统的构建
3.1根文件系统概述
根文件系统是内核启动时所mount的第一个文件系统,内核代码映像文件保存在跟文件系统中,而系统引导程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务加载到内存中运行。
根文件系统中常见目录有:
/bin存放二进制可执行命令的目录
/sbin存放管理系统管理员使用的管理程序的目录
以上由busybox生成
/dev存放设备文件的目录
/etc存放系统管理和配置文件的目录
/usr存放几乎所有的要用到的应用程序和文件
/lib存放动态链接共享库的目录
/mnt使用户临时挂载其他的文件系统
/proc虚拟文件系统,直接访问这个目录获取系统信息
以上是需要建立的目录
/tmp公用的临时文件存储点
/root存放管理员的主目录
/var某些大文件的溢出区
3.2Busybox简单介绍和编译
BusyBox是标准Linux工具的一个单个可执行实现。
BusyBox包含了一些简单的工具,例如cat和echo,还包含了一些更大、更复杂的工具,例如grep、find、mount以及telnet。
它集成压缩了Linux的许多工具和命令。
因为代码可以在不依赖共享库的情况下而直接共享,BusyBox的体积得以大幅缩小。
本次实验使用的Busybox版本是busybox-1.00-pre5。
进入目录,打开终端。
>makemenuconfig(进入配置界面)
下面简要对Busybox的配置作一些说明:
1.在BuildOption菜单下,选择静态库编译方式,这样不用为Busybox提供动态链接库支持。
2.设置交叉编译器的路径,在crosscompilerprefix中输入/usr/local/arm-linux/bin/arm-linux-
3.在InstallationOption菜单下,自定义安装目录,一般使用默认目录./_install即可。
4.在LinuxSystemUtilities中有一些重要组件,如mount、umount。
因此要选上SupportmountingNFSfilesystems,即支持加载网络文件系统,如果不选此项,则影响与PC机的通信。
5.在NetworkingUtilities菜单下配置和网络有关的命令,为了使用网络连接,其中ping和ifconfig必选。
配置好busybox之后保存退出。
进行编译安装。
>make
>makeinstall
在生成的_install目录里面有bin、sbin和usr三个目录,并且每个目录下都会有busybox可执行文件的符号链接。
3.3配置文件系统
1.在_install目录下创建etc目录,并建立inittab、rc、motd三个文件。
inittab文件由系统启动程序init读取并解释执行。
>chmod+xrc(修改属性为可执行)
Motd内容随意,由/etc/rc调用显示在终端上。
在etc目录下创建init.d目录,并将/etc/rc向/etc/init.d/rcS做符号链接,此文件为inittab指定的启动脚本。
>mkdirinit.d
>cdinit.d
>ln–s../rcrcS
初始化脚本,系统执行/sbin/init,默认情况下它会执行/etc/init.d/rcS来进行系统的初始化,建立链接后,实际执行的为/etc/rc,在rc程序中有调用/etc/motd文件,因此motd文件的内容最终显示在终端上。
2.创建dev目录,并在该目录下建立必要的设备。
如终端设备,dsp,声卡,framebuffer帧缓冲,硬盘(hda),鼠标,键盘,ram,触摸屏等。
具体见讲义P26。
3.建立proc空目录,供proc文件系统使用。
4.建立lib目录将交叉编译器链接库路径usr/local/arm-linux/arm-linux/lib。
然后将下面几个库复制到lib目录:
ld-2.3.2.solibc-2.3.2.solibm-2.3.2.so
再做如下软链接:
ln–sld-2.3.2.sold-linux.so.2
ln–slibc-2.3.2.solibc.so.6
ln–slibm.so.6libm-2.3.2.so
ln–slibm.solibm-2.3.2.so
分析:
实验中要用静态链接的方式来运行应用程序,并且实验中要将这些库安装在/lib目录下。
本实验中安装了三个库ld-2.3.2.so,libc-2.3.2.so,libm-2.3.2.so。
它们分别是linux的动态加载器、libc标准的c库函数和数学库。
实验中还做了四个软链接,这些软链接使其不受版本的影响,从而具有向后兼容的作用,所有的linux版本都能使用这些共享库。
至此,文件系统目录构造完毕。
在busybox目录终端下:
>ddif=/dev/zeroof=ramdisk_imgbs=1kcount=8912
>/sbin/mke2fsramdisk_img
>mountramdisk_img-oloop
分析:
第一条命令是将创建一个写满'\0'文件,bs=1kcount=8192表明创建的文件大小是8192x1k=8M。
第二条命令用于构建e2fs文件系统。
第三条命令用于将ramdisk_img默认挂载到/mnt/ramdisk目录,-oloop中的-o意为option,loop表明挂载的是loopback设备。
然后将配置好的跟文件系统目录(即_install)中的内容全部复制到/mnt/ramdisk/目录下。
此时遇到问题:
由于一开始没有摸清设备文件与普通文件的区别,于是在将挂载文件系统前所建立的设备文件拷贝到已挂载ramdisk的dev目录时发现根本无法复制。
之后找到了解决办法,就是在挂载的文件系统里面再次输入一串的mknod来建立设备。
>umount/mnt/ramdisk(文件复制创建完毕后卸载文件系统)
>gzipramdisk_img(压缩映像文件生成ramdisk_img.gz)
在挂载与卸载过程中还遇到由于没有遵循“一挂一卸”的原则导致多次挂载后不能卸载。
loop设备有loop0—loop7,所以当挂载次数过多会出现挂载设备不够不能继续挂载,以及卸载不了的情况,此时需要root权限才能够卸载。
最后将生成的ramdisk_img.gz拷贝到/tftpboot中供Bootloader下载。
3.4比较romfs、extfs2、jffs2等文件系统的优缺点。
romfs:
是一种相对简单、占用空间较少的文件系统。
内核支持Romfs文件系统比支持ext2文件系统需要更少的代码,是块文件系统。
是在嵌入式设备上常用的一种文件系统,具备体积小,可靠性好,读取速度快等优点。
同时支持目录,符号链接,硬链接,设备文件。
但它只是可读文件系统,禁止写操作,因此系统同时需要虚拟盘(ramdisk)来支持临时文件和数据文件的存储。
extfs2:
可以实现快速符号链接,类似于Windows文件系统的快捷方式,可将目标名称直接存储在索引节点表中,提高了访问速度;支持的内存大至4TB,文件名称很长,可达1024个字符;管理者在创建系统文件时根据需要选择存储逻辑块的大小。
这种文件系统稳定,可靠,健壮,在台式机、服务器、工作站中普遍使用。
jffs2:
支持数据压缩,多种文件节点类型,是一种基于FLASH的日志文件系统,提高了对闪存的利用率,降低了内存的损耗。
通过jffs2,可以通过flash来存储数据,将flash当作硬盘来使用,而且系统运行的参数可以实时保存在flash中,在系统断电后数据不会丢失。
它在嵌入式系统中很受欢迎。
4.系统启动与测试
打开一个终端,运行minicom,按下开发板电源,如前述步骤加载内核和文件系统,如果一切正常可以在屏幕上看到文件系统中的/etc/motd文件中的内容被显示在屏幕上,按回车有#出现在左下角。
LCD开机画面也正确显示自己设置的图画。
至此,即表明系统配置成功,可以在终端执行命令了。