- 论坛徽章:
- 0
|
谢谢版主的解释!
有几个问题(均针对32-bit CPU):
1. 看Intel的文档,32-bit CPU的几个general-purpose registers均是32-bit的。虽然data path是64-bit的,但它怎样才能做到原子性的read or write 64-bit的数据呢?
2. 以64-bit的data path width为例,是否意味着在数据读取的时候,自动的将进程的地址空间分成8byte组了,比如0~7, 8~15, 16~23, ... ?
3. 从data path的角度理解,进程的地址是物理地址还是虚拟地址?我感觉应该是物理地址,但在程序中开发者怎么能够控制物理地址是否对其呢?
4. 按照描述,读取integer的时候,如果它没有达到doubleword boundary的要求,也有可能不时atomic的,对吗?比如下面的结构体:
typedef struct _TestStruct {
byte b1;
byte b2;
int i;
byte b3;
byte b4;
} TestStruct;
int main()
{
TestStruct test;
int result;
result = test.i; // Is this a atomic operation ?
}
|
4. 有时候是否可以从汇编代码直接看出是否是atomic操作。
以openspace的一个例子为例:
/* ull_demo.c */
int main(void)
{
unsigned long long target = 1;
unsigned long long tmp = target;
return 0;
} |
gcc -S ull_demo.c得到ull_demo.s
cat ull_demo.s
.file "ul_demo.c"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-8, %esp
subl $16, %esp
movl $1, (%esp) // 这两行是对target的赋值
movl $0, 4(%esp) // 一次设置32位,分两次
movl (%esp), %eax // 这两行是将64位值放到eax和edx中
movl 4(%esp), %edx
movl %eax, 8(%esp) // 这两行是将值赋给tmp变量
movl %edx, 12(%esp)
movl $0, %eax
leave
ret
.size main, .-main
.ident "GCC: (GNU) 4.4.2 20091027 (Red Hat 4.4.2-7)"
.section .note.GNU-stack,"",@progbits |
可以看出在操作64-bit的unsigned long long的时候,实际上对memory操作了两次,因此肯定不是atomic的,对吗?
[ 本帖最后由 rc_hz 于 2009-11-21 10:37 编辑 ] |
|