免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 4530 | 回复: 20

while (1) { i = 1; }在硬件级别的执行过程 [复制链接]

论坛徽章:
0
发表于 2010-01-14 13:24 |显示全部楼层
int i = 0;

while (1) { i = 1; }

请教大家:
如上语句在硬件级别的执行过程是怎么样的呢?
由于cpu的速度比内存快几个数量级,那么指令中在给变量i的地址反复赋值时
cpu怎么知道上一次赋的值已经被内存完好无损地保存下来了呢?然后再执行下一次
的赋值操作呢?

这个反复赋值的过程会不会被硬件电路合并呢?(比如cpu执行了第一个赋值操作,然后
马上又执行了第二个赋值操作,两次操作会不会只往内存中写一次呢??)

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
发表于 2010-01-14 13:30 |显示全部楼层
如果编译器是否把它优化到寄存器,那么这里就是一直在读写寄存器了。
如果是一个地址,那么
直接操作内存的速度会比较慢,所以CPU会采用cache的方式(chche的读写速度比内存读写要快),修改设置标志( dirty bit),以便将来回写。

论坛徽章:
0
发表于 2010-01-14 13:35 |显示全部楼层
版主同志,这里只考虑访问内存的情况,不考虑寄存器优化和cache优化

我就是不太明白cpu怎么知道上一次写的数据已经被某内存单元完好地保存了
从而开始下一次的写内存操作的

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
发表于 2010-01-14 13:42 |显示全部楼层
现在哪个CPU没cache的,不考虑cache,你要考虑什么?

论坛徽章:
0
发表于 2010-01-14 14:13 |显示全部楼层
同志们,我是想搞清楚cpu和内存之间传数据的具体过程
假设没有cache存在,只有cpu和内存

我是不明白cpu怎么知道上次写内存写成功了呢?

论坛徽章:
0
发表于 2010-01-14 14:20 |显示全部楼层
原帖由 redac 于 2010-1-14 13:35 发表
版主同志,这里只考虑访问内存的情况,不考虑寄存器优化和cache优化

我就是不太明白cpu怎么知道上一次写的数据已经被某内存单元完好地保存了
从而开始下一次的写内存操作的


在主机cpu与"内存"之间,通常用特定的北桥连接.

cpu读写"内存"时先通过前端总线发给北桥 , 具体由北桥存取"内存".

cpu芯片与北桥芯片是配套的, 之间有固定的电气协议 , 什么时候已经ready , 什么情况下该插入wait , 需要几个wait周期 , 彼此都有默契 . 北桥与"内存"之间也一样的.


嵌入式的cpu通常都有片内"内存"控制器 , 有的简单一些 , 有的甚至比主机系列的复杂 .


不管怎样, 一旦"内存"被初始化 , 确切地说一旦内存控制器被指令正确初始化后 , 硬件就会按照正确的时序工作 .

论坛徽章:
0
发表于 2010-01-14 14:44 |显示全部楼层
多谢老手兄

弟还有个初级问题,请大家多指教,在linux2.6内核自带的网卡驱动8139too.c文件中
有如下代码:

static void rtl8139_chip_reset (void *ioaddr)
{
        int i;

        /* Soft reset the chip. */
        RTL_W8 (ChipCmd, CmdReset);

        /* Check that the chip has finished the reset. */
        for (i = 1000; i > 0; i--) {
                barrier();
                if ((RTL_R8 (ChipCmd) & CmdReset) == 0)
                        break;
                udelay (10);
        }
}

它这里在循环读寄存器时进行udelay是什么意思呢?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
发表于 2010-01-14 14:49 |显示全部楼层
原帖由 redac 于 2010-1-14 14:13 发表
同志们,我是想搞清楚cpu和内存之间传数据的具体过程
假设没有cache存在,只有cpu和内存

我是不明白cpu怎么知道上次写内存写成功了呢?

CPU不知道,CPU只知道按照协议办事情

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
发表于 2010-01-14 15:54 |显示全部楼层
原帖由 redac 于 2010-1-14 14:44 发表
多谢老手兄

弟还有个初级问题,请大家多指教,在linux2.6内核自带的网卡驱动8139too.c文件中
有如下代码:

static void rtl8139_chip_reset (void *ioaddr)
{
        int i;

        /* Soft rese ...


估计是循环检测RTL_R8 (ChipCmd)的CmdReset位是否被重置,最多等待1000 * 10us,这样分段delay检测可以降低CPU使用率,因为检测一下标志位的时间远小于10us,所以CPU绝大多数时间在udelay中。

论坛徽章:
0
发表于 2010-01-14 15:55 |显示全部楼层
原帖由 redac 于 2010-1-14 14:44 发表
...

        for (i = 1000; i > 0; i--) {
                barrier();
                if ((RTL_R8 (ChipCmd) & CmdReset) == 0)
                        break;
                udelay (10);
        }
}

它这里在循环读寄存器时进行udelay是什么意思呢?


你的意思是为什么这里要delay , 而存取内存就不用 ? 应该是这样吧 ?

其实就8139来说 , 你用不用udelay也没关系啊 , 它不会因为你没delay而使劲判断它的状态寄存器导致挂掉.

就像你们想出门, 明知你的朋友化妆还要10分钟以上, 你是选择隔一段呢还是在一直不停的催促 , 况且你是在公共电话打的 , 还有别人想打电话呢?!

其实存取内存也是可以有delay的 ,但起码有2点不同:
   形式不同,一个是电气的形式一个以指令形式的表现 ;
   delay量级不同 , 如果内存是按秒算的 , 那么等8139复位可能得等好多年. 这还算多 , 让硬盘工作起来可能得等一辈子了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP