每乙個邏輯位址由乙個段位址和偏移位址組成。在有位址變換功能的計算機中,訪問指令給出的位址 (運算元) 叫邏輯位址,也叫相對位址。
由一塊連續的虛擬記憶體空間組成。在80x86微處理器中是乙個32位無符號整數,可以用來表示4gb的位址,也就是4294967個記憶體單元。
是計算機內的實際位址,它們與從微處理器的位址引腳傳送到記憶體匯流排上的電訊號對應。在80x86微處理器中由32位或36位無符號整數表示。
從80286模型開始,intel微處理器以兩種不同的方式執行位址轉換,這兩種方式分別為實模式(real mode)和保護模式(protested mode)。
實模式被特殊定義為20位位址記憶體可訪問空間上,這就意味著它的容量是2的20次冪(1m)的可訪問記憶體空間(物理記憶體和bios-rom),軟體可通過這些位址直接訪問bios程式和外圍硬體。
保護模式又被稱作為虛擬位址,它本身本身是80286及以後相容處理器序列之後產成的一種操作模式,它具有許多特性設計為提高系統的多道任務和系統的穩定性。例如記憶體的保護,分頁機制和硬體虛擬儲存的支援。現代多數的x86處理器作業系統都執行在保護模式下,包括linux, free bsd。
乙個邏輯位址由兩部分組成:乙個段識別符號和乙個指定端內相對位址的偏移量。段識別符號是乙個16位長的字段,稱作段選擇符,而偏移量是乙個32位字長的字段。為了方便地找到段選擇符,處理器提供段暫存器,段暫存器的唯一目的是存放段選擇符。
每個段由乙個8位元組的段描述符表示,他描述了段的特徵。段描述符放在全域性描述符表(gloabal descriptor table,gdt),或ldt(local descriptor table,ldt)中。
為了加速邏輯位址到線性位址額轉換,80x86處理器提供了一種附加的非程式設計的暫存器,供6個可程式設計的段暫存器使用。每當乙個段選擇符被裝入段暫存器時,相應的段描述符就由記憶體裝入到對應的非程式設計cpu暫存器。從那時起,針對那個段的邏輯位址轉換就可以不訪問主存中的gdt或ldt,處理器只需直接引用存放段描述符的cpu暫存器。
分段單元執行以下操作
先檢查段選擇符的ti欄位,以決定段描述符儲存在哪乙個描述符表中。ti欄位指明描述符是在gdt中還是在ldt中。
從段選擇符的index欄位計算段描述符的位址,index欄位的值乘以8,這個結果與gdtr或ldtr暫存器中的內容相加。
把邏輯位址的偏移量與段描述符base欄位的值相加就得到了線性位址。
linux以非常有限的方式使用分段,與分段相比,linux更喜歡使用分頁方式,因為:
當所有程序使用相同的段暫存器值時,記憶體管理變得更簡單,也就是說它們能共享同樣的一組線性位址
linux設計目標之一是可以把它移植到絕大多數流行的處理器平台上。然而,risc體系結構對分段的支援十分有限。
linux 2.6只有在80x86結構下才需要使用 分段。
執行在使用者態和執行在核心態的程序使用不同的段描述符,於是在linux下就有了4個重要的段描述符字段:
使用者**段
使用者資料段
核心**段
核心資料段
相應的段選擇符由巨集__user_cs,__user_ds,__kernel_cs,__kernel_ds分別定義。
在單處理器系統中只有乙個gdt,在多處理器系統中系統每個cpu對應乙個gdt。所有的gdt都存放在cpu_gdt_table陣列中,所有gdt的位址和它們的大小被存放在cpu_gdt_dsescr陣列中。
每個gdt包含18個段描述符和14個空的,未使用的或保留的項。
每個gdt中包含的18個段描述符指向下列段
使用者和核心態下的**段和資料段共4個。
任務狀態段(tss),每個處理器有1個。
1個包括預設區域性描述符表的段,這個段通常是被所有程序共享的段
3個區域性執行緒儲存(thread-local storage,tls)段,這種機制允許多執行緒應用程式使用最多3個區域性與執行緒的資料段。
與高階電源管理(amp)相關的3個段。
與支援即插即用(pnp)功能bios服務程式相關的5個段。
被核心用來處理「雙重錯誤」異常的特殊tss段。
大多數使用者態下的linux程式不使用區域性描述符表,這樣核心就定義了乙個預設的ldt供大多數程序共享。預設的區域性描述符表存放在default_ldt陣列中。
linux 記憶體定址
1 實體地址 虛擬位址及線性位址 2 虛擬位址到實體地址的過程 記憶體定址的過程可以簡單理解為虛擬位址到實體地址的轉換過程。程式設計師所使用的虛擬位址,並不是直接送到記憶體匯流排,而是被送到記憶體管理單元 mmu,由乙個或一組晶元組成是一種硬體電路,實現虛擬位址到實體地址的轉換 mmu包括分段機制和...
記憶體定址 筆記
方括號內的組建屬於硬體電路 memory arbiter記憶體仲裁器,介於匯流排和ram之間,用於判斷序列讀寫的ram此時能否被訪問。邏輯位址 16位的段選擇符 segment selector 32位偏移量 offset 段選擇符存放於6個段暫存器裡 cs code segment 段暫存器,它含...
記憶體定址方式
這裡進行的就是 但是最上面的是32位機器 所以不需要ds 10 但是也可以把ds看作是0 那就是將ebp位址所承載的值取出dword位出來也就是4位元組 給eax 如果是ax 就是word 1位元組 如圖 ebp位址是 所指向的值是 所以eax變成 可以看出是將位址中的值倒向放在eax中 這是因為e...