記憶體管理與「三位址」的千絲萬縷(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晶元手冊上,查它的內部暫存...