電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 30|回復(fù): 0
收起左側(cè)

Linux物理地址和虛擬地址

[復(fù)制鏈接]

528

主題

528

帖子

3006

積分

四級(jí)會(huì)員

Rank: 4

積分
3006
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-9-14 12:03:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式

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  i
    4 ~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 + X( L+ y4 S! i) y1 J0 J: D

    ; I  s" V$ C  m點(diǎn)擊閱讀原文,更精彩~
  • 發(fā)表回復(fù)

    本版積分規(guī)則

    關(guān)閉

    站長(zhǎng)推薦上一條 /1 下一條


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表