posts - 134,comments - 22,trackbacks - 0

          一、Linux內(nèi)存管理到底是分段還是分頁(yè)?

          在實(shí)模式下沒有引入段式內(nèi)存管理模式前,程序都是使用絕對(duì)地址來(lái)進(jìn)行內(nèi)存操作的,這樣造成了程序的可移植性差等問題。于 是在8086時(shí)代開始引入段式內(nèi)存管理,段式管理引入了地址映射的概念,不但解決了可移植性問題,也解決了16位ALU和段寄存器的可尋址限制,即支持更 大的內(nèi)存尋址.每個(gè)段的大小是64KB.

          在實(shí)模式下,由于系統(tǒng)程序和用戶程序在訪問內(nèi)存等資源時(shí)權(quán)限沒有區(qū)分,所以很可能造成操作系統(tǒng)出現(xiàn)異常.于是Intel在80286時(shí)代開發(fā)出來(lái)了保護(hù)模式.

          而Intel為了兼容80386前的處理器就規(guī)定:在IA(Intel Arch)32保護(hù)模式下,不能禁止分段,但是分頁(yè)是Optional的。/*When operating in protected mode, some form of segmentation must be used. There is no mode bit to disable segmentation. The use of paging, however, is optional.*/.

          既然linux在內(nèi)存管理上不能禁止分段,那么linux又認(rèn)為分段會(huì)造成大量的內(nèi)存碎片,所以就通過(guò)將邏輯地址中的段基址置為0,加上偏移量形成線性地址,來(lái)簡(jiǎn)化段式管理內(nèi)存而使用分頁(yè)管理內(nèi)存的。

          在IA32下,每頁(yè)是4K.

          二、linux的三種類型內(nèi)存地址及關(guān)系是什么樣的?

          分段                     分頁(yè)

          邏輯地址————> 線性地址 —————->物理地址

          在 x86 架構(gòu)中,內(nèi)存被劃分成 3 種類型的地址:

          邏輯地址 (logical address) 由16位段選擇符:32位偏移量來(lái)表示,它有可能直接對(duì)應(yīng)于一個(gè)物理位置(Intel實(shí)模式下)。
          線性地址 (linear address)或虛擬地址 是由段描述符中的32位段基址和邏輯地址中的32位偏移量相加構(gòu)成的。例如:0x08048394,由于linux把所有的段基址都置為0x00000000.所以線性地址=0x00000000+偏移量=邏輯地址,在不分頁(yè)的情況下:線性地址就直接是物理地址;

          物理地址 (physical address) 是使用物理地址總線中的位表示的地址。內(nèi)存管理單元可以將邏輯地址轉(zhuǎn)換成物理地址。

          三、為什么在32位的操作系統(tǒng)下每個(gè)進(jìn)程會(huì)有4G的內(nèi)存使用限制?

          由于32位操作系統(tǒng)下,由于虛擬地址空間是2的32次方=4 294 967 296,通常的數(shù)據(jù)對(duì)象都以字節(jié)為單位,所以一個(gè)進(jìn)程的可尋址范圍就是4G內(nèi)存

          四、為什么linux服務(wù)器是32位的還可以認(rèn)出來(lái)多于4G的內(nèi)存?

          本來(lái)在IA32下,機(jī)器只能認(rèn)出4G的內(nèi)存,但I(xiàn)ntel為了讓32位的OS能支持更多的內(nèi)存。采取了PAE(Physical Address Extension, 物理地址擴(kuò)展)技術(shù).PAE的支持,不僅需要處理器的支持,OS的內(nèi)核也需要支持才可行(我們通常采用的RHEL3/4/5 kernel都支持PAE),也就是處理器內(nèi)部增加了PAE寄存器,用于記錄多出的4條地址總線,所以系統(tǒng)就是2^36=64G.

          五、在32位的linux操作系統(tǒng)下,為什么linux系統(tǒng)認(rèn)出來(lái)的內(nèi)存大于4G,而我的程序每個(gè)進(jìn)程卻只能分配4G以下的內(nèi)存?

          雖然Intel為其處理器為支持PAE增加了4條地址線,但因?yàn)樘摂M地址是32位的,所以單個(gè)進(jìn)程還是只能分配4G以下的內(nèi)存

          Note: Linux can use up to 64 Gigabytes of physical memory on x86 systems. However, the address space of 32-bit x86 processors is only 4 Gigabytes large. Thus means that, if you have a large amount of physical memory, not all of it can be “permanently mapped” by the kernel. The physical memory that’s not permanently mapped is called “high memory”.

          Redhat網(wǎng)站http://www.redhat.com/rhel/compare/

          六、32位的RedHat linux”smp” kernel”hugemem” kernel中內(nèi)存支持方面有什么建議?

          Smp kernel和hugemem kernel都支持PAE支持,也就意味著最大能支持64G的內(nèi)存。而RedHat建議當(dāng)你的物理內(nèi)存在16GB之內(nèi),用SMP” kernel,在16GB-64GB之間使用”Hugemem” kernel.這是因?yàn)樘摂M地址空間里有1G用于內(nèi)核空間,而3G用于用戶空間。而關(guān)健的一些數(shù)據(jù)結(jié)構(gòu)是存放在1G內(nèi)核空間的,在管理32G內(nèi)存當(dāng)中,需 要用到0.5G來(lái)用于管理這些物理內(nèi)存(容易觸發(fā)OOM killer).雖然32位OS下,內(nèi)核和用戶空間的比例都是1:3,但Hugemem打了一個(gè)補(bǔ)丁,使比例成為4G:4G,即使內(nèi)核空間和用戶空間相互 獨(dú)立,所以也會(huì)有性能上的損失,因?yàn)閼?yīng)用程序的運(yùn)行,通常會(huì)有內(nèi)核和用戶空間的切換。所以如果你的內(nèi)存大于16G,建議你使用64位的OS。

          /* The “SMP” kernel supports a maximum of 16GB of main memory. Systems with more than 16GB of main memory use the “Hugemem” kernel. In certain workload scenarios it may be advantageous to use the “Hugemem” kernel on systems with more than 12GB of main memory. */

          七、我們通常malloc4K內(nèi)存,到底是怎么對(duì)應(yīng)到物理內(nèi)存的?

          在linux下,處理器在得到內(nèi)存的線性地址進(jìn)行內(nèi)存尋址時(shí),不是直接在內(nèi)存的物理地址里查找的,而是通過(guò)線性地址轉(zhuǎn)換到主內(nèi)存的物理地 址,TLB(Translation lookaside buffer,可以簡(jiǎn)單的理解為:一種存儲(chǔ)線性地址和物理地址的硬件高速緩沖器)就是負(fù)責(zé)將虛擬內(nèi)存地址翻譯成實(shí)際的物理內(nèi)存地址,而CPU尋址時(shí)會(huì)優(yōu)先 在TLB中進(jìn)行尋址。如果TLB里沒有,則從頁(yè)表里進(jìn)行線性地址到物理地址的轉(zhuǎn)換.hugepage能增加TLB的命中率,所以會(huì)在某些方面能大大提高系 統(tǒng)性能)。

          1、邏輯地址轉(zhuǎn)線性地址

          LL.jpg

          a、首先根據(jù)指令的性質(zhì)來(lái)確定該使用哪一個(gè)段寄存器。
          b、根據(jù)段寄存器的內(nèi)容,到GDT中找到相應(yīng)的“段描述結(jié)構(gòu)”

          c、根據(jù)linux把所有的段基址都置為0×00000000.所以0×00000000+偏移量就是線性地址了.在不分頁(yè)的情況下:線性地址就直接是物理地址;
          同時(shí),在上面過(guò)程中,由于有對(duì)訪問權(quán)限的檢查,就實(shí)現(xiàn)了保護(hù)。

          2、線性地址轉(zhuǎn)物理地址

          在保護(hù)模式下,控制寄存器CR0的最高位PG位(PE位控制是否為保護(hù)模式)控制著分頁(yè)管理機(jī)制是否生效,如果PG=1,分頁(yè)機(jī)制生效,需通過(guò)頁(yè)表查找才能把線性地址轉(zhuǎn)換物理地址。如果PG=0,則分頁(yè)機(jī)制無(wú)效,線性地址就直接做為物理地址。

          頁(yè)式內(nèi)存管理中,32位的線性地址劃分為三個(gè)部分:10位的頁(yè)目錄表下標(biāo)、10位的頁(yè)面表下標(biāo)、12位的頁(yè)內(nèi)偏移量。CPU增加了一個(gè)CR3寄存器存放指向當(dāng)前頁(yè)目錄表的指針。尋址方式就改為:
          a、從CR3取得頁(yè)目錄表的基地址;
          b、根據(jù)10位頁(yè)目錄表下標(biāo)和從CR3取得的基地址,得到相應(yīng)頁(yè)表的基地址;
          c、根據(jù)10位頁(yè)面表下標(biāo)和b中得到的頁(yè)表基地址,從頁(yè)面表中取得相應(yīng)的頁(yè)面描述項(xiàng);
          d、將頁(yè)面描述項(xiàng)中的頁(yè)面基地址和線性地址中的12位頁(yè)內(nèi)地址偏移相加,得到物理地址。
          同時(shí),在地址轉(zhuǎn)換的過(guò)程中也有越界和權(quán)限的檢查,就不贅述了。

          LP

          注:傳統(tǒng)的32位操作系統(tǒng)采用的是兩級(jí)分頁(yè)模型

          64位和PAE支持都采用了三級(jí)分頁(yè)模型

          posted on 2010-09-30 16:22 何克勤 閱讀(691) 評(píng)論(0)  編輯  收藏 所屬分類: GNU Linux/Unix
          主站蜘蛛池模板: 稷山县| 略阳县| 池州市| 隆回县| 石城县| 平乡县| 丹巴县| 桂平市| 岢岚县| 嘉祥县| 三台县| 柳河县| 临沂市| 湘潭市| 儋州市| 惠水县| 会宁县| 文水县| 通道| 南木林县| 德昌县| 临邑县| 丹阳市| 焉耆| 明溪县| 梁山县| 宁德市| 竹北市| 天水市| 广德县| 黔东| 界首市| 大方县| 望都县| 德安县| 宝兴县| 大理市| 印江| 上犹县| 汶上县| 韶关市|