亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: while (1) { i = 1; }在硬件級別的執(zhí)行過程 [打印本頁]

作者: redac    時間: 2010-01-14 13:24
標(biāo)題: while (1) { i = 1; }在硬件級別的執(zhí)行過程
int i = 0;

while (1) { i = 1; }

請教大家:
如上語句在硬件級別的執(zhí)行過程是怎么樣的呢?
由于cpu的速度比內(nèi)存快幾個數(shù)量級,那么指令中在給變量i的地址反復(fù)賦值時
cpu怎么知道上一次賦的值已經(jīng)被內(nèi)存完好無損地保存下來了呢?然后再執(zhí)行下一次
的賦值操作呢?

這個反復(fù)賦值的過程會不會被硬件電路合并呢?(比如cpu執(zhí)行了第一個賦值操作,然后
馬上又執(zhí)行了第二個賦值操作,兩次操作會不會只往內(nèi)存中寫一次呢??)
作者: cjaizss    時間: 2010-01-14 13:30
如果編譯器是否把它優(yōu)化到寄存器,那么這里就是一直在讀寫寄存器了。
如果是一個地址,那么
直接操作內(nèi)存的速度會比較慢,所以CPU會采用cache的方式(chche的讀寫速度比內(nèi)存讀寫要快),修改設(shè)置標(biāo)志( dirty bit),以便將來回寫。
作者: redac    時間: 2010-01-14 13:35
版主同志,這里只考慮訪問內(nèi)存的情況,不考慮寄存器優(yōu)化和cache優(yōu)化

我就是不太明白cpu怎么知道上一次寫的數(shù)據(jù)已經(jīng)被某內(nèi)存單元完好地保存了
從而開始下一次的寫內(nèi)存操作的
作者: w_anthony    時間: 2010-01-14 13:42
現(xiàn)在哪個CPU沒cache的,不考慮cache,你要考慮什么?
作者: redac    時間: 2010-01-14 14:13
同志們,我是想搞清楚cpu和內(nèi)存之間傳數(shù)據(jù)的具體過程
假設(shè)沒有cache存在,只有cpu和內(nèi)存

我是不明白cpu怎么知道上次寫內(nèi)存寫成功了呢?
作者: 老手    時間: 2010-01-14 14:20
原帖由 redac 于 2010-1-14 13:35 發(fā)表
版主同志,這里只考慮訪問內(nèi)存的情況,不考慮寄存器優(yōu)化和cache優(yōu)化

我就是不太明白cpu怎么知道上一次寫的數(shù)據(jù)已經(jīng)被某內(nèi)存單元完好地保存了
從而開始下一次的寫內(nèi)存操作的


在主機cpu與"內(nèi)存"之間,通常用特定的北橋連接.

cpu讀寫"內(nèi)存"時先通過前端總線發(fā)給北橋 , 具體由北橋存取"內(nèi)存".

cpu芯片與北橋芯片是配套的, 之間有固定的電氣協(xié)議 , 什么時候已經(jīng)ready , 什么情況下該插入wait , 需要幾個wait周期 , 彼此都有默契 . 北橋與"內(nèi)存"之間也一樣的.


嵌入式的cpu通常都有片內(nèi)"內(nèi)存"控制器 , 有的簡單一些 , 有的甚至比主機系列的復(fù)雜 .


不管怎樣, 一旦"內(nèi)存"被初始化 , 確切地說一旦內(nèi)存控制器被指令正確初始化后 , 硬件就會按照正確的時序工作 .
作者: redac    時間: 2010-01-14 14:44
多謝老手兄

弟還有個初級問題,請大家多指教,在linux2.6內(nèi)核自帶的網(wǎng)卡驅(qū)動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);
        }
}

它這里在循環(huán)讀寄存器時進行udelay是什么意思呢?
作者: cjaizss    時間: 2010-01-14 14:49
原帖由 redac 于 2010-1-14 14:13 發(fā)表
同志們,我是想搞清楚cpu和內(nèi)存之間傳數(shù)據(jù)的具體過程
假設(shè)沒有cache存在,只有cpu和內(nèi)存

我是不明白cpu怎么知道上次寫內(nèi)存寫成功了呢?

CPU不知道,CPU只知道按照協(xié)議辦事情
作者: w_anthony    時間: 2010-01-14 15:54
原帖由 redac 于 2010-1-14 14:44 發(fā)表
多謝老手兄

弟還有個初級問題,請大家多指教,在linux2.6內(nèi)核自帶的網(wǎng)卡驅(qū)動8139too.c文件中
有如下代碼:

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

        /* Soft rese ...


估計是循環(huán)檢測RTL_R8 (ChipCmd)的CmdReset位是否被重置,最多等待1000 * 10us,這樣分段delay檢測可以降低CPU使用率,因為檢測一下標(biāo)志位的時間遠小于10us,所以CPU絕大多數(shù)時間在udelay中。
作者: 老手    時間: 2010-01-14 15:55
原帖由 redac 于 2010-1-14 14:44 發(fā)表
...

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

它這里在循環(huán)讀寄存器時進行udelay是什么意思呢?


你的意思是為什么這里要delay , 而存取內(nèi)存就不用 ? 應(yīng)該是這樣吧 ?

其實就8139來說 , 你用不用udelay也沒關(guān)系啊 , 它不會因為你沒delay而使勁判斷它的狀態(tài)寄存器導(dǎo)致掛掉.

就像你們想出門, 明知你的朋友化妝還要10分鐘以上, 你是選擇隔一段呢還是在一直不停的催促 , 況且你是在公共電話打的 , 還有別人想打電話呢?!

其實存取內(nèi)存也是可以有delay的 ,但起碼有2點不同:
   形式不同,一個是電氣的形式一個以指令形式的表現(xiàn) ;
   delay量級不同 , 如果內(nèi)存是按秒算的 , 那么等8139復(fù)位可能得等好多年. 這還算多 , 讓硬盤工作起來可能得等一輩子了.
作者: redac    時間: 2010-01-14 16:57
把時間的范圍拉大,可能就稍微好理解一點了,不知道如下理解有沒有問題???

1.假設(shè)cpu在1秒時間內(nèi)能發(fā)起100次寫內(nèi)存操作,而從cpu發(fā)出寫內(nèi)存操作到數(shù)據(jù)真正
  存儲到內(nèi)存中需要1秒的話,從cpu發(fā)出讀內(nèi)存操作到數(shù)據(jù)真正從內(nèi)存讀到cpu自己的
  寄存器中也需要1秒的話,那么如下的指令序列:
  mov eax, mem  // 讀內(nèi)存
  mov mem, eax  // 寫內(nèi)存
  就需要執(zhí)行2秒鐘,且寫匯編(或機器語言)的人并不需要關(guān)心內(nèi)存是否讀/寫成功的
  問題(讀寫一定由硬件執(zhí)行成功了)。但執(zhí)行第一條指令之后,cpu休息了999倍的時間,
  才自動在第2秒開始執(zhí)行寫內(nèi)存操作(也就是說在硬件電氣上cpu和內(nèi)存之間遵守了cjaizss
  兄的所說的“協(xié)議”)
2.對于8139網(wǎng)卡的驅(qū)動來說,執(zhí)行完
  RTL_W8 (ChipCmd, CmdReset);
  這一句后,其后再執(zhí)行的指令會自動等事實上網(wǎng)卡的控制寄存器中已經(jīng)寫入了我們
  所希望寫入的值后才去真正開始執(zhí)行(類比于第1點)(無論RTL_W8還是RTL_R8
  最終不是都要翻譯成匯編的形式?)

  也就是說
  RTL_W8和RTL_R8之間不需要udelay(10) ??? 因為硬件已經(jīng)保證了這個語義???

  那么這里執(zhí)行的udelay是什么意思呢?還是有點模棱兩可啊

[ 本帖最后由 redac 于 2010-1-14 16:59 編輯 ]
作者: redac    時間: 2010-01-14 16:58
諸位高手多出招啊,困擾很長時間的問題了。
作者: haohao_h    時間: 2010-01-14 17:07
首先你說的怎樣知道操作已經(jīng)完成了?這個問題是由總線來保證的,總線有協(xié)議保證,不會我一次操作還沒完成,第二次操作又覆蓋上來了!

你舉的那個網(wǎng)卡的例子里,里面的delay不是用來保證硬件操作不出錯,而是為了不讓cpu“杯具”!^_^!
作者: redac    時間: 2010-01-14 17:17
haohao_h兄,啥是cpu“杯具”?^_^?
作者: haohao_h    時間: 2010-01-14 17:22
我靠!土人!
這年頭連“杯具”都不知道!out了!
作者: redac    時間: 2010-01-14 17:34
OUT, 出局!

食神上的經(jīng)典場景啊,哈哈。。。
作者: beepbug    時間: 2010-01-14 18:31
一個指令周期內(nèi)含若干個時鐘周期。先是讀指令第一字節(jié),此時譯碼器譯出操作碼并確定該指令共有幾個字節(jié),逐次讀入CPU,生成操作數(shù)地址,然后執(zhí)行指令,做寫操作。再讀下一條指令。。。
指令是流水執(zhí)行的。
如果有流水線,在執(zhí)行這條指令時,已讀入了下一條指令,但不會執(zhí)行。
只有并行CPU體系結(jié)構(gòu),才真正同時執(zhí)行幾條指令。
至于是不是真正寫入了內(nèi)存,與時間沒關(guān)系,只與內(nèi)存質(zhì)量有關(guān)。過去的內(nèi)存,有校驗位,F(xiàn)在為了不影響速度,沒有了。
作者: w_anthony    時間: 2010-01-14 23:36
原帖由 redac 于 2010-1-14 16:57 發(fā)表
那么這里執(zhí)行的udelay是什么意思呢?還是有點模棱兩可啊


不就降低CPU使用率以及控制總時間么?還能干什么?
作者: redac    時間: 2010-01-15 10:20
還有一個問題,煩請各位高手不吝賜教啊。

假如網(wǎng)卡寄存器的訪問速度是1小時
就是說: 從cpu發(fā)出寫網(wǎng)卡寄存器指令,到這個數(shù)據(jù)真正寫入網(wǎng)卡寄存器
需要1個小時的時間

假如內(nèi)存的訪問速度是1分鐘
就是說: 從cpu發(fā)出寫內(nèi)存指令,到這個數(shù)據(jù)真正寫入內(nèi)存
需要1分鐘的時間

那么假如現(xiàn)在有一個指令序列:
1.寫網(wǎng)卡寄存器
2.寫內(nèi)存

那么是否意味著從cpu發(fā)出寫網(wǎng)卡寄存器指令,到發(fā)出寫內(nèi)存指令,之間
需要間隔1個小時的時間呢??? 在這1個小時的時間里cpu只是一直在
等待?
作者: 老手    時間: 2010-01-15 13:05
簡單的系統(tǒng)確實就是這樣的 , 復(fù)雜的體系如果從cpu的角度來看也是這樣 , 但時間不能這么絕對化 .
作者: beepbug    時間: 2010-01-15 18:47
原帖由 redac 于 2010-1-15 10:20 發(fā)表
還有一個問題,煩請各位高手不吝賜教。!

假如網(wǎng)卡寄存器的訪問速度是1小時
就是說: 從cpu發(fā)出寫網(wǎng)卡寄存器指令,到這個數(shù)據(jù)真正寫入網(wǎng)卡寄存器
需要1個小時的時間

假如內(nèi)存的訪問速度是1分鐘
就是 ...

一般是繼續(xù)往下執(zhí)行。除非很特殊的場合,你有這需求。CPU訪問外設(shè)都這樣。




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2