1、 嵌入式Linux系统裁剪与编译 1 构建交叉编译环境 1.1 交叉编译原理简介 嵌入式开发一般都是使用交叉编译环境。交叉编译就是在一台计算机上编译软件,其生成的软件在另一台不同类型处理器的机器上运行。因为嵌入式硬件性能一般无法和家用计算机相比,无法构建开发和编译环境。所以我们只能“借”家用计算机来对目标平台的软件进行开发和编译。此时称家用计算机为宿主机,而目标平台机器为目标机。每一个软件。在编译过程中。都要经过一系列处理,才能从源代码变成可执行目标代码。这一系列处理包括,预编译、高级语言编译、汇编、连接及其重定位。这一套流程里面用到的工具和库的组合,就称为工具链。Linux上常用的开发工具G
2、CC,它包含预编译器cpp,c语言编译器gcc,汇编器as和连接器ld。这个工具链中,还有用于处理二进制包的工具包binutils,整个工具链应该是GCC+binutils+Glibc。 为了编译在目标机上运行嵌入式Linux内核,首先我们必须编译目标平台的编译链,而这个链是存放在主机上,故名为交叉编译链。1.2 下载构建交叉编译链的工具及其补丁 Binutils-2.19.1 Busybox-1.13.0 GCC-4.3.3 GMP-4.2.4 MPFR-2.4.1 uClibc-0.9.30.1 制作交叉编译链 定义环境变量 定义MYSYS变量为嵌入式系统主目录变量、MYSYS_TARGE
3、T变量为目标平台、MYSYS_HOST为主机平台。使用export命令或者将此变量添加.bashrc文件中。 cat /.bashrc “EOF” set +h umask 022 MYSYS=/mnt/mysys LC_ALL=POSIX PATH=$MYSYS/ctools/bin:/bin:/usr/bin export MYSYS LC_ALL PATH EOF 这样我们设置了生成系统的根目录变量。 export MYSYS_HOST=”$MACHTYPE” export MYSYS_TARGET=”XXX-ulibc-linux-gnu”这两个变量都是编译过程需要使用的.XXX是目标
4、平台,如arm平台,可写为arm-ulibc-linux-gun。 首先需要安装内核头文件。make mrproper make ARCH=$MYSYS_ARCH headers_checkmake ARCH=$MYSYS_ARCH INSTALL_HDR_PATH=dest headers_install制作工具链的时候需要使用部分内核头文件。 编译GMP。 ./configure -prefix=/ctools -enabled-mpbsd make make install 编译MPFR。 LDFLAGS=-Wl,-rpath,/ctools/lib ./configure -prefi
5、x=/ctools -enable-shared -with-gmp=/ctools cp -rv dest/include/* $MYSYS/usr/include make make install 第一次编译GCC AR=ar LDFLAGS=-Wl,-rpath,/ctools/lib ./gcc-4.3.3/configure -prefix=$MYSYS/ctools -build=$MYSYS_HOST -host=$MYSYS_HOST -target=$MYSYS_TARGET -with-sysroot=$MYSYS -disable-nls -disable-shared
6、 -with-mpfr=/ctools -with-gmp=/ctools -without-headers -with-newlib -disable-decimal-float -disable-libgomp -disable-libmudflap -disable-libssp -disable-threads -enable-languages=c make make install 此时的编译出来的gcc,是不可以编译c程序的。因为没有连接库。同时安装的Linux头文件也是这一步被使用。GCC必须掌握目标体系的全部细节,这由Linux的内核头文件给出。 编译uclibc库,当然也可
7、以编译glibc库。编译最终版gcc ./gcc-4.3.3/configure -prefix=$CLFS/cross-tools -build=$CLFS_HOST -target=$CLFS_TARGET -host=$CLFS_HOST -with-sysroot=$CLFS -disable-nls -enable-shared -enable-languages=c -enable-c99 -enable-long-long -with-mpfr=/cross-tools -with-gmp=/cross-tools make make install 这样就得到了交叉编译链。1.
8、3 下载Linux内核并进行裁剪Linux-2.6.30.5 2 Linux内核编译与裁剪 2.1 配置内核的几种命令: make config:基于文本的最为传统的配置界面,不推荐使用。 make menuconfig:基于文本选单的配置界面,字符终端下推荐使用。 make xconfig:基于图形窗口模式的配置界面,Xwindow下推荐使用。 make oldconfig:如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦。 make ARCH=$CLFS_ARCH CROSS_COMPILE=$CLFS_TARGET- menuconfig 通过对嵌入式需求分析,通过必要的勾选
9、,即可完成对linux内核裁剪和重编译。 2.2讲解一些内核选项:2.2.1 General setup常规设置 子选项Prompt for development and /or incomplete code/drivers是测试版本代码。 Support for paging of anonymous memory(swap)选择是否支持内存随机页面支持(SWAP),如果嵌入式存储空间过小,可以去掉。可以提高运行速度。 Auditing support审计支持,SELinux会需要用到它。 Initial RAM filesystem and RAM disk support初始化RAM
10、文件系统和RAM磁盘支持,初始RAM文件系统是一种ram文件系统,它被启动器装载,在启动程序前以root形式挂载。 Initramfs source files初始ram文件系统源文件。有.cpio后缀的压缩包。 Optimize for size 尺寸优化,可以得到更小的内核。 Configure standard kernel features(for small sysytems)为小系统配置标准内核特性。 2.2.2 Loadable module support 可加载模块支持Enable loadable module support允许可装载模块支持。此选项可以让你的内核支持模块
11、。模块是一小段代码,编译后可在系统运行动态加入内核,从而为内核增加一些特性或是对某种硬件进行支持。一般一些不常用到的驱动或特性可以编译为模块以减小内核的体积。在运行时可以用modprobe命令来加载它到内核中去。Module unloading模块卸载,能卸载不再使用的模块。可以使内核尺寸减小一些。 Forced module unloading强制内核模块卸载,强行卸载模块,即使内核认为不安全,内核会理解卸载模块2.2.3 Enable the block layer 允许块设备 Support for Large Block Devices 提供对2TB活着更大的块设备支持。 Suppor
12、t for Large Single File提供对大文件支持,为大于2TB的文件。 Deadline I/O scheduler Deadline I/O调度简单紧密,在单进程的I/O磁盘调度上,它的工作方式几乎和抢先式调度器相同,因此也是一个好的选择。2.2.4 Processor type and features处理器类型及特性(此处可以针对嵌入式芯片进行裁剪) Symmetric multi-processing support(SMP)多处理器支持。 RDC R-321x Soc RDC R-321x系列芯片 Processor family及其子选项,可以针对选择处理器。 Gen
13、eric X86 support对X86 CPU类型进行优化。 Maximum number of CPUs 最大支持的CPU数量。 Multi-core scheduler support多核调度器支持。 Preemptible Kernel可抢先式内核,这个选项通过使所有内核代码编译为“可抢先”来降低内核延迟。这个非常适合嵌入式编译内核。 High Memory Support高容量内存支持。如果内核不会运行在高于1G内存的机器上,就去掉。 Timer frequency时钟频率的设置。 Built-in kernel command line内嵌内核命令行,允许编译内核的时候指定 2.2
14、.5 Power management options 电源管理选项 Suspend to RAM and standby内存挂起和待机功能。允许系统休眠,主内存仍带电保存相关信息。 Hibernation 休眠 AC Adapter AC交流电源适配器 Battery电池 Button 风扇 ARM BIOS support高级电源管理支持。2.2.6 Bus options 总线选项2.2.7 Executable file formants 可执行文件格式 Kernel support for ELF Binaries ELF二进制文件内核支持2.2.8 Networking suppo
15、rt 网络支持 Packet socket包套接字 Unix domain sockets UNIX域套接字THE IPv6 protocol IPv6协议。Security Marking给网络套接字提供安全标志。Network packet filtering framework 网络包过滤框架。Asynchronous Transer Mode(ATM)异步传输模式,如果有ATM网卡,可选。Appletalk protocol support苹果电脑用于连接网络的协议。ld Ethernet Bridging 802.ld以太网桥接。 802.1Q VLAN support 802.1Q
16、 VLAN接口支持。The IPX protocol IPX协议,这是对Novell网络的协议,这个驱动会使内核增大16KB. Bluetooth subsystem support 蓝牙子系统支持。Phonet protocols family 网络电话协议家族。 Wireless无线支持。 IrDA(infrared) subsystem support红外子系统支持。2.2.9 Device Drivers 设备驱动 MTD partitioning support如果有一个设备,需要将他分成几个分区。Parallel port support并行端口支持。Plug and Play s
17、upport即插即用设备。 Block devices块设备。 Normal floppy disk support普通软盘支持。 Network block device support网络块设备。 Low Performance USB Block driver低端USB块驱动设备。 RAM block device support RAM块设备支持 Packet writing on CD/DVD media CD/DVD媒体包写入。 ATA over Ethernet support 以太网ATA支持。 ATA/ATAPI/MFM/RLL support如果系统是纯种SCSI,那么可以
18、选择N。Support for DATA支持。 SCSI device support SCSI设备支持。 SCSI disk support SCSI磁盘支持。 RAID support RAID支持。 Network device support网络设备支持。 Input device support 输入设备支持。 Graphics support 图形支持。 Sound 声音。 HID Devices HID设备。 USB Human Interface Device supports 人性化接口设备。 USB support USB支持。 MMC/SD card support MM
19、C/SD卡支持。可以从选项知,这是进行嵌入式裁剪非常重要的一个选项。我们可以为嵌入式环境量身打造我们需要的驱动,去掉我们不需要的驱动,那么Linux内核将减小很多。 2.2.10 Firmware Divers 固件驱动2.2.11 File systems 文件系统 Second extended fs support 第二次扩展文件支持,既Ext2文件系统。 Ext3 journalling file system support Ext3日志文件系统。 Ext3 extended attributes Ext3扩展属性。The Extended 4(ext4) filesystem ex
20、t4扩展文件系统。 JFS filesystem support JFS文件系统支持。 XFS filesystem support XFS文件系统支持。 OCFS2 file system support OCFS2文件系统。 Kernel automounter support 内核自动挂载支持。 CD-ROM/DVD Filesystems CD-ROM/DVD文件系统。 DOS/FAT/NT Filessystems DOS/FAT/NT文件系统。 VFAT fs support VFAT文件系统支持。 NTFS file system support NTFS文件系统支持。 /pro
21、c file system support /proc文件系统支持,提供系统状态信息。 Virtual memory file system support 虚拟文件系统支持。Tmpfs是一个把所有文件保持在虚拟内存里面的文件系统。 Journalling Flash File Systme V2(JFFS2) support日志闪存文件系统支持。 Compressed ROM file system support 压缩ROM文件系统支持。 Network File Systems 网络文件系统。 对嵌入式文件系统进行定制和裁剪是必要的,根据需求选择合适的文件系统。然后在此选项进行配置,能有效裁剪linux。 2.2.12 Kernel hacking 内核调试 2.2.13 Security options 安全选项 3 内核裁剪结束,编译内核源码。 对内核配置完毕,即可进行内核源代码编译。 Make ARCH=$MYSYS_ARCH CROSS_COMPILE=$MYSYS_TARGET- INSTALL_MOD_PATH=$MYSYS module_install 编译结束,可以得到Linux内核镜像VMlinux。