|
ut3uib2wvew64013564414.gif (60.41 KB, 下載次數(shù): 4)
下載附件
保存到相冊(cè)
ut3uib2wvew64013564414.gif
2024-9-18 09:46 上傳
$ f4 J! b4 n, V; \ Z點(diǎn)擊上方藍(lán)色字體,關(guān)注我們
+ ?, @ N. E5 _
( t! o2 F; V: V' L* H+ mMMU 通過(guò)頁(yè)表將虛擬地址轉(zhuǎn)換為物理地址,頁(yè)表保存了虛擬地址到物理地址的映射信息。不同的進(jìn)程可以有相同的虛擬地址,但它們映射到的物理地址可能不同。. ^% L7 `# I9 v# v9 x1 \) ^
& P0 x2 \ a8 |6 ~/ k% h
頁(yè) (Page): 虛擬內(nèi)存和物理內(nèi)存被劃分為相同大小的塊,稱為頁(yè)。' z' @$ f) W, h9 E
常見(jiàn)的頁(yè)大小為 4 KB。頁(yè)表 (Page Table): 頁(yè)表是一個(gè)數(shù)據(jù)結(jié)構(gòu),存儲(chǔ)了虛擬地址與物理地址的映射。5 Y) S9 B; r- J! {9 K- i
+ S; `6 n K% C
頁(yè)表示例:" x: v5 b4 O5 w8 r0 V; ]
假設(shè)有一個(gè)虛擬地址 0xB8000000,通過(guò)頁(yè)表,它可能被映射到物理地址 0x12000000。這個(gè)過(guò)程是透明的,應(yīng)用程序只需要處理虛擬地址,操作系統(tǒng)和硬件負(fù)責(zé)完成地址轉(zhuǎn)換。
( W# T1 x8 ]8 @9 C0 d: h4# L4 |9 H4 D2 ]
虛擬地址的應(yīng)用實(shí)例
( s f% O; D O在應(yīng)用程序中,開(kāi)發(fā)人員通常只與虛擬地址打交道。以下是一個(gè)簡(jiǎn)單的 C 程序示例,演示如何使用虛擬地址訪問(wèn)內(nèi)存。7 u' K! x1 A* ~& @8 `+ p7 l5 K
2 ^ S. ]! d' {+ D! [9 j#include #include int main() { int *ptr = (int *)malloc(sizeof(int)); if (ptr == NULL) { fprintf(stderr, "內(nèi)存分配失。
8 M+ W' g9 x1 v! P: x$ L+ t"); return 1; } *ptr = 42; printf("虛擬地址: %p, 值: %d
4 G: [( e$ a. |", (void*)ptr, *ptr); free(ptr); return 0;}
0 u, ^7 k3 R' X6 Q在這個(gè)示例中,malloc() 函數(shù)分配了一塊內(nèi)存,并返回該內(nèi)存塊的虛擬地址。該地址在程序的虛擬地址空間中有效,指向一個(gè)內(nèi)存位置。通過(guò)打印指針 ptr 的值,可以看到虛擬地址。
3 F3 g* V) n- d5 Z$ j5 W5 X5. |1 g& K7 |+ D* g* `6 O( y& N5 W# m
物理地址的應(yīng)用實(shí)例8 w" S/ O$ Z+ X+ [' J
物理地址的直接使用通常僅限于操作系統(tǒng)內(nèi)核或驅(qū)動(dòng)程序開(kāi)發(fā)。在內(nèi)核編程中,開(kāi)發(fā)人員可以通過(guò)一些內(nèi)核 API 來(lái)獲取物理地址。例如,通過(guò) virt_to_phys() 函數(shù)可以將虛擬地址轉(zhuǎn)換為物理地址。& b9 o: S) ^" o/ X6 }
7 ]; N# a0 J; x1 E% W( s. S
#include #include #include int init_module(void) { void *vaddr; unsigned long paddr; vaddr = kmalloc(4096, GFP_KERNEL); if (!vaddr) { printk("內(nèi)存分配失敗
. O' }# ?; U& D, c4 [# k"); return -ENOMEM; } paddr = virt_to_phys(vaddr); printk("虛擬地址: %p, 物理地址: %lx/ M! f" U% {& ?! k8 s
", vaddr, paddr); kfree(vaddr); return 0;} void cleanup_module(void) { printk("模塊卸載/ `8 m+ p/ P+ T6 g
");} MODULE_LICENSE("GPL");3 k/ U, a- f) l$ p( o
這個(gè)內(nèi)核模塊分配了一塊內(nèi)存,并將其虛擬地址轉(zhuǎn)換為物理地址。virt_to_phys() 函數(shù)只在內(nèi)核態(tài)有效,用戶態(tài)程序無(wú)法直接調(diào)用。* z( o8 p# A+ {; Z* P
62 C/ W) V5 ~4 u. q6 h0 p
- @7 L f9 W" I/ {! q, M; R& X物理地址和虛擬地址的優(yōu)缺點(diǎn). X" ], X0 a) Z( C/ i1 R
虛擬地址的優(yōu)點(diǎn):5 o. t# Z$ q, \: X0 q6 R" Y! k' I* F
每個(gè)進(jìn)程擁有獨(dú)立的虛擬地址空間,提高了安全性和穩(wěn)定性。虛擬地址空間可以大于實(shí)際物理內(nèi)存,通過(guò)交換技術(shù)(paging),虛擬內(nèi)存可以被分配給更大的地址空間。1 L3 t- F$ R( ?8 p6 R4 J4 h
4 g# h+ t# W( |+ R1 E' F物理地址的優(yōu)點(diǎn):& V8 L e6 z* k- ] g
直接對(duì)應(yīng)物理內(nèi)存,訪問(wèn)速度快,無(wú)需經(jīng)過(guò)地址轉(zhuǎn)換。在操作系統(tǒng)內(nèi)核和驅(qū)動(dòng)程序中,物理地址通常用于直接訪問(wèn)硬件資源。
9 B# K' r" I3 R& e) ]$ x
2 g+ e% c q0 T0 W2 S- m) r" ]物理地址和虛擬地址是 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)鍵。- k$ l' N; S$ ~( S0 Z8 ]) G
j0r5gym0sq264013564514.jpg (71.14 KB, 下載次數(shù): 3)
下載附件
保存到相冊(cè)
j0r5gym0sq264013564514.jpg
2024-9-18 09:46 上傳
6 O) O! e) I q k; b
w0aulahi3f564013564614.gif (45.46 KB, 下載次數(shù): 3)
下載附件
保存到相冊(cè)
w0aulahi3f564013564614.gif
2024-9-18 09:46 上傳
6 ?3 K- i& w/ }5 \
點(diǎn)擊閱讀原文,更精彩~ |
|