免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: iterator
打印 上一主题 下一主题

修改指针值的操作是一个原子操作? [复制链接]

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
31 [报告]
发表于 2008-05-20 19:45 |只看该作者
楼上的朋友不妨自己试试运行前面引用的关于int *p的代码,看看汇编,ok?  我前面说过,arm+gcc3.x并不是所有的非对齐操作都可以由编译器处理.所以不用尝试把*str传给printf

论坛徽章:
0
32 [报告]
发表于 2008-05-21 14:21 |只看该作者

回复 #12 zx_wing 的帖子

学习了,

谢谢, 学习态度,精神可嘉阿

论坛徽章:
0
33 [报告]
发表于 2008-05-22 13:58 |只看该作者
好深奥呀,

论坛徽章:
0
34 [报告]
发表于 2008-05-25 21:40 |只看该作者
不对齐的访问,当然不是原子的,都会产生异常,何处理异常由处理器,操作系统和编译器共同完成。
不同的平台
X86允许不对齐的访问,当然代价是要多次访问内存。(可以认为产生了异常,只不过此异常有处理器自己处理)
大部分RISC会产生BUS ERROR,由操作系统处理,或者把异常把异常给用户程序。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

static void
handle_sigbus(int sig)
{
        printf("SIGBUS captured\n");
        exit(1);
}

int
main(void)
{
        char     buf[256] = {0};
        int     *p = (int *)&buf[1];

        signal(SIGBUS, handle_sigbus);

        *p = 0;

        return 0;
}

以Sun Studio的cc手册是这么写的
-xmemalign=ab
          Accepted values for a are:

               1    Assume at most 1 byte alignment.

               2    Assume at most 2 byte alignment.

               4    Assume at most 4 byte alignment.

               8    Assume at most 8 byte alignment.

               16   Assume at most 16 byte alignment.

          Accepted values for b are:

               i    Interpret access and continue execution.

               s    Raise signal SIGBUS.

               f    For variants of -xarch=v9 only. Raise signal
                    SIGBUS for alignments less than or equal to
                    4, otherwise interpret access and continue
                    execution. For all other -xarch values, the f
                    flag is equivalent to i.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP