|
yuugl0rqcdb64031921457.gif (60.41 KB, 下載次數(shù): 2)
下載附件
保存到相冊(cè)
yuugl0rqcdb64031921457.gif
2024-9-21 21:47 上傳
1 ~/ o! e7 D! f" ?3 ?" Z( Q點(diǎn)擊上方藍(lán)色字體,關(guān)注我們
5 ?0 m0 I7 m0 O$ V
& d( S6 s; q. X& ^; p" ]/ LMMU 通過(guò)頁(yè)表將虛擬地址轉(zhuǎn)換為物理地址,頁(yè)表保存了虛擬地址到物理地址的映射信息。不同的進(jìn)程可以有相同的虛擬地址,但它們映射到的物理地址可能不同。
J" @, C' F5 }. ~, {4 y- Q B8 o+ i, R1 o- K* I. ^) V
頁(yè) (Page): 虛擬內(nèi)存和物理內(nèi)存被劃分為相同大小的塊,稱為頁(yè)。! v2 H$ [/ ?9 k6 h1 H1 J* G
常見的頁(yè)大小為 4 KB。頁(yè)表 (Page Table): 頁(yè)表是一個(gè)數(shù)據(jù)結(jié)構(gòu),存儲(chǔ)了虛擬地址與物理地址的映射。0 h0 q" ?) ~* e# I
/ v0 x1 T: J/ Y- P: i: Q* p3 I
頁(yè)表示例:
8 ]4 G' a5 j, }1 V% N! \( e假設(shè)有一個(gè)虛擬地址 0xB8000000,通過(guò)頁(yè)表,它可能被映射到物理地址 0x12000000。這個(gè)過(guò)程是透明的,應(yīng)用程序只需要處理虛擬地址,操作系統(tǒng)和硬件負(fù)責(zé)完成地址轉(zhuǎn)換。% e/ n/ F3 u0 j t& g3 }
4
. E0 U [7 J9 x0 }1 c% g9 s虛擬地址的應(yīng)用實(shí)例
2 N% Y! w% W, B! @; `在應(yīng)用程序中,開發(fā)人員通常只與虛擬地址打交道。以下是一個(gè)簡(jiǎn)單的 C 程序示例,演示如何使用虛擬地址訪問(wèn)內(nèi)存。1 L- m- P6 U+ E2 t8 S" P4 j# d- Y! k% N+ `
5 ~9 O& M) E d' ]
#include #include int main() { int *ptr = (int *)malloc(sizeof(int)); if (ptr == NULL) { fprintf(stderr, "內(nèi)存分配失!
) {8 l- U& D8 n+ ~"); return 1; } *ptr = 42; printf("虛擬地址: %p, 值: %d3 t" _+ I% U5 G% e0 M9 ^
", (void*)ptr, *ptr); free(ptr); return 0;}6 d2 i9 w* L+ o/ B
在這個(gè)示例中,malloc() 函數(shù)分配了一塊內(nèi)存,并返回該內(nèi)存塊的虛擬地址。該地址在程序的虛擬地址空間中有效,指向一個(gè)內(nèi)存位置。通過(guò)打印指針 ptr 的值,可以看到虛擬地址。3 Z: f# T; s. o/ X
5
/ s+ q. b$ W0 B r |物理地址的應(yīng)用實(shí)例
4 U9 [3 ^9 J6 e- d) Y- u物理地址的直接使用通常僅限于操作系統(tǒng)內(nèi)核或驅(qū)動(dòng)程序開發(fā)。在內(nèi)核編程中,開發(fā)人員可以通過(guò)一些內(nèi)核 API 來(lái)獲取物理地址。例如,通過(guò) virt_to_phys() 函數(shù)可以將虛擬地址轉(zhuǎn)換為物理地址。
7 m- \- u+ a6 t1 N4 ^' x* D9 x- P; X3 `) }1 r3 U$ A: a
#include #include #include int init_module(void) { void *vaddr; unsigned long paddr; vaddr = kmalloc(4096, GFP_KERNEL); if (!vaddr) { printk("內(nèi)存分配失敗
: \; P1 {( j; O% r/ A"); return -ENOMEM; } paddr = virt_to_phys(vaddr); printk("虛擬地址: %p, 物理地址: %lx
7 y" n4 Q) z7 ]2 V$ B, u", vaddr, paddr); kfree(vaddr); return 0;} void cleanup_module(void) { printk("模塊卸載% x3 G+ P$ @9 F- K+ O
");} MODULE_LICENSE("GPL");
& w( d9 J2 m/ z% Z這個(gè)內(nèi)核模塊分配了一塊內(nèi)存,并將其虛擬地址轉(zhuǎn)換為物理地址。virt_to_phys() 函數(shù)只在內(nèi)核態(tài)有效,用戶態(tài)程序無(wú)法直接調(diào)用。
( p5 c8 D$ U) C! q) D5 t# q6, p i8 s7 B1 z h. ?( j7 M4 b0 x
/ P5 p, [( ^$ F" u( v
物理地址和虛擬地址的優(yōu)缺點(diǎn)
6 [, x2 Y* ~7 o$ ~/ M虛擬地址的優(yōu)點(diǎn):
6 l$ \6 y, {& k% ]3 Y8 l" ?每個(gè)進(jìn)程擁有獨(dú)立的虛擬地址空間,提高了安全性和穩(wěn)定性。虛擬地址空間可以大于實(shí)際物理內(nèi)存,通過(guò)交換技術(shù)(paging),虛擬內(nèi)存可以被分配給更大的地址空間。
% {4 X& j, i. C v i4 ~7 }5 R. i8 T4 j. y7 C. ]
物理地址的優(yōu)點(diǎn):- O) c$ O; r. F3 {( j* l
直接對(duì)應(yīng)物理內(nèi)存,訪問(wèn)速度快,無(wú)需經(jīng)過(guò)地址轉(zhuǎn)換。在操作系統(tǒng)內(nèi)核和驅(qū)動(dòng)程序中,物理地址通常用于直接訪問(wèn)硬件資源。" H/ [1 A& z) l. d
: e% e- w* z# n/ b! o: M: [$ f: d7 p) |物理地址和虛擬地址是 Linux 系統(tǒng)內(nèi)存管理的重要概念。虛擬地址提供了更靈活和安全的內(nèi)存管理方式,使得每個(gè)進(jìn)程擁有獨(dú)立的地址空間。而物理地址則直接映射到實(shí)際的內(nèi)存位置,通常用于內(nèi)核級(jí)別的操作。理解這兩個(gè)概念及其應(yīng)用,對(duì)于系統(tǒng)編程和操作系統(tǒng)的深入理解非常關(guān)鍵。
) i( w/ y2 L4 H# B. Y
ihb4gth1ceo64031921557.jpg (71.14 KB, 下載次數(shù): 1)
下載附件
保存到相冊(cè)
ihb4gth1ceo64031921557.jpg
2024-9-21 21:47 上傳
+ X( L+ y4 S! i) y1 J0 J: D
scyq31odnkz64031921657.gif (45.46 KB, 下載次數(shù): 1)
下載附件
保存到相冊(cè)
scyq31odnkz64031921657.gif
2024-9-21 21:47 上傳
; I s" V$ C m點(diǎn)擊閱讀原文,更精彩~ |
|