在了解了計算機中的儲存器之後,緊接著我們會有一些問題:cpu是怎樣去訪問記憶體位址空間的某乙個位址的呢?接下來會以8086cpu架構作為例子來進行介紹(8086是老古董了,現代的cpu有i5架構的,還有i7架構的),之所以選擇8086是因為它結構比較簡單,適合上手,通過它學習到的概念,同樣可以對其他cpu進行舉一反三。
cpu要讀寫儲存器,總得需要有導線把它們連在一起吧?在計算機中,這種導線稱為匯流排,如果你拆過機箱就很清楚,它就是一根根的導線的集合,這些導線同時傳送訊號,每根導線要麼高電平,要麼低電平。匯流排按照功能的不同又分為位址匯流排,資料匯流排和控制匯流排。以上圖為例,cpu要讀取記憶體位址空間中位址為3的資訊,大概分成以下步驟:
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。
我們現在知道cpu是如何從記憶體讀取資訊的了,但是cpu怎麼知道讀過來的資訊到底是普通的資料還是需要被執行的程式呢?很簡單,我們知道cpu中有很多的暫存器(就是用來存放資訊的),它指定了2個暫存器(分別叫cs, ip,cs用來存段位址,ip用來存偏移位址),讓它們來表示當前需要被執行的機器碼的實體地址,在執行**的過程中,cpu會去維護cs和ip的值,比如每執行一句機器碼,ip會增加相應的數值以指向下一句指令。以此類推,我們可以用其他的暫存器去表示資料的實體地址。所以說,記憶體中的二進位制資訊本來對cpu沒有區別,全靠約定好的暫存器裡面存放的位址,才得以區分程式和資料。
1 7CPU對儲存器的讀寫
在上節的課程中講到,儲存器被劃分成多個儲存單元,儲存單元從零開始順序編號。這些編號,可以看做是在儲存器中的位址。就像一條街,每個房子都有門牌號。cpu要從記憶體中讀取資料,首先要指定儲存單元的位址。也就是說,它要先確定它要讀取哪乙個儲存單元中的資料。就像在一條街上找人,先要確定他住在哪個房子裡。另外...
作業系統中儲存器管理及CPU對儲存器的訪問
在做uboot移植的時候對 的重定向產生乙個疑問,不理解為什麼把uboot讀到以鏈結位址作為起始位址的sdarm記憶體空間。對鏈結位址 虛擬位址 實體地址也傻傻分不清,後來學習計算機組成原理中的虛擬儲存器時了解到虛位址 邏輯位址 實位址 實體地址 以後我就認為鏈結位址就是虛擬位址。在學習了作業系統中...
CPU與儲存器
上文說到計算機的組成。計算機誕生初期的功能就是代替人工進行大資料量的運算。人們善於思考,但是不善於複雜重複的計算,因而這些任務就都交給計算機來做。如果一開始就做高階程式語言的開發工作,而對計算機底層的知識了解甚少,那麼很容易產生知識盲點,而且當知識進步,程式語言變化的時候,會產生 技術變化的太快,跟...