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

前言

这个世界上,需要玩虚的;也需要玩实的;
活命需要玩实的。但不一定活的好;不一定活的开心;但可以活下去。
最高境界是玩虚的;但前提是银行帐号里银子要是实在的。。。
《系统软件工程师实战攻略(体系结构篇)》 的目的为嵌入式系统工程师,网络工程师,提供一些体系结构实战案例。目的是活命。所有的代码都是实践调试过的,具有产品级别的质量。版权是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-*


如何掌握一个CPU的ABI(Application Binary Interface)

在体系结构中,通常会说一个CPU的结构(Architecture),一个CPU的微结构(Micro-Architecture)。

是啥意思呢?

结构的意思就是那些程序员能看见的东东;微结构就是程序员不(太)需要关心的东西。

对能看得见的结构部分(例如,通用寄存器,控制寄存器,状态寄存器,中断或者例外寄存器)的使用方法,或者说编程模式,就是所谓的ABI。

掌握一个CPU的ABI,或者说编程界面,是一个基本功。是必须的。浅显说,就是那些寄存器的用法,分布和使用约定。

定义一个处理器的ABI,也是做编译器设计的第一个环节。笔者曾经设计过一个网络处理器的GCC的后端target。设计的第一个事情其实就是设计寄存器的约定。

这个章节里,主要具体谈如何掌握MIPS,PowerPC,Arm和x86的ABI。

一些相关的中文参考资料如下:

《PowerPC and Linux Kernel Inside》, 陈怀临,2002

《MIPS CPU 体系结构概述,Linux/MIPS内核》(上),陈怀临,张富新,2002

《MIPS CPU 体系结构概述,Linux/MIPS内核》(下),陈怀临,张富新,2002

《Linux PowerPC详解:核心篇》, 王齐, 2008[有没有网上电子版?]

《Arm 体系结构》,李曦

转载于:https://my.oschina.net/u/218425/blog/51774

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值