2012-07-28 39 views
2

在linux中,因爲段的基數都是0,所以邏輯地址與線性地址(Book「Understanding the linux kernel」)一致。我認爲不同進程的邏輯地址可能是相同的,所以不同進程的線性地址可能相同,每個進程視圖4GB,每個進程都會有自己的線性地址空間(本地地址空間)。但其他一些文章說,所有進程都有一個很大的線性地址空間,並且段機制被用來將不同的進程映射到線性地址空間的不同部分。聽起來像一個具有更寬地址位的全局線性地址空間。我錯在哪裏?或者他們用於不同的架構?Linux中的全局或本地線性地址空間?

+0

從哪個角度看,你問這個問題:從內核中(例如編碼一個新的內核模塊時),或者從內部應用程序(例如編碼時的Linux應用程序)? – 2012-07-28 11:15:26

+0

我想知道Linux的原理和機制。特別是linux如何使用硬件提供的功能,例如, 中央處理器。 – user1559088 2012-07-28 11:38:02

+0

我在回覆中仔細地給了很多參考。 *每個參考應該對你有用*。 – 2012-07-28 11:45:52

回答

1

每個Linux process有它自己的address space;它是virtual memory。不同的進程具有不同的地址空間(但進程內的所有線程共享相同的地址空間)。

您可以通過閱讀/proc/1234/maps或得到地圖上的Linux進程1234的過程中/proc/self/maps

試試下面的命令

cat /proc/$$/maps 
cat /proc/self/maps 

,想想他們的輸出;第一個命令顯示你的shell的內存映射;第二個顯示了運行cat

地址空間被在程序啓動時設定execve(2)並與mmap(2)改變和相關syscalls進程的存儲器映射。

應用程序僅通過系統調用與內核進行交互。內核有一個「不同的」地址空間,你不應該關心它(除非你在內核中編碼)。

也讀一本好書就像Advanced Unix Programming和/或Advanced Linux Programming

this explanation查看系統調用。

請注意,分段尋址特定於i386,已過時:大多數系統不再使用它。它已完全消失在x86-64的64位模式中。所有Linux系統都使用flat memory model

請仔細閱讀所有參考資料。

+0

這是否意味着Linux使進程的邏輯(也是虛擬的?)地址與其線性地址相同,並且只通過分頁來分離不同的進程? – user1559088 2012-07-28 07:02:19

+0

我不明白你的意思是「線性地址」(linux不使用段尋址,這是x8686或其他處理器中未使用的i386的舊無用功能)。你讀過我給你的所有參考資料了嗎? – 2012-07-28 07:33:13

+0

是的。我對這本書中介紹的三個地址感到困惑。現在,我應該說在Linux中,進程可以直接看到虛擬地址,通過分頁轉換爲物理地址,對吧? – user1559088 2012-07-28 10:59:07

3

英特爾支持3種地址:

邏輯地址 - (分割單元)--->線性地址---(尋呼單元)--->物理地址

你也知道,所有內核和用戶代碼訪問數據或文本都認爲虛擬地址(CPU中的邏輯地址)。的地址被轉換爲線性的地址作爲下圖:

enter image description here

隨着Linux實現不支持線性的尋址的概念和各段僅用於提供許可控制。 Linux內核將每個段的偏移值配置爲零。這就是爲什麼你看不到內核和內核中的線性地址直接在分頁單元上使用虛擬地址的原因。

得到線性地址後,MMU分頁單元通過引用CR3寄存器來獲得分頁表的基地來生成物理地址。

enter image description here

與CPU高速緩存中相同,這個尋呼單元還具有每個CPU核一個TLB緩存中以提高其上存儲執行的地址轉換。

參考: intel64 software developer's manual