在linux中,因爲段的基數都是0,所以邏輯地址與線性地址(Book「Understanding the linux kernel」)一致。我認爲不同進程的邏輯地址可能是相同的,所以不同進程的線性地址可能相同,每個進程視圖4GB,每個進程都會有自己的線性地址空間(本地地址空間)。但其他一些文章說,所有進程都有一個很大的線性地址空間,並且段機制被用來將不同的進程映射到線性地址空間的不同部分。聽起來像一個具有更寬地址位的全局線性地址空間。我錯在哪裏?或者他們用於不同的架構?Linux中的全局或本地線性地址空間?
回答
每個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
請仔細閱讀所有參考資料。
這是否意味着Linux使進程的邏輯(也是虛擬的?)地址與其線性地址相同,並且只通過分頁來分離不同的進程? – user1559088 2012-07-28 07:02:19
我不明白你的意思是「線性地址」(linux不使用段尋址,這是x8686或其他處理器中未使用的i386的舊無用功能)。你讀過我給你的所有參考資料了嗎? – 2012-07-28 07:33:13
是的。我對這本書中介紹的三個地址感到困惑。現在,我應該說在Linux中,進程可以直接看到虛擬地址,通過分頁轉換爲物理地址,對吧? – user1559088 2012-07-28 10:59:07
英特爾支持3種地址:
邏輯地址 - (分割單元)--->線性地址---(尋呼單元)--->物理地址
你也知道,所有內核和用戶代碼訪問數據或文本都認爲虛擬地址(CPU中的邏輯地址)。的地址被轉換爲線性的地址作爲下圖:
隨着Linux實現不支持線性的尋址的概念和各段僅用於提供許可控制。 Linux內核將每個段的偏移值配置爲零。這就是爲什麼你看不到內核和內核中的線性地址直接在分頁單元上使用虛擬地址的原因。
得到線性地址後,MMU分頁單元通過引用CR3寄存器來獲得分頁表的基地來生成物理地址。
與CPU高速緩存中相同,這個尋呼單元還具有每個CPU核一個TLB緩存中以提高其上存儲執行的地址轉換。
- 1. 多線程Linux進程的地址空間佈局
- 2. 本地和全局變量的地址
- 3. 可達性vs地址空間vs地址總線
- 4. 全局屬性本地化
- 5. linux內核的內核地址空間的佈局是什麼?
- 6. Linux進程虛擬地址空間的地址範圍
- 7. ARM linux:進程地址空間
- 8. linux內核和用戶地址空間
- 9. 全局構造的虛擬地址空間
- 10. 多線程相同的地址空間
- 11. 線程在別人的地址空間
- 12. 地址簿線程安全和性能
- 13. Java屬性 - 全局和本地屬性
- 14. 全局地址簿DistinguishedFolderId
- 15. 線性地址和物理地址
- 16. PThreads地址空間
- 17. 線程返回到壞空間地址
- 18. 多線程虛擬地址空間?
- 19. 如何通過本地鏈接地址獲得遠程全局鏈接地址?
- 20. 字段到本地或全局變量
- 21. OpenCL何時使用全球,私人,本地,恆定的地址空間
- 22. 本地數組變量exc壞acces分段&本地或全局?
- 23. 可達性 - 爲本地局域網的IP地址
- 24. 佈局中視圖的全局或本地ID?
- 25. 德爾福班vars有全局或線程本地存儲?
- 26. Linux中用戶空間地址的嵌套頁面錯誤
- 27. lambda表達式,本地類型和全局命名空間
- 28. Visual Studio:全局命名空間優先於本地
- 29. python導入模塊全局本地命名空間
- 30. 系統DLLs地址空間
從哪個角度看,你問這個問題:從內核中(例如編碼一個新的內核模塊時),或者從內部應用程序(例如編碼時的Linux應用程序)? – 2012-07-28 11:15:26
我想知道Linux的原理和機制。特別是linux如何使用硬件提供的功能,例如, 中央處理器。 – user1559088 2012-07-28 11:38:02
我在回覆中仔細地給了很多參考。 *每個參考應該對你有用*。 – 2012-07-28 11:45:52