體系架構番外篇 - 我們說MIPS的最佳頁映射

From: ongoingcre

如果再見不能紅着眼,是否還能紅著臉 - CCNN

一、MIPS上地址空間的內存管理

Memory_Mips
上述空間在32位操作系統和64位操作系統下,地址空間範圍分別是:

32位系統中
0x00000000 - 0x7fffffff, 無論用戶態還是內核態都可以尋址!
0x80000000 - 0x9f000000 && 0xc0000000 - 0xffffffff, 只有內核態的進程才能尋址!
64位系統中
0x0000000000000000 - 0xffffffff7fffffff
0xffffffff80000000 - 0xffffffff9f000000 && 0xffffffffc0000000 - 0xffffffffffffffff 
幾點總結:

a.在MIPS下用戶可訪問空間是我們稱之爲KUSEG的那部分空間!所有的高位地址都保留給操作系統.
b.對於操作系統而言,低地址就像一個安全的’Sandbox’,用戶可以肆意的運行或者破壞自己的數據!其它程序並不會擔心受到影響!
c.在沙盒內部,操作系統給有需求的程序提供更多的棧空間(隱式),同時提供一個系統調用,用來從一個預先聲明的數據區域最改地址爲起始並且不斷增長的地址空間(堆),當中獲取更多的數據!
d.在類Unix*的操作系統中,進程在操作系統內部由自己的標識碼(這部分後續在進程管理中會詳細去介紹),爲了確保應用程序只能做它們允許的事情,絕不部分內核服務以特殊的子進程的形式提供!應用程序調用子程序頁必須遵循特定的規則!
e.每個進程的用戶空間會映射到專屬於本進程的物理存儲空間上去,但是操作系統的空間是共享的!
f.衆所周知,進程的地址空間劃分<棧位於頂部<因爲可以更好的進行地址擴展>,代碼和靜態編譯數據位於底部>!

映射的故事

把進程空間映射到真正的物理內存
MIPS系統結果或多或少都會要求程序(不管是應用程序還是內核程序)使用的地址在編譯鏈接勾就會固定下來。這意味着應用程序在構建時不可能顯式的使用不同的地址!因此在程序運行時候,它的程序地址會映射到物理地址上,這個地址在程序裝載的時候就已經被操作系統給固定下來了!

儘管在進程間切換上下文的時候,打包所有的地址映射信息是可行的,但是其效率相當低,替代辦法是給每一個進程分配一個編號(進程ID,or ASID).每個進程裏的任何地址都被任何隱式的被進程的ASID擴展,並相應的產生唯一的有待譯碼地址。在一個進程被調度的時候,ASID需要被裝入CPU的寄存器中,使得硬件可以使用!
映射機制還允許操作系統能幹把用戶空間地址的不同地方區分對待,應用程序的某些空間(一般是代碼部分)被映射爲只讀,而其它部分則可以暫時不映射,對其訪問會導致’trapped’(陷阱),這意味着一個胡亂運行的程序可以被更早的及時停止!
進程地址空間的內核部分通常被所有的進程共享,而且這部分絕大多數內容映射爲常駐的操作系統代碼和數據。由於這些代碼鏈接爲在這些地址運行,所有不需要靈活的映射機制。事實上,大部分運行在MIPS上的內核會把它們的絕大部分代碼置於那些映射已被體系結構固定了的地址空間中!

二、談談什麼纔是最佳頁映射

爲了映射地址,人們嘗試過很多特殊方法,通常使用基地址/範圍’二元組來保證訪問的正確性,然後如果內存映射時提供給程序恰好所需要的大小的內存, 儘管這很明顯爲應用程序提供了最優服務,卻會迅速導致可用內存被分割爲難易利用的內存碎片。所有實際系統都以頁的形式對內存進行映射,頁通常是2的冪次個字節的大小,故而4KB大小的頁應用非常普遍!

未完待續…

By: Keven - 點滴積累

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章