linux地址空間劃分

來源:互聯網
上載者:User

LDD講的很明白了:

Linux 是一個虛擬記憶體系統, 意味著使用者程式見到的地址不直接對應於硬體使用的物理地址. 虛擬記憶體引入了一個間接層, 它允許了許多好事情. 有了虛擬記憶體, 系統重啟動並執行程式可以得到遠多於實體記憶體的空間。確實, 即便一個單個進程可擁有一個虛擬位址空間大於系統的實體記憶體. 虛擬記憶體也允許程式對進程的地址空間運 , 包括映射成員的記憶體到裝置記憶體. 

至此, 我們已經討論了虛擬和物理地址, 但是許多細節被掩蓋過去了. Linux 系統處理幾種類型的地址, 每個有它自己的含義. 不幸的是, 核心代碼不是一直非常清楚確切地在每個情況下在使用什麼類型地地址, 因此程式員必須小心.
Linux 中使用的地址類型顯示了這個地址類型如何關聯到實體記憶體.

User virtual addresses
這是被使用者程式見到的常規地址. 使用者地址在長度上是 32 位或者 64 位元, 依賴底層的硬體結構, 並且每個進程有它自己的虛擬位址空間.
Physical addresses
在處理器和系統記憶體之間使用的地址. 物理地址是 32- 或者 64-位的量; 甚至 32-位系統在某些情況下可以使用更大的物理地址.
Bus addresses
在外設和記憶體之間使用的地址. 經常, 它們和被處理器使用的物理地址相同, 但是這不是必要的情況. 一些體系可提供一個I/O 記憶體管理單元(IOMMU), 它在匯流排和主記憶體之間重新對應地址. 一個 IOMMU 可用多種方法使事情簡單(例如, 使散布在記憶體中的緩衝對裝置看來是連續的, 例如), 但是當設定 DMA 操作時對 IOMMU 編程是一個必須做的額外的步驟. 匯流排地址是高度特性依賴的, 當然.

Kernel logical addresses
這些組成了正常的核心地址空間. 這些地址映射了部分(也許全部)主存並且常常被當作它們是實體記憶體來對待. 在大部分的體繫上, 邏輯地址和它們的相關物理地址只差一個常量位移(80x86上常量位移叫線性地址/虛擬位址,和intel的邏輯地址定義還不太一樣). 邏輯地址使用硬體的本地指標大小並且, 因此, 可能不能在重裝備的 32-位系統上定址所有的實體記憶體. 邏輯地址常常儲存於 unsigned long 或者 void * 類型的變數中. 從 kmalloc 返回的記憶體有核心邏輯地址.

Kernel virtual addresses
核心虛擬位址類似於邏輯地址, 它們都是從核心空間地址到物理地址的映射. 核心虛擬位址不必有邏輯地址空間具備的線性, 一對一到物理地址的映射, 但是. 所有的邏輯地址是核心虛擬位址, 但是許多核心虛擬位址不是邏輯地址. 例如, vmalloc 分配的記憶體有虛擬位址(但沒有直接物理映射). kmap 函數(本章稍後描述)也返回虛擬位址. 虛擬位址常常儲存於指標變數.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.