/* Are we big-endian? */
#include
#if __BYTE_ORDER == __LITTLE_ENDIAN
#define MY_BIG_ENDIAN
#elif __BYTE_ORDER == __BIG_ENDIAN
#undef MY_BIG_ENDIAN
#endif
确定栈指针
可以编写内联程序集(inline assembly)来确定栈指针。
int get_stack(void **StackPtr)
{
*StackPtr = 0;
#ifdef CMP_x86
__asm__ __volatile__ ("movl %%esp, %0": "=m" (StackPtr) );
#else
#error No code for this architecture in __FILE__
#endif
return(0);
}
实现比较与交换
这里是为Intel体系结构实现比较与交换的一个示例。
bool_t My_CompareAndSwap(IN int *ptr, IN int old, IN int new)
{
#ifdef CMP_x86
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;
#else
#error No code for this architecture in __FILE__
#endif
}
可选的线程模型包括native Linux threads和Native POSIX Thread Library(NPTL)实现,后者为Linux中的线程提供了与POSIX兼容的实现。Linux内核(从2.5版本起)已经得到修改,具备了POSIX兼容支持。在SLES9中NPTL是可用的。Red Hat已经为RHEL3(它基于Linux2.4 内核)反向移植(backport)了NPTL支持。RHEL 3既支持NPTL也支持native Linux threads。可以通过设置环境变量LD_ASSUME_KERNEL=2.4.1切换到native Linux threads,但是很多提供商都已经将他们的软件移植到了支持NPTL的RHEL3上。