新聞中心
在Linux操作系統(tǒng)中,每個進程都有一個獨立的地址空間,它描述了進程可以使用的地址范圍。了解linux地址空間分布對于開發(fā)和調試Linux程序非常有幫助。本文將介紹Linux地址空間的組成和分配。

為黑河等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及黑河網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為網(wǎng)站建設、成都網(wǎng)站建設、黑河網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
Linux地址空間
Linux地址空間是指進程虛擬地址。在64位Linux系統(tǒng)中,地址空間大小為128TB,使用了48位的虛擬地址和16位的“內存段”選擇器。地址空間包括以下部分:
1. 內核空間
Linux內核是操作系統(tǒng)的核心部分,它負責管理操作系統(tǒng)的資源和提供系統(tǒng)服務。內核空間是操作系統(tǒng)保留的系統(tǒng)內存空間,用于存放內核相關的數(shù)據(jù)結構和代碼。內核空間的大小在不同的內核版本上可能不同,但通常占據(jù)了整個地址空間的下半部分,即0x0000000000000000~0x7fffffffffff。
2. 用戶空間
用戶空間是進程可以訪問的空間,用于存放進程的代碼、數(shù)據(jù)和堆棧等信息。用戶空間通常在地址空間的上半部分,即0x0000800000000000~0xffff7fffffffffff,大小為128TB。
用戶空間又可以劃分為以下幾部分:
a. 代碼段
代碼段用于存放可執(zhí)行程序的指令。代碼段通常是只讀的,用于保護程序代碼,防止被惡意修改。代碼段的地址由可執(zhí)行文件頭部指定。
b. 數(shù)據(jù)段
數(shù)據(jù)段用于存放程序的全局變量、靜態(tài)變量、字面量等數(shù)據(jù)。數(shù)據(jù)段的大小取決于程序中定義的全局變量和靜態(tài)變量的大小。數(shù)據(jù)段通常是可讀可寫的。
c. 堆
堆是程序運行期間動態(tài)內存分配的區(qū)域。堆的大小是可變的,可以通過malloc()和free()等函數(shù)進行動態(tài)管理。
d. 棧
棧用于存放函數(shù)的局部變量和調用參數(shù)。棧的大小也是可變的,可以通過棧指針的增減進行動態(tài)管理。
3. 共享庫空間
共享庫是一些可重用的程序代碼和數(shù)據(jù)的,它們可以被多個進程共享。共享庫通常存放在地址空間的中間部分,即0x00007f0000000000-0x00007fffffffffff,默認大小是128TB。共享庫空間的大小可以通過系統(tǒng)配置進行修改。
地址空間的分配
在Linux中,地址空間是通過動態(tài)鏈接器ld.so來分配的。當一個程序啟動時,動態(tài)鏈接器會將程序所依賴的所有共享庫加載到共享庫空間中。動態(tài)鏈接器通過讀取程序的ELF格式的頭部信息,將可執(zhí)行文件的代碼段、數(shù)據(jù)段和堆棧分配到用戶空間中。
用戶空間的分配是通過虛擬內存管理來實現(xiàn)的。Linux采用了分頁內存管理機制,每個進程的地址空間被劃分為多個大小相等的頁面。在進程訪問一個未分配的頁面時,操作系統(tǒng)會為該頁面分配物理內存,將頁面映射到物理內存上,并將頁面信息記錄在進程的頁表中。當進程不需要該頁面時,操作系統(tǒng)會將物理內存釋放,并將該頁面從進程的頁表中刪除。
地址空間中可以有多個進程共享一個頁面。共享頁面可以用于進程間通信和內存優(yōu)化。當一個頁面被映射到多個進程中時,它只需要在物理內存中存在一個副本。這種技術被稱為”寫時復制”。
Linux地址空間是操作系統(tǒng)為進程分配的虛擬地址,包括內核空間、用戶空間和共享庫空間。地址空間的分配是通過動態(tài)鏈接器和虛擬內存管理機制實現(xiàn)的。了解Linux地址空間分布可以幫助開發(fā)和調試Linux程序。
相關問題拓展閱讀:
- 求教64位Linux的內核和用戶地址空間
- linux 虛擬地址,到底怎么理解
求教64位Linux的內核和用戶地址空間
我們都知道,32位的Linux中,0xxBFFFFFFFFF 這3GB是分配給用戶空間的
0xCxFFFFFFFFFF 這1GB是分配給內核空間的。對于64位的Linux,用戶空間和內核空間的分界線在:0xffffffff。前面的(小的)是用戶空間,后面(大的)的是內核空間。
linux 虛擬地址,到底怎么理解
不是僅僅 Linux 是這么設計的,整個現(xiàn)代流行的操作系統(tǒng)都是這么設計的。
應用程序被讀入內存后,為了保證系統(tǒng)的統(tǒng)一性,所有的程序都有同樣的一套尋址規(guī)范。這個尋址就是虛擬地址。這個虛擬雀羨族地址是系統(tǒng)提供轉換的,不是程序的工作。
如果系統(tǒng)不提供這個功能,那么應用程序就需要自己去尋找沒有被使用的內存,以及還要自己去處理內存容量的問題,而且如果程序調用外部的一些函數(shù)庫,這些函數(shù)庫也需要分配內存,這會導致應用程序的設計難度非常大,每個應用程序實際上就是一個操作系統(tǒng)了。多個程序共同運行導致內存使用混亂也很容易出現(xiàn)。
應用程序申請內存,使用的是操作系統(tǒng)的內存分配功能。這樣操作系統(tǒng)可以根據(jù)實際情況給應用程序內存,程序不需要考慮因為內存位置不同而必須不同編寫的難度。而且操作系統(tǒng)還可以提供虛擬內存等等各種方式來擴充內存,這樣的內存對于應用程序來說是不需要考慮的,一切都有系統(tǒng)打理。
使用虛擬地址后,對于應用程序來說,他的內存使用不需要考慮其他的程序占用,也不需要考慮內存容量的問題,也不需要考慮內存塊位置,函數(shù)庫的調用也都扔給操作系統(tǒng)打理。這使得應用程序不需要考慮具體如何管理內存,只需要考慮作為應用程序的應用部分。
而且,因為內存是虛擬的,應用程序一些函數(shù)調用,操作系統(tǒng)可以把多個應用程序的調用都用同一套數(shù)據(jù)來處理,這樣,既可以節(jié)約內存使用(就是啟動100個應用程序,也只需要內存里有一套函數(shù)庫而已),也可以做到外部函數(shù)庫和應用程序沒有直接關聯(lián),純粹是由系統(tǒng)做虛擬地址過渡。
至于為什么 4G ,這是傳統(tǒng)+一些兼容的考慮。
以前沒有這個技術時,每個程序都可以完全使用整個系統(tǒng),整個空間是連續(xù)的。到了這種虛擬地址的方式后,每個程序還是有自己“獨立”的一整套內存地址。但每個程序內存使用量肯定不一樣。那么多少內存空間才完全夠用呢?當時因為正好使用了 32 位系統(tǒng)。那么就把整個 32 位環(huán)境支持的 4G 內存容量作為這個極限。
不過因為內存地址是虛擬的。實際應用程序要派則用內存,是需要先申請的,所以只有程序申請后,真實內存才會被占用。這個 4G 只是在算法上作為極限。
不過因為 4G 也是硬件極限。所以 4G 以外的地址都是不能使用的,這就導致另一個問題,一些硬件有存儲器,有些硬件需要存儲空間做交互(比如 PCI ,比如各種硬件,比如 AGP 顯卡)。這些存儲區(qū)域怎么處理?
所以,Windows Vista 的 32 位版在 4G 內存的機器上曾經報出只有 3.5G (有的機器甚至只有 3.25G 可以用頃弊)。就是這個問題的解決辦法導致的:把硬件的內存用虛擬地址的方式,放到虛擬地址的最后面。這樣應用程序調用硬件存儲時,可以直接按照內存的方式讀寫。這樣應用程序就很好的統(tǒng)一了存儲界面:只有 4G 的內存范圍,不存在其他方式的存儲調用方式(硬盤需要用讀寫功能讀取到內存后才能處理,而不是直接進行處理)。這樣應用程序的開發(fā)就很簡單,而且整個內存的使用每個程序都一樣。不存在各種硬件的原因而不同導致的需要重新設計內存管理算法。操作系統(tǒng)也能根據(jù)實際應用程序的需要隨時分配數(shù)據(jù),也可以根據(jù)每個程序的運行情況,區(qū)別的提供物理內存或者虛擬的內存。
這么設計更大的一個好處是,硬件環(huán)境和應用程序是無關的,中間由操作系統(tǒng)做轉換。而且應用程序互相之間也沒有影響,就好象整個內存都由他自己一個程序使用一樣。
PS:說了半天,我發(fā)現(xiàn)我自己也說不清楚其中的緣由……
linux的虛擬地址分為物理地址和虛擬地址 。
Linux系統(tǒng)中的物理存儲空間和虛擬存儲空間的地址范圍分別都是從0x到0xFFFFFFFF,共4GB。
1、物理地址
Linux的物理存儲空間布局與處理器相關,詳細情況可以從處理器用戶手冊的存儲空間分布表(memory map)相關章節(jié)中查到,我這里只列出以下幾點注意事項:
1)更大node號n不能大于MAX_NUMNODES-1。
2)MAX_NUMNODES表示系統(tǒng)支持的最多node數(shù)。在ARM系統(tǒng)中,Sharp芯罩顫片最多支持16個nodes,其他芯片最多支持4個nodes。
3)numnodes是當前系統(tǒng)中實際的內存node數(shù)。
4)在不支持CONFIG_DISCONTIGMEM選項的系統(tǒng)中,只有一個內存node。 5)更大bank號m不能大于NR_BANKS-1。
6)NR_BANKS表示系統(tǒng)中穗戚支持的更大內存bank數(shù),一般等于處理器的RAM片選數(shù)。ARM系統(tǒng)中,Sharp芯片最多支持16個banks,其他芯片最多支持8個banks。
2、虛擬存儲空間布局
在支持MMU的系統(tǒng)中,當系統(tǒng)做完硬件初始化后就使能MMU功能,這樣整個系統(tǒng)就運行在虛擬存儲空間中,實現(xiàn)虛擬存儲空間到物理存儲空間映射功能的是處理器的MMU,而虛擬存儲空間與5路存儲空間的映射關系則是由Linux內核來管理的。32位系統(tǒng)中物理存儲空間占4GB空間,虛擬存儲空間同樣占4GB空間,Linux把物理空間中實際存在的遠遠小于4GB的物族敗內存空間映射到整個4GB虛擬存儲空間中除映射I/O空間之外的全部空間,所以虛擬內存空間遠遠大于物理內存空間,這就說同一塊物理內存可能映射到多處虛擬內存地址空間。
問題相當?shù)膹碗s,建議參考linux基礎篇!
linux地址空間分布的介紹就聊到這里吧,感謝你花時間閱讀本站內容,更多關于linux地址空間分布,Linux的地址空間分布解析,求教64位Linux的內核和用戶地址空間,linux 虛擬地址,到底怎么理解的信息別忘了在本站進行查找喔。
香港服務器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務提供商,擁有超過10年的服務器租用、服務器托管、云服務器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務器、香港云服務器、免備案服務器等。
文章題目:Linux的地址空間分布解析(linux地址空間分布)
瀏覽地址:http://fisionsoft.com.cn/article/cdspegj.html


咨詢
建站咨詢
