从 Solaris 迁移到 x86 上的 Linux 指南

转自:IBMdeveloperWorks

Solaris 被认为是风格和 Linux™ 最为接近的一种 UNIX®,但是对于程式的迁移来说,他们在诸如内存映射、线程连同对自然语言的支持等领域还是有很大区别的。这个移植指南能够为您在计划将程式移植到 Linux/x86 上时提供一些建议,并且帮助您理解研发环境和体系架构之间的区别。

内容:
int get_stack(void **StackPtr) { *StackPtr = 0; __asm__ __volatile__ ("movl %%esp, %0": "=m" (StackPtr) ); return(0); }
移植规划
研发环境
体系架构和系统特有的区别
结束语

在 Solaris,下面这段示例代码让您能够获取堆栈指针:

清单 2. 在 Solaris 上获取堆栈指针


        .section       ".text"

        .align  8

        .global my_stack

        .type   my_stack,2

my_stack:

        ! Save stack pointer through 1st parameter

        st      %sp,[%o0]

        ! Compute size of frame in return result reg

        retl

        sub     %fp,%sp,%o0

        .size  my_stack,(.-my_stack)

在 Linux x86 上,您能够使用一个 compare 和 swap 操作来实现原子锁。例如,下面是 Linux x86 上使用 compare 和 swap 操作的一个简单实现:

清单 3. Linux x86 上的 Compare 和 swap 操作


bool_t My_CompareAndSwap(IN int *ptr, IN int old, IN int new)

{



        unsigned char ret;



        /* Note that sete sets a 'byte' not the word */



        __asm__ __volatile__ (

                "  lock\n"

                "  cmpxchgl %2,%1\n"

                "  sete %0\n"

                : "=q" (ret), "=m" (*ptr)

                : "r" (new), "m" (*ptr), "a" (old)

                : "memory");



        return ret;



}

在 Solaris SPARC 上,加锁的原子操作能够如下实现:

清单 4. Solaris 上的原子锁


        .section       ".text"

        .align  8

        .global        My_Ldstub

        .type          My_Ldstub,2

My_Ldstub:

        ldstub         [%o0],%o0         ! Atomic load   set

        sll            %o0,24,%o0        ! Zero fill ...

        retl                             ! ... result register

        srl            %o0,24,%o0        ! ... and retrn

        .size          My_Ldstub,(.-My_Ldstub)

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!