1. 程式人生 > >CPU定址方式與過程

CPU定址方式與過程

在看了上一篇轉載的文章後,自己也仔細搜尋研究了下關於CPU定址方面的東西,寫下來吧。

首先,說到定址,當然離不開各種各種匯流排啦,先來看下我們的計算機系統內的匯流排結構圖啦(下圖來自大話儲存)

 

如圖,主機板上的每個部件都是通過匯流排連線起來,其實,這些密密麻麻的先都是印刷在電路板上,這些線中,有一些是部件之間互動資料時候用的資料匯流排,有的是一些地址匯流排,用來確認通訊時候的目標裝置,一般按照資料匯流排的條數來確認一個匯流排或者裝置的位寬,比如32PCI匯流排,則表明這條匯流排總有32跟導線用於資料訊號的傳遞。CPU與北橋連線的匯流排叫前端匯流排,這個匯流排的傳輸頻率域CPU的自身頻率是不同的,匯流排頻率相當於

CPu向外存取資料時候的資料傳輸速率,而CPU自身的頻率則是CPu運算時候電路產生的頻率。前端匯流排的的條數就叫匯流排的位數,這個位數與CPU內粗你的位數是不同概念的(下面講到),大話儲存中說這個前端匯流排也叫系統匯流排,我覺得這是不妥的(見下面)。記憶體與北橋連線的匯流排叫做記憶體匯流排,由於北橋速度太多,而IO匯流排速度相對北橋西顯得太慢,所以北橋與IO匯流排之間,往往增加一個網橋叫做南橋,在南橋上一般集成了眾多外設的控制器,比如磁碟控制器,USB控制器等。

下面我們就來說說各個匯流排

A computer's bus can be divided into two different types, Internal and External.

The Internal Bus connects the different components inside the case: The CPU, system memory, and all other components on the motherboard. It's also referred to as the System Bus.

The External Bus connects the different external devices, peripherals, expansion slots, I/O ports and drive connections to the rest of the computer. In other words, the External Bus allows various devices to be added to the computer. It allows for the expansion of the computer's capabilities. It is generally slower than the system bus. Another name for the External Bus, is the Expansion Bus.

從這段話中,我們知道,一個計算機系統匯流排可以分為內部匯流排與外部匯流排,內部匯流排只要就是連線CPU,記憶體或者其他在母板上的部件,這麼說的話,連線CPU與記憶體的前端匯流排只是系統匯流排中的一種,系統匯流排應該還包括其他連線內部部件例如CPU內的運算部件與cache部件這些(好像這就交後端匯流排)。而外部匯流排相當於擴充套件了計算機的工呢過,使得更多的裝置可以接入計算機。

而外部匯流排也就是我們通常所說的IO匯流排,或者輸入輸出介面。

而從功能上來說,匯流排又主要分為資料線,地址線,控制線。

 data bus is a computer subsystem that allows for the transferring of data from one component to another on a motherboard or system board, or between two computers. This can include transferring data to and from the memory, or from the central processing unit (CPU) to other components. Each one is designed to handle so many bits of data at a time. The amount of data a data bus can handle is called bandwidth.

資料匯流排是計算機系統部件之間傳輸資料資訊的匯流排,包括從記憶體取資料,放資料到記憶體中,或者是從CPU到其他部件,而每次能傳輸的資料位數也就是資料匯流排的寬度了,也叫頻寬(我們一般用每秒傳輸多少位元組來表示)。

地址匯流排AB是專門用來傳送地址的,由於地址只能從CPU傳向外部儲存器或IO埠所以地址匯流排總是單向三態的這與資料匯流排不同。地址匯流排的位數決定了CPU可直接定址的記憶體空間大小。

這時候問題就來了,那麼他跟我們平時所說的CPU位數是否相關呢?答案是否的。(這也是我轉載的上篇文章中作者極力要向大家說明的問題)

當我們說一個CPU16位,32位,是指處理器中“算術邏輯單元(ALU)”的寬度,他代表的是CPU一次能並行處理的資料位數。也叫字長。而系統匯流排中的資料線部分,也就是資料匯流排,通常與ALU具有相同的寬度。

那麼地址匯流排寬度能,最自然的想法是與資料匯流排一致是最好的,而實際上這是不現實的,一般,8位的CPU的地址匯流排都是16位(這時候CPU的定址能力就是216次方也就是64K)。這就造成了CPU內部結構的不均勻性,在8CPU的指令系統中常常出現一些實際上是16位的操作,也就是雙字長操作。而在16CPU中,地址匯流排一般是20位達到1M的記憶體空間了。所以,CPU的位數與定址空間是沒有聯絡的,因為定址空間決定於地址匯流排,而地址匯流排與CPU位數是沒關係的。

而這時候,X80808位機,資料匯流排為8位,地址匯流排為16位。那麼這個地址資訊可以通過8位的資料匯流排傳送,在資料通道中暫存,以及在cpu中的暫存器(地址暫存器)和記憶體中存放,因為AB剛好是DB的整數倍。

但是而在X86系列中16位機,資料匯流排是16位但地址匯流排是20位,20位的地址資訊就不能再DB上傳輸,也不能在資料通道中暫存,以及在cpu中的暫存器(地址暫存器)和記憶體中存放。這時候就引出了段管理,邏輯地址,實體地址.Intel8086CPU中設定了四個段暫存器:CS DS SS ES ,分別用於可執行程式碼,資料,堆疊及其他,每個段暫存器都是16位的(注意,CPU位數,資料匯流排位數,CPU內部暫存器的位數一般都是一樣的)。引入段暫存器是為了讓CPU有更多的記憶體而又不用擴充套件暫存器和指令的位寬。用來告訴CPU一條程式指令將操作哪一個64K的的記憶體區塊,解決方案就是:你先載入段暫存器,相當於說,這兒,我打算操作開始於X處的記憶體區塊,之後再用16位 的記憶體地址來表示相對於那個記憶體區塊(或段)的偏移量。

CPU對記憶體的訪問是通過連線著CPU和北橋晶片的前端匯流排來完成的,在前端總線上傳輸的記憶體地址都是實體記憶體地址,編號從0一直到可用實體記憶體的最高階,這些數字被北橋對映到實際的記憶體條上,這些實體地址是明確的,最終用在總線上的編號,不必轉換,但是在CPU內部,程式所用的是邏輯記憶體地址【段識別符號:段內偏移量】,當CPU要執行一條引用了記憶體的指令時候,轉換就開始了。每一條會訪問記憶體的指令都隱式的使用了段暫存器。首先,將給定的一個邏輯地址(其實只是段內偏移量,這個一定要理解),CPU利用其段式記憶體管理單元,將LA轉換為一個線性地址,如果有頁式記憶體管理的話,再利用頁式記憶體管理單元,轉為最終的實體地址。否則第一步轉化的線性地址就是實際的實體地址。這裡要注意20位的實際地址的高16位對應的是段暫存器的內容,所以拿16位內部地址的高12位於段暫存器中的16位相加,而內部地址中的低四位保持不變。但是這樣沒有地址空間的保護機制,對於每一個由段暫存器的內容確定的基地址,一個程序能夠訪問從此開始的64K位元組的連續地址空間,而無法加以限制,同時因為用來改變段暫存器內容的指令也不是特權指令,這樣,使用者可以通過改變段暫存器內的內容,一個程序就可以隨心所欲的訪問記憶體中的任何一個單元,絲毫不受限制,所以為了區別後來的“保護模式”。這種就稱為“實地址模式”

針對上面說到的這個情況,於是從80386開始使用了保護模式,在保留段暫存器基礎上,增加了兩個段暫存器FSGS,為了實現保護模式,單用段暫存器確定一個基地址是不夠的,還得需要一個地址段的長度,還需要一些其他的例如訪問許可權之類的,這樣就需要一個數據結構而非單一的基地址了。這樣,將指令中發出的地址作為位移,與段描述結構中規定的段長度比較,看看是否越界。