記憶體管理與「三位址」的千絲萬縷(1)

2021-06-06 23:35:14 字數 3126 閱讀 4876

記憶體管理與「三位址」的千絲萬縷(1)

前記:我先談一下一點很深的體會:你有時候會為某個知識點在那絞盡腦汁地想解決,但是我通過這階段的學習知道,有時候想不通乙個問題,也許是自己的知識積累不夠造成的,所以這時請你不要急躁,迷茫。請你靜下心來好好再把這個問題涉及的知識點看看,多找點書看,當你能夠

融會貫通

的時候,你便能輕而易舉地解決掉它了,

不管你信不信,反正我是信了!

祝有志於在嵌入式方面一展巨集圖的你能夠事事順心!

開始我宣告幾點:

① 、這裡的

cpu都是以

pentium(32

位)或是

8086(20

位)為例子的,記憶體管理則指的是

arm9

或pentium

② 、由於知識所限,所提到的內容是自己的理解,所以很有可能會有錯誤,請大家指正。

③ 、我們先了解幾個在

linux

或是arm

中遇到的重要概念,這對於讀核心或是熟悉

arm的硬體架構很有好處。

a、位元組對齊。16

位的cpu

其位址匯流排有

20根,所以其最大定址為

1mb,也就是說此時的內部儲存器(記憶體,不要告訴我說不知道記憶體是指什麼啊)最大只能是

1mb,大了

cpu找不到其他的空間(這在當時,也就是

1978

年,1mb

已經是很大了)。其位址範圍應該是從

0x00000~0xfffff

(注意了,這便是傳說中的

實體地址

了)!intel

是這樣組織記憶體的:整個記憶體由兩個

512kb

的儲存體組成,乙個為奇位址儲存體(就是位址的最低位必須為

1的儲存空間),另外乙個當然是偶位址儲存體了(這個定義大家想必也能知道吧,這就叫舉一反三),具體見圖1。

這樣16

位的cpu

對儲存器的訪問就有按位元組訪問與按字訪問。其中

nbhe

(知道n

的意思吧

?那是指低電平有效,這在

arm的管腳圖中隨處可見)和

a0來選擇是否對奇

/偶儲存體操作。詳細見表

1。所以按字訪問時就有對齊和非對齊兩種方式,字的對齊方式要求起始位址為偶位址,比如要訪問的位址為

0x00010

,那麼用乙個匯流排週期就可以往該位址寫進或讀出

d0~d15

0x00011

,那麼第乙個匯流排週期將往奇位址儲存體操作(讀或寫)乙個位元組,等另乙個匯流排週期才往

0x00012

操作高八位資料。所以這樣就浪費了時間,因此程式設計時盡量用

偶位址訪問!!

位的cpu

記憶體組織形式

a0nbhe

操作方式 0

1按位元組訪問偶位址儲存體,資料在

d0~d7傳輸

1 0

按位元組訪問奇位址儲存體,資料在

d8~d15傳輸

0 0

按字訪問奇偶儲存體,資料在

d0~d15傳輸

1 1

不能訪問任何儲存體

表1:a0與

nbhe

的搭配方式

下面講的是

32位的

cpu的記憶體組織,其他我就不再詳細講解了,和

16位的類似,只不過位址線成了

32根,其記憶體組織形式見圖

2:總共有

4個儲存體,可以組成雙字的形式,

32位儲存體要滿足對8位、

16位、

32位各種規格的資料訪問。同樣,這也有字對齊與非對齊的方式,另外增加了雙字對齊的,

那就是要求起始位址是4

的倍數(比如

0******100

),如果用奇位址進行字訪問,或不是用

4的倍數的位址進行雙字訪問,就會造成非對齊狀態,這時需要

2個匯流排週期完成字的傳輸或雙字傳輸。

比如要訪問位址

0x0000 0006

的雙字,

cpu認為此雙字在6、

7、8、

9這四個儲存單元中,在傳輸時

cpu會用第乙個匯流排週期訪問6、

7儲存體,再用乙個匯流排週期訪問8、

9儲存體。這同樣浪費了時間,不可取!!以上就是字與雙字對齊的解析,不知你明白了嗎?

2:32位

cpu的記憶體組織形式

(自己做的,有點粗糙,情大家諒解)

b或稱虛擬位址

,這時程式設計師所看到的位址,也就是你程式設計時寫的位址(這下知道了吧,原來自己經常寫的位址竟然是虛的,沒錯!)

,注意!記住前提條件是在

cpu的保護模式或是

arm具有

mmu並使用段與頁機制的情況下。 c

是在虛擬位址與實體地址之間的中間產物。說得具體點吧,拿個例子,有表示式

x=2*y

,而y=3*z

,這裡的

x是指虛擬位址,

y指的是線性位址,

z是實體地址了,通過線性位址才有可能轉換為實體地址。(上面拿個例子只是例子,並不代表什麼,因為當沒有頁機制時,實體地址就等於線性位址)。 d

物理儲存器(通常指的是所說的記憶體)指由位址匯流排

直接訪問的儲存空間,其位址就是實體地址。顯然,位址匯流排的位數決定了物理儲存器的最大容量。

(請注意標大字型的「直接」兩字,這就區別了外存與記憶體的區別了) e

、缺頁中斷機制:

對於linux

來講,當程序需要執行的程式**超出已經載入的**範圍時,

linux

就載入4kb

的後續**,不需要的**就暫時不載入,這個工作由

do_no_page

函式呼叫

bread_page

函式完成。在第一次執行

shell

程式時就用到了這個機制。(因為

shell

是被動載入的)

Linux記憶體管理 二 位址對映

基本概念 cpu位數 alu位數 匯流排 可作為位址匯流排或資料匯流排或控制匯流排使用,具體視傳送指令而定 位址匯流排 cpu通過位址匯流排來指定儲存單元 資料匯流排 cpu與記憶體或其他器件之間的資料傳送的通道,位數與cpu位數一樣 cpu定址 cpu發出相應指令到位址匯流排上,尋找主存相應位址 ...

三 位址族與資料序列

ip是為收發網路資料而分配給計算機的值。埠號是為區分程式中建立的套接字而分配給套接字的序號。int serv sock struct sockaddr in serv addr char serv port 9190 建立伺服器端套接字 監聽套接字 serv sock socket pf inet,...

2440 位址空間的說明

2440這是一款32位的cpu,照理說,它是可以定址4g的位址空間的。但是,晶元引腳上,只給出了27根位址線。這27根引腳,是a0 a26。因此單靠晶元上的 27 根引腳,它只能控制 128m 的空間。那總共的 4g 空間,晶元引腳才用了128m,剩下的在 實際上,在cpu晶元手冊上,查它的內部暫存...