关于SPARC处理器的10个小知识

距离1987Sun公司发布第一个基于SPARC处理器的工作站整整过去了30年,本文总结了关于SPARC处理器的10个小知识:
(1)SPARC代表Scalable Processor Architecture
(2)SPARC采用的是RISCReduced Instruction Set Computing)指令集;
(3)SPARC处理器项目开始于1984年,字长为32-bit,结构版本号为V7,首席架构师是Robert Garner
(4)第一款基于SPARC处理器的工作站Sun 4/260发布于1987年;
(5)1989年,Sun公司把SPARC规范的所有权转交给SPARC International, Inc. (“SI”),一个独立的,非盈利的负责管理和授权SPARC技术的机构;
(6)1992年发布的SuperSPARCSPARC V8)是第一个超标量(super scalar)处理器;
(7)1993年发布的SPARC V9,标志着处理器字长变为64-bit
(8)2015Oracle发布了第一个基于新的Oracle SPARC Architecture 2015规范的处理器:SPARC M7
(9)截止20174月,最新的SPARC商用高端处理器是Fujitsu公司的SPARC64 XII
(10)想了解更多SPARC处理器的知识,请访问:https://sparc.org

参考资料:
Chip Hall of Fame: Sun Microsystems SPARC Processor
1987 – 2017: SPARC Systems & Computing Epochs
Wikipedia SPARC
sparc.org

一个变量越界导致破坏堆栈的bug

前一段时间在商用系统上出现了core dump,原因是由于一个局部变量写越界导致堆栈被破坏了。在这里,我把这个bug分享一下,希望给需要的朋友一点帮助。简化的代码如下:

typedef struct
{
    ......
} A;

void func1(char *p)
{
    ......
}

void main(void)
{
    A a;
    A *p = &a;
    char b[10];

    ......
    /* 
     * 这个程序运行在SPARC处理器上, 而SPARC处理器的堆栈生长
     * 方向是从高地址向低地址生长的.
     * 这个函数里会把b这个数组写越界,导致p这个变量被破坏, 
     * 结果在下面访问p时,是一个无效的值,导致core dump.
     */
    func1(b);
    printf("%p\n", p);
    ......

    return;
}

通过分析这个bug,分享一下我的心得体会:
(1)SPARC处理器是当年SUN公司开发的一款RISC处理器,如果有朋友从事Solaris软件开发,应该还是会接触到的。我一直觉得作为底层软件工程师,还是应该对处理器结构(包括汇编语言)有尽可能多的了解,这样对我们分析和解决问题都会有很大帮助。比方说,在分析这个bug时,如果知道SPARC处理器的堆栈生长方向是从高地址向低地址生长的,就会让我们把注意力集中在变量定义在p后面的变量上,这样就有了分析问题的方向。在这里,我推荐一篇介绍SPARC处理器的文章(http://web.cecs.pdx.edu/~apt/cs577_2008/sparc_s.pdf),有兴趣的朋友可以看一下。
(2)当遇到堆栈上的变量被莫名其妙改变时,首先还是检查那些地址比被破坏变量地址低的变量。因为一般有可能引起内存越界的代码,像memcpy,都会破坏高地址的值。以这个bug为例。变量p在一开始就赋了值,以后对p都是读操作,没有写操作。现在p变成了一个无效的值,那么首先就应该怀疑访问定义在p后面的变量出了问题。