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

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


咨詢
建站咨詢
