590 likes | 722 Views
The success's road. 嵌入式 Linux 开发. 今天内容. 嵌入式 Linux 系统简介 构造嵌入式 Linux 系统 搭建开发平台 编译 Linux 内核 下载根文件系统 Gdb 和 gdbserver. 第 1 部分. 嵌入式 Linux 系统简介. 嵌入式 Linux 系统简介.
E N D
The success's road 嵌入式Linux开发
今天内容 • 嵌入式Linux系统简介 • 构造嵌入式Linux系统 • 搭建开发平台 • 编译Linux内核 • 下载根文件系统 • Gdb 和 gdbserver
第1部分 嵌入式Linux系统简介
嵌入式Linux系统简介 • 嵌入式系统开发已经进入32位时代,在当前的数字信息技术和网络技术高速发展的后PC Post-PC时代,嵌入式系统已经广泛的渗透到科学研究、工程设计、军事技术、各类产业和商业文化艺术、娱乐业以及人们的日常生活等方方面面中。随着国内外嵌入式产品的进一步开发和推广,嵌入式技术越来越和人们的生活紧密结合。
什么是嵌入式系统? 无处不在,融入生活
嵌入式系统定义 • 嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。 • MP3、PDA、手机; • DVD机、机顶盒; • 车载GPS系统、探测火星的机器人。
软件(操作系统/驱动程序/应用程序) 存储器 输入 处理器 输出 嵌入式系统与PC机
嵌入式系统的特点 • 1)嵌入式系统低功耗、体积小,专用性强。嵌入式系统与PC机的最大不同就是嵌入式CPU大多工作在为特定用户群设计的系统中,能够把PC机中许多由板卡完成的任务集成在芯片内部,从而有利于嵌入式系统设计趋于小型化。 • 2)为了提高执行速度和系统可靠性,嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中,而不是存贮于磁盘等载体中。 • 3)嵌入式系统的硬件和软件都必须高效率地设计,系统要精简。操作系统一般和应用软件集成在一起。 • 4)对软件代码质量要求很高。应该尽最大可能避免死机的情况发生。 • 5)嵌入式系统开发需要专门的开发工具和开发环境。
典型的嵌入式操作系统 • Linux • uC/OS • Windows CE • VxWorks • Palm OS • QNX • Symbian How To Choice
第2部分 构造嵌入式Linux系统
开发板 (Target) 交 换 机 串口 客户机1 客户机2 Linux服务器(Host) 客户机3 客户机4 Host与Target Target是目标平台,比如ARM、MIPS、SuperH、PowerPC等。 是一个基于x86架构的计算机(Pentium4处理器、Athlon处理器等),即i386平台。
交叉编译环境 • 随着硬件平台和操作系统的多样化,软件向不同平台移植的工作变得越来越繁复。交叉编译技术的引入为软件的不同平台移植创造了便利条件。在交叉编译技术中有两种比较典型的实现: • Java模式,即Java的字节码编译技术; • GNU GCC 模式,即通常所讲的Cross GCC 技术。
GNU GCC 模式 计算机源程序(c , java…) GCC交叉编译器 目标平台,目标代码 文本编辑器 计算机系统 计算机系统
Linux 下的GCC 交叉编译器 • GNU Binutils • GNU Binutils 的主要工具有两个,一个是连接程序ld,另外一个是汇编程序as。其主要目的是为GNU 系统,提供汇编和连接工具。 • GNU GCC • GNU GCC 就是上面提到的GCC,GCC 主要是为GNU 系统提供C 编译器。现在支持多种语言,这其中包括C/C++、Fortran、Java、Objective-C、甚至还有Ada。 • GNU GLibc • 用于定义系统调用和其它一些基本的函数调用。
GCC 交叉编译器生成 • 第一步,取得Binutils、GCC、Glibc 的源码。 • 第二步,配置并编译Binutils 取得我们所需要的汇编和连接程序。 • 第三步,配置并编译GCC 源码生成GCC 编译器。一般是C 编译器首先生成,然后以这个为基础在结合下一步要生成的Glibc 的C 函数库,再编译生成其它编译器。 • 第四步,配置Glibc 并编译生成Glibc 的C 函数库。 • 第五步,再次配置和编译GCC 源码,生成其它语言的编译器,如C++编译器等。
设置环境变量 Export PROJECT=S3C2410TK Export PRJROOT=~/$PROJECT Export TARGET=arm-linux Export PREFIX=$PROJECT/tools Export TARGET_PREFIX=$PREFIX/$TARGET Export PATH=$PREFIX/bin:$PATH
安装内核头文件(1) $ cd include/asm-arm/ $ rm arch proc $ ln -s arch-s3c2410 arch $ ln -s proc-armv proc • proc-armo is for 26-bits ARM • proc-armv is for 32-bits ARM
安装内核头文件(2) • 配置内核 • make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig • ARCH 目标平台 • CROSS_COMPILE 交叉编译工具 • 保存后退出 • 上述操作成功后,会生成: linux-2.4.18/include/linux/version.h
安装内核头文件(3) • $ mkdir -p $TARGET_PREFIX/include • $ cp -r include/linux/ $TARGET_PREFIX/include/ • $ cp -r include/asm-arm/ $TARGET_PREFIX/include/asm • 与平台相关的汇编 • $ cp -r include/asm-generic/ $TARGET_PREFIX/include
安装Binutils $ cd $PRJROOT/build-tools/ $ tar -xvzf binutils-2.14.tar.gz $ cd build-binutils $ ../binutils-2.14/configure --target=$TARGET --prefix=$PREFIX • Makefile 和 Config文件将被生成,存放在 build-tools/build-binutils/目录下 $ make $ make install
安装Bootstrap 编译器 创建交叉编译版本的gcc,需要交叉编译版本的glibc及其头文件; 而交叉编译版本的glibc是通过交叉编译版本的gcc创建的。
安装Bootstrap 编译器 • 修改gcc 源代码中的gcc/config/arm/t-linux文件,在该文件的TARGET_LIBGCC2_CFLAGS后面加上__gthr_posix_h和inhibit_libc: • TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer –fPIC (修改前) • TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer –fPIC -Dinhibit_libc -D__gthr_posix_h.
安装Bootstrap 编译器 $ cd build-boot-gcc/ $ ../gcc-2.95.3/configure --target=$TARGET --prefix=$PREFIX --without-headers --with-newlib --enable-languages=c --disable-threads • Makefile和config文件生成在build-tools/build-boot-gcc/ • --target 目标平台 • --prefix 安装路径 • --without-headers 我们现在没有 glibc headers • --with-newlib 不使用glibc • --enable-languages=c 只支持C语言 • --disable-threads -Dinhibit_libc补丁 $ make all-gcc $ make install-gcc
安装C库 • $ cd $PRJROOT/build-tools/ • $ tar -xvzf glibc-2.1.3.tar.gz • $ tar -xvzf glibc-crypt-2.1.tar.gz --directory=glibc-2.1.3 • $ tar -xvzf glibc-linuxthreads-2.1.3.tar.gz --directory=glibc-2.1.3 $ cd build-glibc/ $ CC=arm-linux-gcc ../glibc-2.1.3/configure --host=$TARGET \ > --prefix="/usr" --enable-add-ons \ > --with-headers=$TARGET_PREFIX/include • Makefile和config文件生成在build-tools/build-glibc/ • CC=arm-linux-gcc • --host=$TARGET • --prefix="/usr“ • --enable-add-ons 使用linux线程 • --with-headers 使用 linux 内核头文件
安装C库 • $ cd $PRJROOT/build-tools/build-glibc/ • $ make • $ make install_root=$TARGET_PREFIX prefix="" install • 安装 glibc 到 $TARGET_PREFIX • 注意不要覆盖系统原来的库 • Glibc的安装路径在$install_root/$prefix/usr/lib/, 现在我们安装在 $install_root/$prefix/lib/ • $ cd $TARGET_PREFIX/lib/
安装C库 • $ cp libc.so libc.so.orig • $ vi libc.so • 修改libc.so文件 GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a ) GROUP ( libc.so.6 libc_nonshared.a )
最后的安装 $ cd $PRJROOT/build-tools/build-gcc/ $ ../gcc-<version>/configure --target=$TARGET \ –prefix=$PREFIX \ --enable-languages=c,c++ • $ make all • $ make install
Binutils工具包介绍 • addr2line :把程序地址转换为文件名和行号。在命令行中给它一个地址和一个可执行文件名,它就会使用这个可执行文件的调试信息指出在给出的地址上是哪个文件以及行号。 • ar:建立、修改、提取归档文件。归档文件是包含多个文件内容的一个大文件,其结构保证了可以恢复原始文件内容。
Binutils工具包介绍 • as :主要用来编译GNU C编译器gcc输出的汇编文件,产生的目标文件由连接器ld连接。 • c++filt :连接器使用它来过滤C++ 和Java 符号,防止重载函数冲突。 • gprof :显示程序调用段的各种数据。 • nm :列出目标文件中的符号。