標籤:

CPU怎樣對存儲器們進行讀寫?

在了解了計算機中的存儲器們之後,緊接著我們會有一些問題:CPU是怎樣去訪問內存地址空間的某一個地址的呢?接下來會以8086cpu架構作為例子來進行介紹(8086是老古董了,現代的CPU有i5架構的,還有i7架構的),之所以選擇8086是因為它結構比較簡單,適合上手,通過它學習到的概念,同樣可以對其他CPU進行舉一反三。

CPU要讀寫存儲器,總得需要有導線把它們連在一起吧?在計算機中,這種導線稱為匯流排,如果你拆過機箱就很清楚,它就是一根根的導線的集合,這些導線同時發送信號,每根導線要麼高電平,要麼低電平。匯流排按照功能的不同又分為地址匯流排,數據匯流排和控制匯流排。以上圖為例,CPU要讀取內存地址空間中地址為3的信息,大概分成以下步驟:

1. CPU向地址線輸出物理地址3

2. 控制線需要選擇相應的存儲設備,然後通知該設備,將要從中讀取數據

3. 該存儲設備會將數據8送入數據線

CPU寫信息到存儲器的過程類似。

我們把上面的圖放大,還可以再深入一點。

我們剛才說CPU和存儲設備之間有匯流排相連,其實CPU內部也是有匯流排的,它連接著CPU中不同的部件,比如寄存器,運算器,控制器。但是計算機中,不同匯流排的位數不一定是一樣的,比如8086CPU內部匯流排就是16位的,地址匯流排是20位的,數據匯流排是16位的。

那麼問題來了?既然8086CPU是16位結構的,怎樣才能做到輸出20位的物理地址呢?其實很簡單,地址加法器是這樣解決的:段地址(16位)x 16 + 偏移地址(16位)= 物理地址(20位),比如B800H x 16 + 1111H=B9000H。如果對16進位不太熟悉,那我們可以用熟悉的10進位來描述這個計算,比如家,學校,圖書館在一條直線上,他們之間的距離如圖所示,我們可以這樣跟朋友描述圖書館的距離:圖書館離家200m,這其實就是它的物理地址了。但現在有一些限制,我們和朋友之間只能通過紙條來通信,不巧的是,紙條上只能寫2位數,且紙條數量不限,於是我們約定規則:紙條1x10+紙條2=物理地址,比如在紙條1上寫11,紙條2上寫90,意思是說學校離家110m,圖書館離學校90m,這就ok了。而這2張紙條能表示的最遠距離為99x10+99=1089。

現在看來,這裡出現的段地址:偏移地址的概念,完全是因為8086CPU的硬體設計是這樣的。我們設想一下,如果8086CPU的內部匯流排是20位的,不就可以直接表示物理地址了嗎?!所以段地址:偏移地址的概念並不是關鍵,也許以後CPU硬體設計變了,採用完全不同的計算方式都說不定。

我們現在知道CPU是如何從內存讀取信息的了,但是CPU怎麼知道讀過來的信息到底是普通的數據還是需要被執行的程序呢?很簡單,我們知道CPU中有很多的寄存器(就是用來存放信息的),它指定了2個寄存器(分別叫CS, IP,CS用來存段地址,IP用來存偏移地址),讓它們來表示當前需要被執行的機器碼的物理地址,在執行代碼的過程中,CPU會去維護CS和IP的值,比如每執行一句機器碼,IP會增加相應的數值以指向下一句指令。以此類推,我們可以用其他的寄存器去表示數據的物理地址。所以說,內存中的二進位信息本來對CPU沒有區別,全靠約定好的寄存器裡面存放的地址,才得以區分程序和數據。

推薦閱讀:

無人駕駛操作系統(OS)
《深入理解計算機系統》配套實驗:Shell Lab
一基於事件處理的RTOS原型內核的介紹-2_概念與約定
系統突發性地磁碟佔有100%,資源管理器無限重啟
蘋果操作系統適用什麼人群?

TAG:操作系統 |