系统软件工程师实战攻略(体系结构篇)--(1)

Sina WeiboBaiduLinkedInQQGoogle+RedditEvernote分享




前言

这个世界上,需要玩虚的;也需要玩实的;
活命需要玩实的。但不一定活的好;不一定活的开心;但可以活下去。
最高境界是玩虚的;但前提是银行帐号里银子要是实在的。。。
《系统软件工程师实战攻略(体系结构篇)》 的目的为嵌入式系统工程师,网络工程师,提供一些体系结构实战案例。目的是活命。所有的代码都是实践调试过的,具有产品级别的质量。版权是BSD License。换言之,随便重用。
这些东东对大辽,大宋的工程师们,烟酒生们都适用。
以后再整《系统软件工程师实战攻略(操作系统篇)》和《系统软件工程师实战攻略(网络篇)》
然后就封笔了。
希望有所帮助,
陈怀临,2011 12 8 ,加州
如何做一个交叉编译器(cross compiler)和工具链

要玩嵌入式,玩CPU和板子,首先要学会定制一个交叉编译器。交叉编译器是啥意思呢? 其实就是在你的研发的机器上(例如一个x86机器),做研发,写代码。然后用这个编译器去产生相应的代码(例如,MIPS,Arm,或者PowerPC,或者龙芯。。。。。。)
GCC和ToolChain包括gcc,gdb,tools三大块。源码都可以从GNU去下载。然后自己修改和定做。
相关的下载地址为:
GCC: http://gcc.gnu.org/releases.html
GDB: http://www.gnu.org/s/gdb/download/
binutil:http://www.gnu.org/software/binutils/
libc: http://sourceware.org/newlib/
下面是一个完整的script可以用来做MIPS,PowerPC,ARM和任何其他目标CPU的cross compiler。我做的这些东东是2004年做和整理的。可以看见各种版本与目前最新的偏低了。

/*
* Copyright (c) 2011, Huailin Chen
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
*    must display the following acknowledgement:
*      This product includes software developed by
*      the Huailin Chen and its contributors.
* 4. Neither the name of the Huailin Chen nor the names of its
*    contributors may be used to endorse or promote products derived from
*    this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS “AS IS” AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* Creation Date: 1/14/2004
* Author: Huailin Chen huailin@gmail.com
*
* $Id: build_script,v 1.1 2004/05/07 17:41:48 huailin Exp $
*/

########################################
PWD =
CPU =
########################################
#把下载的各个package展开后放在一个gnu_download目录里
#4个子目录,分别存放gcc,gdb,libc和binutil的原文件
BINUTILS_DIR =./gnu_download/binutils-2.9.1
GCC_DIR =./gnu_download/gcc-2.95.1
LIBC_DIR =./gnu_download/newlib-1.8.2
GDB_DIR =./gnu_download/gdb-5.0
###################################
TARGET_ARM =arm-elf
TARGET_MIPS_ELF=mips-elf
TARGET_PPC_EABI_ELF=powerpc-eabi
TARGET_SH_ELF =arm-elf
#TARGET_AMD
#TARGET_ALPHA
#TARGET_IA32
###################################
#PREFIX目录是最后的结果存放目录。要事先建好
#
PREFIX=$(PWD)/../arch/$(CPU)/tool-chain
TARGET = $(TARGET_ARM)
####################################
mkdir build-binutils build-gcc build-newlib build-gdb
cd build-binutils
$(BINUTILS_DIR)/configure –target=$(TARGET) –prefix=$(PREFIX) -v
make all install
pwd
# Configure, build and install gcc
cd build-gcc
$(GCC_DIR)/configure –target=$(TARGET) –prefix=$(PREFIX) –with-newlib  –with-headers=$(PWD)/gnu_download/$(LIBC)/newlib/libc/include –with-gnu-as –with-gnu-ld –enable-languages=”c”
-v
make all install
#Configure, build and install libc
pwd
cd ../build-newlib
$(LIBC_DIR)/configure –target=$(TARGET) –prefix=$(PREFIX) -v
make all install
#Configure, build and install gdb
pwd
cd ../build-gdb
$(GDB_DIR)/configure –target=$(TARGET) –prefix=$(PREFIX) -v
make all install
#Clear history directory/files
pwd
cd ..
rm -rf build-*
(4个打分, 平均:4.00 / 5)

雁过留声

“系统软件工程师实战攻略(体系结构篇)--(1)”有31个回复

  1. ztee 于 2011-12-10 3:27 下午

    这篇文章要不是首席写的,又得有人上来拍砖了

  2. 4zs 于 2011-12-10 4:21 下午

    首席封笔啊,别吓我!

  3. James 于 2011-12-10 6:03 下午

    >gcc-2.95.1

    故纸堆里面翻出来的脚本 :)

  4. 陈怀临 于 2011-12-10 6:13 下午

    James,可见我是老鸟呀。。。我第一次做cross compiler是2000年。这些东西是我2004年写和整理的。现在拿出来。。。

  5. hehehe 于 2011-12-10 7:37 下午

    01年做OS时在cygwin环境下搞过一次,当是还是GCC的3.X时代,做CROSS-COMPILE特费劲,而在CYGWIN的环境下搞更不容易。
    配合BOCHS虚拟机做OS或者找个MIPS/ARM的仿真器软件,再搭一个调试环境(当时在02年的时候有个不太完善的MIPS虚拟机,现在不知道发展的咋样了)对学生来说是非常不错的学习手段,硬件可以暂时不急着搞。
    另外,如果有WINDOWS CE PLATFORM BUILDER这个软件的话(在CE4.0左右的时候OEM厂商可以拿到),这些东西都有了,就是说你可以用微软的这个工具做自己的OS,并且像使用VC6一样方便…

  6. rogerz 于 2011-12-10 7:39 下午

    一个类似的但功能更强大一点的脚本。直接运行,自动下载源码并编译,下载过程还支持断点续传。

    https://github.com/esden/summon-arm-toolchain

  7. aaa 于 2011-12-10 8:50 下午

    请问各位 不太懂电路 可以进入嵌入式吗?一直犹豫中

  8. 雅各 于 2011-12-10 9:06 下午

    这个要顶阿

  9. DreamDreams 于 2011-12-10 9:35 下午

    抓你一个笔误: binutil -> binutils
    另外现在不需要自己整cross compiler了,down一个openwrt的包,全包含。
    如果只做到能编kenerl的Cross C compiler就更容易了。

    还有Gentoo有现成的玩法,可以很容易的cross compile出一个相对完整的系统出来。

  10. 凤姐 于 2011-12-10 10:03 下午

    标题让人看起来眼前一亮,但走进来一看,好像没有看到让人眼前一亮的东西。。。。唉,首席现在不玩实的了。。。

  11. 一条虫 于 2011-12-11 1:24 上午

    嗯。。。首席这个脚本做multilib cross会比较吃力。。

  12. ~~ 于 2011-12-11 5:46 上午

    系统软件工程师实战攻略 — 把软件二字去掉,更给力;再进一步,把系统也去调吧

  13. Rand 于 2011-12-11 6:14 上午

    首席这个脚本现在用怕是够呛,新版的gcc编译需要一些数学计算库,要自己手动配置下。其实现在用crosstool-ng这类工具来构建交叉编译器挺方便的,没必要自己写脚本了。

  14. 一日三省 于 2011-12-11 7:51 上午

    呵呵,期待首席的下文。

  15. 陈怀临 于 2011-12-11 11:00 上午

    我正在下载最新的gcc,gdb,binutil 和libc。从新做一遍。我对这个系列文章的要求是:每个代码都是在我的机器上运行过的。

  16. 大宋民工 于 2011-12-11 11:31 下午

    感觉首席对国内的人太低估了。
    这个国内能做的人如过江之鲫,当然论功力(很多可能是知其然不知其所以然)比硅谷肯定有差距。
    但是,我要提醒一下,华为的人并不代表国内的最高水平(我不是黑华为,只是觉得首席老是把华为当作国内的标杆,这个是使绝对错误的)。

  17. to楼上民工 于 2011-12-12 12:24 上午

    那你以为国内谁是标杆呢?呵呵。

  18. izixiu 于 2011-12-12 1:11 上午

    话说当年一直用首席做的toolchain,直到换存储的时候把首席的目录搞丢了,正好当时也要升级GDB,于是就重新做了一遍。。。

  19. anonymous 于 2011-12-12 1:47 上午

    只讲技术的话,千万别忽视小公司的人,很多技术都是在千奇百怪的问题和各种不合理的需求中磨练出来的.

  20. oj 于 2011-12-12 5:39 上午

    应聘的大把简历都会嵌入式linux交叉编译开发

  21. 沙加 于 2011-12-12 7:47 上午

    16楼,通读了一遍没读出来这篇文章有对国内人的低估啊?虽然是比较基础的东西。
    另外,怎么又扯华为那去了,跟这篇文章有关系吗?
    不知道是不是我没读仔细

  22. 陈怀临 于 2011-12-12 8:15 上午

    heeeee. 我的文章是写给学生或者刚出校门的。国内的国外的,其实都一样。 类似写《普通物理》,不是写给你们这些大牛看的:-)

  23. awei 于 2011-12-12 7:18 下午

    首席的强项在于:OS,处理器,芯片设计,编译器,网络等等.
    要是同时成为 高性能计算领域,存储领域,数据挖掘领域,搜索领域等专家. 那就好了, 弯曲上就能多些别的文章了.

  24. huhu 于 2011-12-12 11:22 下午

    这个嵌入式开发还是蛮多的,不过首席可是软硬通吃那种

  25. 大宋民工 于 2011-12-13 6:39 下午

    to楼上民工 于 2011-12-12 12:24 上午
    那你以为国内谁是标杆呢?呵呵。
    —————————–
    美国哪家公司是标杆?
    大家会说美国没有谁称的上标杆。
    中国呢?当然也没有。

    沙加 于 2011-12-12 7:47 上午
    16楼,通读了一遍没读出来这篇文章有对国内人的低估啊?虽然是比较基础的东西。
    另外,怎么又扯华为那去了,跟这篇文章有关系吗?
    不知道是不是我没读仔细
    —————————
    我的意思是说首席和华为的人接触比较多,
    写这篇文章很有可能是觉得国内的人这方面比较弱,当然首席自己出来说了是给刚入行的人看得,那是我弄错了。

  26. 大宋民工 于 2011-12-13 6:47 下午

    再补充几句,我接触过好几个硅谷来的搞技术的华人,在和国内国内的人合作过一段时间后都被震撼了。不是国内的人太强,而是他们太低估国内的水平了。

  27. 好荣幸阿 于 2011-12-13 7:03 下午

    同意。现在大宋和大辽的技术差距应该在缩小。也可能像王大师所说的大辽最近10年操作系统和处理器等没有什么新的创新。而大宋跟上的系统工程师的基数越来越多,在这个大的基数上再涌现出一些高水平的系统工程师也是很平常的。或许眼界没有大辽的技术牛人广,但是论系统软件的功力估计应该也相差不远了。

  28. 4zs 于 2011-12-13 8:29 下午

    @大宋民工
    能否介绍一个学习技术的好去处?

  29. 大宋民工 于 2011-12-13 9:16 下午

    4zs 于 2011-12-13 8:29 下午
    @大宋民工
    能否介绍一个学习技术的好去处?
    ——–
    什么去处?
    你是说哪家公司?

  30. 4zs 于 2011-12-14 3:27 上午

    都行,能学到东西就可以了

  31. 大宋民工 于 2011-12-14 5:38 下午

    4zs 于 2011-12-14 3:27 上午
    都行,能学到东西就可以了
    —————————-
    这个的话
    1 我只对上海的公司有一些了解,其他地方的不清楚
    2 如果是没有相关经验的人首推当然是华为,中兴,其次,思科,marvell(如果你进的去),但绝对不要去broadcom,爱立信。

    3 如果有些经验相获得提升的话,首推中兴,然后博达(虽然工资又低,老板又黑),光桥的老板开的那家(名字我不记得了,而且也比较黑),外企的话也就诺西,阿朗,思科,台企智邦也可以(工资也低)。

    4 建议你看看it企业速查那里的评论比我说的要翔实的多(虽然有部分下三滥公司的马甲在那里自吹自擂)。