在了解了計算機中的存儲器之后,緊接著我們會有一些問題:CPU是怎樣去訪問內(nèi)存地址空間的某一個地址的呢薄风?接下來會以8086cpu架構(gòu)作為例子來進(jìn)行介紹(8086是老古董了,現(xiàn)代的CPU有i5架構(gòu)的拍嵌,還有i7架構(gòu)的)遭赂,之所以選擇8086是因為它結(jié)構(gòu)比較簡單,適合上手横辆,通過它學(xué)習(xí)到的概念撇他,同樣可以對其他CPU進(jìn)行舉一反三。
CPU要讀寫存儲器狈蚤,總得需要有導(dǎo)線把它們連在一起吧困肩?在計算機中,這種導(dǎo)線稱為總線脆侮,如果你拆過機箱就很清楚锌畸,它就是一根根的導(dǎo)線的集合,這些導(dǎo)線同時發(fā)送信號靖避,每根導(dǎo)線要么高電平潭枣,要么低電平』媚螅總線按照功能的不同又分為地址總線盆犁,數(shù)據(jù)總線和控制總線。以上圖為例篡九,CPU要讀取內(nèi)存地址空間中地址為3的信息谐岁,大概分成以下步驟:
1.CPU向地址線輸出物理地址3
2.控制線需要選擇相應(yīng)的存儲設(shè)備,然后通知該設(shè)備,將要從中讀取數(shù)據(jù)
3.該存儲設(shè)備會將數(shù)據(jù)8送入數(shù)據(jù)線
CPU寫信息到存儲器的過程類似伊佃。
我們把上面的圖放大窜司,還可以再深入一點。
我們剛才說CPU和存儲設(shè)備之間有總線相連锭魔,其實CPU內(nèi)部也是有總線的例证,它連接著CPU中不同的部件,比如寄存器迷捧,運算器织咧,控制器。但是計算機中漠秋,不同總線的位數(shù)不一定是一樣的笙蒙,比如8086CPU內(nèi)部總線就是16位的,地址總線是20位的庆锦,數(shù)據(jù)總線是16位的捅位。
那么問題來了?既然8086CPU是16位結(jié)構(gòu)的搂抒,怎樣才能做到輸出20位的物理地址呢艇搀?其實很簡單,地址加法器是這樣解決的:段地址(16位)x 16 + 偏移地址(16位)= 物理地址(20位)求晶,比如B800H x 16 + 1111H=B9000H焰雕。如果對16進(jìn)制不太熟悉,那我們可以用熟悉的10進(jìn)制來描述這個計算芳杏,比如家矩屁,學(xué)校,圖書館在一條直線上爵赵,他們之間的距離如圖所示吝秕,我們可以這樣跟朋友描述圖書館的距離:圖書館離家200m,這其實就是它的物理地址了空幻。但現(xiàn)在有一些限制烁峭,我們和朋友之間只能通過紙條來通信,不巧的是秕铛,紙條上只能寫2位數(shù)则剃,且紙條數(shù)量不限,于是我們約定規(guī)則:紙條1x10+紙條2=物理地址如捅,比如在紙條1上寫11棍现,紙條2上寫90,意思是說學(xué)校離家110m镜遣,圖書館離學(xué)校90m己肮,這就ok了士袄。而這2張紙條能表示的最遠(yuǎn)距離為99x10+99=1089。
現(xiàn)在看來谎僻,這里出現(xiàn)的段地址:偏移地址的概念娄柳,完全是因為8086CPU的硬件設(shè)計是這樣的。我們設(shè)想一下艘绍,如果8086CPU的內(nèi)部總線是20位的赤拒,不就可以直接表示物理地址了嗎?诱鞠!所以段地址:偏移地址的概念并不是關(guān)鍵挎挖,也許以后CPU硬件設(shè)計變了,采用完全不同的計算方式都說不定航夺。
我們現(xiàn)在知道CPU是如何從內(nèi)存讀取信息的了蕉朵,但是CPU怎么知道讀過來的信息到底是普通的數(shù)據(jù)還是需要被執(zhí)行的程序呢?很簡單阳掐,我們知道CPU中有很多的寄存器(就是用來存放信息的)始衅,它指定了2個寄存器(分別叫CS, IP,CS用來存段地址缭保,IP用來存偏移地址)汛闸,讓它們來表示當(dāng)前需要被執(zhí)行的機器碼的物理地址,在執(zhí)行代碼的過程中艺骂,CPU會去維護CS和IP的值诸老,比如每執(zhí)行一句機器碼,IP會增加相應(yīng)的數(shù)值以指向下一句指令彻亲。以此類推孕锄,我們可以用其他的寄存器去表示數(shù)據(jù)的物理地址吮廉。所以說苞尝,內(nèi)存中的二進(jìn)制信息本來對CPU沒有區(qū)別,全靠約定好的寄存器里面存放的地址宦芦,才得以區(qū)分程序和數(shù)據(jù)宙址。