jaffas1101 发表于 2005-10-9 17:39:36

[转帖]我也来做嵌入式 linux(连载一)

前言 <br>
前些阵子做了一个在U盘上跑的,但是没有做笔记,稀里糊涂地做完了,这阵子得了一本《构建嵌入式Linux系统》,打算重新照着再做一遍,把笔记贴上来,也不敢保证一定做得出来,做到哪一步算哪一步吧! <br>
<br>
----------------------------------------------------------------------------------- <br>
制作嵌入式linux <br>
kendo (C) copyleft <br>
2005-10-09 <br>
<br>
<br>
目的:构建一个X86平台的小型Linux系统,存储设备选择硬盘或CF卡; <br>
<br>
第一章 准备工作 <br>
1、主机平台 <br>
Redhat 9.0 +原生GNU工具链 <br>
<br>
2、开发目录 <br>
control-project <br>control-module <br>daq-module <br>bootloader <br>build-tools <br>debug <br>doc <br>images <br>kernel <br>rootfs <br>sysapps <br>tmp <br>tools <br>sysmgnt-module <br>user-interface <br>
<br>
目录说明 <br>
目录 内容 <br>
bootloader 目标板的引导加载程序,如lilo等 <br>
build-tools 建立交叉编译平台的工具源码 <br>
debug 调试工具及所有相关包 <br>
doc 项目中用到的所有文档 <br>
images 编译好的内核映像,以及根文件系统 <br>
kernel 各个版本的Linux内核源码 <br>
rootfs 制作好的根文件系统 <br>
sysapps 目标板将要用到的系统应用系统,比如thttpd,udhcpd等 <br>
tmp 存放临时文件 <br>
tools 编译好的跨平台开发工具链以及C链接库 <br>
<br>
按照上面所示目录树,在本机创建相应目录 <br>
_____________________________________________________ <br>
<br>
第二章 建立交叉编译平台 <br>
准备工作 <br>
所需软件 <br>
Linux-2.4.18 <br>
binutils-2.10.1 <br>
gcc-2.95.3 <br>
uClibc-0.9.16 <br>
将这些软件存放入对应的工作目录中; <br>
<br>
1、 设置工作空间 <br>
根据工作空间的实际情况,建立脚本develdaq <br>
export PROJECT=daq-module <br>
export PRJROOT=/home/kendo/control-project/${PROJECT} <br>
export TARGET=i386-linux <br>
export PREFIX=${PRJROOT}/tools <br>
export TARGET_PREFIX=${PREFIX}/${TARGET} <br>
export PATH=${PREFIX}/bin:${PATH} <br>
export PATH=${PREFIX}/BIN:${PREFIX}/uclibc/bin:${PATH} <br>
<br>
cd $PRJROOT <br>
<br>
2、 准备安装build-tools <br>
建立目录 <br>
. develdaq <br>
cd ${PRJROOT}/build-tools <br>
mkdir build-binutils build-boot-gcc build-gcc build-uclibc <br>
这四个目录分别对应二进制工具程序、引导编译器、完整编译器、C链接库 <br>
<br>
内核头文件的设置 <br>
将准备好的内核源码放入${PRJROOT}/kernel,解压 <br>
tar xvzf linux-2.4.18.tar.gz <br>
<br>
将解压后生成的目录改名为linux-2.4.18,这样方便多个版本共存,编译之 <br>
cd linux-2.4.18 <br>
make ARCH=i386 CROSS_COMPILE=i386-linux- menuconfig <br>
其中ARCH CROSS_COMPILE对应的目标板的平台。 <br>
选针对实际情况随便选选 <br>
<br>
建立交叉工具链所需要的include目录,并将内核头文件复制过去: <br>
mkdir –p ${TARGET_PREFIX}/include <br>
# cp -r include/linux/ ${TARGET_PREFIX}/include <br>
# cp -r include/asm-i386/ ${TARGET_PREFIX}/include/asm <br>
# cp -r include/asm-generic/ ${TARGET_PREFIX}/include <br>
<br>
3、 安装binutils <br>
取出源码: <br>
# cd ${PRJROOT}/build-tools <br>
tar zxvf binutils-2.10.1.tar.gz <br>
<br>
进入为binutils建立的目录,配置: <br>
# cd build-binutils/ <br>
# ../binutils-2.10.1/configure --target=$TARGET --prefix=${PREFIX} <br>
target为目标板类型,prfix为安装目录 <br>
#make <br>
一切顺利……继续安装 <br>
#make install <br>
这样,binutils被安装至指定的PREFIX中,看一看先: <br>
# ls -l ${PREFIX}/bin <br>
total 18320 <br>
-rwxr-xr-x 1 root root 1375636 Oct 9 12:31 i386-linux-addr2line <br>
-rwxr-xr-x 2 root root 1387052 Oct 9 12:31 i386-linux-ar <br>
-rwxr-xr-x 2 root root 2459611 Oct 9 12:32 i386-linux-as <br>
-rwxr-xr-x 1 root root 122899 Oct 9 12:31 i386-linux-c++filt <br>
-rwxr-xr-x 1 root root 175697 Oct 9 12:32 i386-linux-gasp <br>
-rwxr-xr-x 2 root root 1952165 Oct 9 12:32 i386-linux-ld <br>
-rwxr-xr-x 2 root root 1393750 Oct 9 12:31 i386-linux-nm <br>
-rwxr-xr-x 1 root root 1829174 Oct 9 12:31 i386-linux-objcopy <br>
-rwxr-xr-x 1 root root 1948079 Oct 9 12:31 i386-linux-objdump <br>
-rwxr-xr-x 2 root root 1387047 Oct 9 12:31 i386-linux-ranlib <br>
-rwxr-xr-x 1 root root 240373 Oct 9 12:31 i386-linux-readelf <br>
-rwxr-xr-x 1 root root 1299977 Oct 9 12:31 i386-linux-size <br>
-rwxr-xr-x 1 root root 1276928 Oct 9 12:31 i386-linux-strings <br>
-rwxr-xr-x 2 root root 1829169 Oct 9 12:31 i386-linux-strip <br>
<br>
每个工具加了刚才指定的前缀i386-linux- <br>
<br>
4、安装GCC <br>
gcc 要麻烦点,需要先建立一个引导编译器,只支持C语言,等链接库建立好后,才能安装完速的支持C++的…… <br>
取出源码: <br>
#cd .. <br>
#tar zxvf gcc-2.95.3.tar.gz <br>
<br>
配置: <br>
# cd build-boot-gcc/ <br>
# ../gcc-2.95.3/configure --target=$TARGET --prefix=${PREFIX} --without-headers --with-newlib --enable-languages=C <br>
注:--without-header,因为是交叉编译,并不需要目标板的系统头文件; <br>
--with-newlib,告诉配置工具,不需要使用glibc <br>
--enable-languages=C,告诉编译器,支持哪种语言 <br>
<br>
编译: <br>
make all-gcc <br>
还是很顺利,没有报错,安装: <br>
make install-gcc <br>
<br>
5、 安装C链接库uClibc <br>
解压: <br>
#cd .. <br>
#tar jvxf uClibc-0.9.16.tar.bz2 <br>
<br>
配置: <br>
进入 源码目录 <br>
# cd uClibc-0.9.16 <br>
# make CROSS=i386-linux- menuconfig <br>
<br>
根据实际需要,选择相应的项,也可以采用默认值,对于交叉编译来说,我改变了以下三项设置: <br>
Linux kernel header location ${PRJROOT}/kernel/linux-2.4.18 <br>
Shared library loader path /lib <br>
uClibc development environment directory ${PRJROOT}/tools/uclibc <br>
<br>
编译: <br>
#make CROSS=i386-linux- <br>
<br>
安装: <br>
#make CROSS=i386-linux- PREFIX=”” install <br>
<br>
# ls /home/kendo/control-project/daq-module/tools/uclibc/ <br>
bin include lib usr <br>
其中,bin目录下边,就是uclibc对应的二进制工具了 <br>
<br>
6 、安装完整的编译器 <br>
第一遍安装gcc时,因为那个时候链接库还没有安装,所以使用了—without选项,现在uClibc安装完成了,利用它的include 和lib,安装完整的编译器,使之支持C++: <br>
# cd build-tools/ <br>
# cd build-gcc/ <br>
# ../gcc-2.95.3/configure --target=$TARGET --prefix=${PREFIX} --with-headers=${PRJROOT}/tools/uclibc/include --with-libs=${PRJROOT}/tools/uclibc/lib --enable-languages=C,C++ <br>
<br>
编译这个要好办天,上QQ打了一会儿俄罗斯方块…… <br>
回过头来,顺利编译完成,安装: <br>
make install <br>
<br>
收工 <br>
<br>
7、 检测工具链 <br>
花了四五十分钟时间,总算把整个交叉编译工具链搭建好了,检测一下先, <br>
#cd ${PRJROOT}/tools <br>
# ls -l <br>
total 32 <br>
bin 交叉开发工具 <br>
i386-linux 目标板专用文件 <br>
include 供交叉开发工具使用的头文件 <br>
info gcc 的info文件 <br>
lib 供交叉开发工具使用的库文件 <br>
man 交叉开发工具在线说明文件 <br>
share 交叉开发工具与链接库共享的文件 <br>
uclibc uclibc的二进制工具程序、库文件、头文件等 <br>
<br>
因为没有使用glibc,而使用了uclibc代替之,所以inclue、lib这些目录基本上没有多少内容,实际使用的include、lib文件都在uclibc对应的子目录下边; <br>
<br>
8、 使用工具链 <br>
工具链做好了,能不能交叉编译,大家可以写个小程序测试一下,编译程序不再是gcc,而是${PRJROOT}/toos/uclibc/bin/ i386-uclibc-gcc,如果觉得每次输入这么长个路径麻烦,可以把它写到PATH中,如我在起先建立的脚本develdap中增加如下语句: <br>
export PATH=${PREFIX}/bin:${PREFIX}/uclibc/bin:${PATH} <br>
<br>
明天再接着编译内核吧……^o^<br>

jaffas1101 发表于 2005-10-11 10:05:07

re:昨天建好了工作空间,搭建好了交叉编译环境...

昨天建好了工作空间,搭建好了交叉编译环境,今天来编译内核 <br>
<br>
——————————————————————————————————— <br>
第三章 内核编译 <br>
1、 编译 <br>
因为我打算新系统应该支持网桥,而且需要网桥下Netfilter的支持,所以先到sourceforge下载2.4.18内核的网桥补丁bridge-nf-0.0.8-bds-against-2.4.18.diff.gz。我下载的URL: <br>
<a target=_blank href=http://sourceforge.net/project/showfiles.php?group_id=39571&package_id=49683>http://sourceforge.net/project/showfiles.php?group_id=39571&package_id=49683</a> <br>
偷个懒,在Win2000下解压,然后拷贝到内核所在目录 <br>
给内核打补丁: <br>
# patch -p1 <bridge-nf-0.0.8-bds-against-2.4.18.diff <br>
patching file include/linux/netfilter.h <br>
patching file include/linux/netfilter_ipv4.h <br>
patching file include/linux/skbuff.h <br>
patching file net/bridge/br.c <br>
patching file net/bridge/br_forward.c <br>
patching file net/bridge/br_input.c <br>
patching file net/bridge/br_private.h <br>
patching file net/bridge/Makefile <br>
patching file net/Config.in <br>
patching file net/core/netfilter.c <br>
patching file net/core/skbuff.c <br>
patching file net/ipv4/ip_output.c <br>
patching file net/ipv4/netfilter/ip_tables.c <br>
patching file net/ipv4/netfilter/ipt_LOG.c <br>
patching file net/bridge/br_netfilter.c <br>
<br>
开始编译内核: <br>
# make ARCH=i386 CROSS_COMPILE=i386-linux- menuconfig <br>
根据实际情况选择,以前还没有在2.4.18下边做过支持网桥的测试,找了半天没有找到 <br>
netfilter (firewalling) support <br>
这个东东,郁闷了,管它的,继续…… <br>
<br>
# make ARCH=i386 CROSS_COMPILE=i386-linux- clean dep <br>
<br>
# make ARCH=i386 CROSS_COMPILE=i386-linux- bzImage <br>
<br>
总算可以去上洗手间了…… <br>
OK,编译完成,673K,稍微大了点,得想办法做到512以下才好,算了,等整个系统做完了,再回头来想办法做这个工作。 <br>
<br>
因为没有选择内核支持,建立/安装内核的步骤工作又省了…… <br>
<br>
2、 安装 <br>
先将编译好的压缩的内核映像、未压缩的内核映像、内核符号映射文件以及配置文件拷贝到${PRJROOT}/images中: <br>
# cp arch/i386/boot/bzImage ${PRJROOT}/leadbbsfile/bzImage-2.4.18-rmk5 <br>
# cp vmlinux ${PRJROOT}/leadbbsfile/vmlinux-2.4.18-rmk5 <br>
# cp System.map ${PRJROOT}/leadbbsfile/System-2.4.18-rmk5 <br>
# cp .config ${PRJROOT}/leadbbsfile/2.4.18-rmk5 <br>
<br>
清理内核源码,让它恢复到初始状态: <br>
# make ARCH=i386 CROSS_COMPILE=i386-linux- distclean <br>
<br>
3、 测试内核 <br>
将bzImage-2.4.18-rmk5拷贝至boot目录下,编译lilo.conf <br>
#vi /etc/lilo.conf <br>
加入如下语句: <br>
<br>
image=/boot/bzImage-2.4.18-rmk5 <br>label=linux-bridge <br>root=/dev/hda1 <br>read-only <br>append="root=/dev/hda1" <br>
重新安装lilo: <br>
#lilo <br>
Added linux-bridge <br>
Added linux * <br>
<br>
重启系统试试…… <br>
还算好,一切顺利,系统启来了…… <br>
花费时间:30分钟 <br>
<br>
总结: <br>
1、编译内核时,没有看到针对2.4.19时,网桥下那个netfilter (firewalling) support选项,是2.4.18本身就没有吗,还是补丁打得不对?没有经验,希望哪位大哥指正; <br>
<br>
2、没有仔细根据目标机的实际硬件配置,来精简内核。希望等系统做完整了,能正常运行了,以后再慢慢来把内核精简了^ <br>
<br>
<br>
附,内核选择: <br>
内核编译记录: <br>
Code maturity level options 不选 <br>
Loadable module support 不选,不用模块支持,全部编译进内核,因为定位一个小型系统,功能非常简单,这样做,虽然扩展性差点,内核大点,不过可以省很多工作; <br>
Processor type and features 根据实际,选择处理器类型 <br>
General setup ---> <br>
<LI> Networking support <br>
<LI> PCI support <br>
(Any) PCI access mode <br>
<LI> PCI device name database <br>
<LI> System V IPC <br>
<LI> Sysctl support <br>
(ELF) Kernel core (/proc/kcore) format <br>
<LI> Kernel support for ELF binaries <br>
<LI> Power Management support <br>
<br>
Memory Technology Devices (MTD) ---> MTD设备,我用CF卡,不选 <br>
<br>
Parallel port support ---> 不选 <br>
<br>
Plug and Play configuration ---> 我的系统用不着即插即用,不选 <br>
<br>
Block devices ---> <br>
<LI> Loopback device support <br>
<LI> RAM disk support <br>
(4096) Default RAM disk size (NEW) <br>
<LI> Initial RAM disk (initrd) support <br>
<br>
Multi-device support (RAID and LVM) ---> 不选 <br>
<br>
Networking options ---> <br>
[ ] Packet socket: mmapped IO <br>
[ ] Netlink device emulation <br>
[ ] Network packet filtering debugging (NEW) <br>
[ ] Socket Filtering <br>
[ ] IP: kernel level autoconfiguration <br>
[ ] IP: tunneling <br>
[ ] The IPX protocol <br>
[ ] Appletalk protocol support <br>
[ ] DECnet Support <br>
QoS and/or fair queueing ---> 不选 <br>
<br>
ATA/IDE/MFM/RLL support ---> 用了默认的 <br>
<br>
Telephony Support ---> 不选 <br>
<br>
SCSI support ---> 不选 <br>
<br>
Fusion MPT device support ---> 不选 <br>
<br>
I2O device support ---> 不选 <br>
<br>
Network device support ---> 根据实际情况选择 <br>
<br>
Amateur Radio support ---> 不选 <br>
<br>
IrDA (infrared) support ---> 不选 <br>
<br>
ISDN subsystem ---> 不选 <br>
<br>
Old CD-ROM drivers (not SCSI, not IDE) ---> 不选 <br>
<br>
Input core support ---> 不选 <br>
<br>
Character devices ---> <br>
<LI> Virtual terminal <br>
<LI> Support for console on virtual terminal <br>
<LI> Standard/generic (8250/16550 and compatible UARTs) serial support <br>
<LI> Support for console on serial port <br>
<br>
Multimedia devices ---> 不选 <br>
<br>
File systems ---> <br>
<LI> Kernel automounter version 4 support (also supports v3) <br>
<LI> Virtual memory file system support (former shm fs) <br>
<LI> /proc file system support <br>
<LI> Second extended fs support <br>
<br>
Console drivers ---> <br>
<LI> VGA text console 调试时接显示器用 <br>
<br>
剩下三个都不要 <br>
Sound ---> <br>
USB support ---> <br>
Kernel hacking ---><br>
<br>
页: [1]
查看完整版本: [转帖]我也来做嵌入式 linux(连载一)