微機的內存為什么要按照字節來編址呢?
按照字節編址,每個內存單元的地址,不稱為物理地址而是線性地址,線性地址通過CPU內存管理單元(MMU)來進行轉換32位cpu地址線擁有32根,尋址能力達到4GB,而P4處理器的地址線則擁有35根,可以尋址更大的空間。但是實際內存達不到CPU的尋址空間大小,此時CPU的MMU就需要對線性地址進行向物理地址的轉化,此時線性地址就和物理地址不一樣了。 決定一個內存單元的物理地址時需要根據當前的內存管理方式進行計算,首先根據虛擬地址計算得到線性地址,然后根據分頁機制是否打開,如果沒有使用分頁機制,線性地址就是物理地址,如果打開分頁機制則根據頁目錄和頁表項來計算得物理地址。 按照x86 32位處理器,虛擬地址就是程序中所使用的邏輯地址,虛擬地址計算如下: 首先通過查段選擇子寄存器(16位模式下成為段基址寄存器,比如讀取數據用DS寄存器)中選擇子的第2位,0則從全局描述符表(GDT,Global Descriptor Table)1則從局部描述符表(LDT Local Descriptor Table)。全局描述符從GDTR寄存器找到描述符表的物理基地址(后稱簡稱為GDTBA,GDT Base Address),然后GDTBA + DS & 0xFFF8得到的地址就是該選擇子指向的描述符,然后根據描述符中記錄的段基址 + 偏移(可以是指令中的地址碼,也可是si,di中的數值)就得到了線性地址(Linear Address),而局部則有些不同,因為LDTR中放的不是局部描述符表的物理基地址,而是在全局描述符表的一個描述符選擇子。首先會計算LDT的物理基地址,方法同上,然后再計算描述符地址,最后計算成Linear Address.如果沒打開分頁,這個就可以是物理地址了。如果打開分頁機制,還要做Linear Address 到物理地址的轉化(Physical Address)。 線性地址是32位,高十位是頁目錄項索引,中間十位是頁表項索引,最后12位是頁內偏移,當然這是在選用4KB小頁的情況,大頁是4MB,則后22位都是頁內偏移。頁目錄物理基地址存放在CR3中,共有1024項,因此用線性地址高10位作索引,找到相應的頁目錄項。在小頁模式中,該項保存的是頁表的高20位地址,因為頁表只有4KB,所以低12位不需要。通過線性地址中間十位作頁表項索引和頁表基址進行計算得到頁表項,該項中保存的物理頁面的基址,基址加上線性地址低12位頁內偏移,就得到了物理地址。在大頁模式中,就省去了查頁表這一步驟。