|
yuugl0rqcdb64031921457.gif (60.41 KB, 下載次數(shù): 0)
下載附件
保存到相冊
yuugl0rqcdb64031921457.gif
2024-9-21 21:47 上傳
) ^& ]* `- O0 ]4 @* ~1 f. X' K# N
點擊上方藍色字體,關(guān)注我們
2 E9 R Z: d, G1 Y' t9 y" [% p4 f% J$ h) e
MMU 通過頁表將虛擬地址轉(zhuǎn)換為物理地址,頁表保存了虛擬地址到物理地址的映射信息。不同的進程可以有相同的虛擬地址,但它們映射到的物理地址可能不同。
) Z2 r0 J6 p* ~& Z* B+ w- V% k2 w' _ @+ i7 p5 |9 k
頁 (Page): 虛擬內(nèi)存和物理內(nèi)存被劃分為相同大小的塊,稱為頁。
6 U8 A0 z6 j& c l( b1 j3 U常見的頁大小為 4 KB。頁表 (Page Table): 頁表是一個數(shù)據(jù)結(jié)構(gòu),存儲了虛擬地址與物理地址的映射。: C3 ]7 q3 Z9 m7 o' Y
7 J+ e% b0 Z3 O% g" P
頁表示例:- D; _* P- ~3 ]4 L
假設(shè)有一個虛擬地址 0xB8000000,通過頁表,它可能被映射到物理地址 0x12000000。這個過程是透明的,應(yīng)用程序只需要處理虛擬地址,操作系統(tǒng)和硬件負責完成地址轉(zhuǎn)換。
0 I$ I* N3 |/ \) u1 W1 P2 ]45 }2 `% |. }9 \( w$ _" m6 g
虛擬地址的應(yīng)用實例; s, G& P' c4 N
在應(yīng)用程序中,開發(fā)人員通常只與虛擬地址打交道。以下是一個簡單的 C 程序示例,演示如何使用虛擬地址訪問內(nèi)存。 ]( C* z* a$ v2 a9 z" H1 C- j: W
# ^ A1 m! [4 L6 p# C+ }#include #include int main() { int *ptr = (int *)malloc(sizeof(int)); if (ptr == NULL) { fprintf(stderr, "內(nèi)存分配失敗!/ @6 Q5 s* J, u5 y1 O$ O$ S
"); return 1; } *ptr = 42; printf("虛擬地址: %p, 值: %d3 M# C% n, W1 @/ n
", (void*)ptr, *ptr); free(ptr); return 0;}
; ~( j i* h5 h% W+ D& T- t* T3 d在這個示例中,malloc() 函數(shù)分配了一塊內(nèi)存,并返回該內(nèi)存塊的虛擬地址。該地址在程序的虛擬地址空間中有效,指向一個內(nèi)存位置。通過打印指針 ptr 的值,可以看到虛擬地址。& ?) F; U; d! V
5
' e" u0 P: M4 g物理地址的應(yīng)用實例
$ C7 y/ d6 t8 h% K1 A物理地址的直接使用通常僅限于操作系統(tǒng)內(nèi)核或驅(qū)動程序開發(fā)。在內(nèi)核編程中,開發(fā)人員可以通過一些內(nèi)核 API 來獲取物理地址。例如,通過 virt_to_phys() 函數(shù)可以將虛擬地址轉(zhuǎn)換為物理地址。
5 E5 M7 i; I2 H6 z2 {$ \5 B: ]
" B, ] ^0 D P/ `! b5 q4 l# x$ q#include #include #include int init_module(void) { void *vaddr; unsigned long paddr; vaddr = kmalloc(4096, GFP_KERNEL); if (!vaddr) { printk("內(nèi)存分配失敗
- j$ \8 F8 u* F+ B9 [: I"); return -ENOMEM; } paddr = virt_to_phys(vaddr); printk("虛擬地址: %p, 物理地址: %lx
( O( B, p8 @; A", vaddr, paddr); kfree(vaddr); return 0;} void cleanup_module(void) { printk("模塊卸載2 [& l/ f4 n m K! W+ ^
");} MODULE_LICENSE("GPL");
( n" F9 d3 K+ u8 p這個內(nèi)核模塊分配了一塊內(nèi)存,并將其虛擬地址轉(zhuǎn)換為物理地址。virt_to_phys() 函數(shù)只在內(nèi)核態(tài)有效,用戶態(tài)程序無法直接調(diào)用。: f, b! h% I8 U" K2 o
6
: {$ m3 P* r6 B4 Z, N7 `' v# x! m0 t# k4 I
物理地址和虛擬地址的優(yōu)缺點
* e5 [0 e9 U; z/ {4 v8 a虛擬地址的優(yōu)點:
/ N, N- w2 c) M& H6 o' l每個進程擁有獨立的虛擬地址空間,提高了安全性和穩(wěn)定性。虛擬地址空間可以大于實際物理內(nèi)存,通過交換技術(shù)(paging),虛擬內(nèi)存可以被分配給更大的地址空間。
, N7 M* P6 O5 n4 K4 B! l& `* d, Z. y
. e9 n/ m* [6 T$ Y0 u物理地址的優(yōu)點:! L1 n+ L8 R2 N2 |- C% U
直接對應(yīng)物理內(nèi)存,訪問速度快,無需經(jīng)過地址轉(zhuǎn)換。在操作系統(tǒng)內(nèi)核和驅(qū)動程序中,物理地址通常用于直接訪問硬件資源。+ O4 y7 n- ^( O, Y' O7 E
) `" j/ d; y2 d$ \3 @ |
物理地址和虛擬地址是 Linux 系統(tǒng)內(nèi)存管理的重要概念。虛擬地址提供了更靈活和安全的內(nèi)存管理方式,使得每個進程擁有獨立的地址空間。而物理地址則直接映射到實際的內(nèi)存位置,通常用于內(nèi)核級別的操作。理解這兩個概念及其應(yīng)用,對于系統(tǒng)編程和操作系統(tǒng)的深入理解非常關(guān)鍵。( _( }& c3 d6 z) Y0 k& u* n7 x
ihb4gth1ceo64031921557.jpg (71.14 KB, 下載次數(shù): 1)
下載附件
保存到相冊
ihb4gth1ceo64031921557.jpg
2024-9-21 21:47 上傳
, O8 g# }3 D) r- S" x' ~* o
scyq31odnkz64031921657.gif (45.46 KB, 下載次數(shù): 0)
下載附件
保存到相冊
scyq31odnkz64031921657.gif
2024-9-21 21:47 上傳
4 d" F! X2 N( R7 C+ `
點擊閱讀原文,更精彩~ |
|