
从 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
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
| | 版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2007 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86263408 86263960 86264018 86267838 86262244 86263408 售前咨询:总机转201 202 203 204 205 206 207 208 售后服务:总机转211
212 213 214 217 218 晚上0点以后拔分机225 |
| 财务咨询:总机转224
223 传真:028-86264041 财务QQ: 635483282
售前咨询QQ: 327314358 241975952 275026793 408235859 2182518 499513144 售后服务QQ: 634349278 809071471 307742704 512359778 287976517 363783715 在线咨询
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号
|
|
|
|
|