久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久


Linux下進程的內存結構

分享(xiang)到:
           

    Linux操作系(xi)統采用(yong)(yong)虛(xu)擬(ni)內存(cun)管理(li)技術,使(shi)得每個進程都有各自(zi)互不干涉的(de)(de)進程地(di)(di)(di)址(zhi)空(kong)間(jian)。該地(di)(di)(di)址(zhi)空(kong)間(jian)是大小為4GB的(de)(de)線性虛(xu)擬(ni)空(kong)間(jian),用(yong)(yong)戶(hu)所看(kan)到和接(jie)觸(chu)到的(de)(de)都是該虛(xu)擬(ni)地(di)(di)(di)址(zhi),無法看(kan)到實際(ji)的(de)(de)物理(li)內存(cun)地(di)(di)(di)址(zhi)。利用(yong)(yong)這種虛(xu)擬(ni)地(di)(di)(di)址(zhi)不但能(neng)起到保護操作系(xi)統的(de)(de)效果(用(yong)(yong)戶(hu)不能(neng)直接(jie)訪問物理(li)內存(cun)),而且更重要的(de)(de)是,用(yong)(yong)戶(hu)程序可以使(shi)用(yong)(yong)比實際(ji)物理(li)內存(cun)更大的(de)(de)地(di)(di)(di)址(zhi)空(kong)間(jian)。

    4GB的(de)(de)(de)進(jin)(jin)程(cheng)(cheng)地址(zhi)(zhi)(zhi)(zhi)空(kong)(kong)(kong)(kong)間(jian)會(hui)(hui)(hui)被(bei)分成(cheng)兩個(ge)部分:用(yong)(yong)戶(hu)(hu)(hu)空(kong)(kong)(kong)(kong)間(jian)與內(nei)核(he)空(kong)(kong)(kong)(kong)間(jian)。用(yong)(yong)戶(hu)(hu)(hu)地址(zhi)(zhi)(zhi)(zhi)空(kong)(kong)(kong)(kong)間(jian)是從0到(dao)3GB(0xC0000000),內(nei)核(he)地址(zhi)(zhi)(zhi)(zhi)空(kong)(kong)(kong)(kong)間(jian)占(zhan)據3GB到(dao)4GB。用(yong)(yong)戶(hu)(hu)(hu)進(jin)(jin)程(cheng)(cheng)在(zai)通常情況(kuang)下只能(neng)訪(fang)問(wen)用(yong)(yong)戶(hu)(hu)(hu)空(kong)(kong)(kong)(kong)間(jian)的(de)(de)(de)虛(xu)(xu)擬(ni)地址(zhi)(zhi)(zhi)(zhi),不能(neng)訪(fang)問(wen)內(nei)核(he)空(kong)(kong)(kong)(kong)間(jian)的(de)(de)(de)虛(xu)(xu)擬(ni)地址(zhi)(zhi)(zhi)(zhi)。只有(you)用(yong)(yong)戶(hu)(hu)(hu)進(jin)(jin)程(cheng)(cheng)使用(yong)(yong)系統調用(yong)(yong)(代表(biao)用(yong)(yong)戶(hu)(hu)(hu)進(jin)(jin)程(cheng)(cheng)在(zai)內(nei)核(he)態(tai)執(zhi)行)時可以(yi)訪(fang)問(wen)到(dao)內(nei)核(he)空(kong)(kong)(kong)(kong)間(jian)。每當(dang)進(jin)(jin)程(cheng)(cheng)切換時,用(yong)(yong)戶(hu)(hu)(hu)空(kong)(kong)(kong)(kong)間(jian)就會(hui)(hui)(hui)跟(gen)著(zhu)變化;而內(nei)核(he)空(kong)(kong)(kong)(kong)間(jian)由(you)內(nei)核(he)負(fu)責映射,它(ta)并不會(hui)(hui)(hui)跟(gen)著(zhu)進(jin)(jin)程(cheng)(cheng)改變,是固定(ding)的(de)(de)(de)。內(nei)核(he)空(kong)(kong)(kong)(kong)間(jian)地址(zhi)(zhi)(zhi)(zhi)有(you)自(zi)己(ji)對應的(de)(de)(de)頁表(biao),用(yong)(yong)戶(hu)(hu)(hu)進(jin)(jin)程(cheng)(cheng)各自(zi)有(you)不同的(de)(de)(de)頁表(biao)。每個(ge)進(jin)(jin)程(cheng)(cheng)的(de)(de)(de)用(yong)(yong)戶(hu)(hu)(hu)空(kong)(kong)(kong)(kong)間(jian)都是完全獨(du)立、互不相干的(de)(de)(de)。進(jin)(jin)程(cheng)(cheng)的(de)(de)(de)虛(xu)(xu)擬(ni)內(nei)存地址(zhi)(zhi)(zhi)(zhi)空(kong)(kong)(kong)(kong)間(jian)如圖3.3所(suo)示,其中用(yong)(yong)戶(hu)(hu)(hu)空(kong)(kong)(kong)(kong)間(jian)包(bao)括以(yi)下幾(ji)個(ge)功(gong)能(neng)區域(yu)。

    ● 只讀段:包含程序代碼(.init和.text)和只讀數據(.rodata)。
    ● 數據段:存放的是全局變量和靜態變量。其中可讀可寫數據段(.data)存放已初始化的全局變量和靜態變量,BSS數據段(.bss)存放未初始化的全局變量和靜態變量。
    ● 堆:由系統自動分配釋放,存放函數的參數值、局部變量的值、返回地址等。
    ● 堆棧:存放動態分配的數據,一般由程序員動態分配和釋放。若程序員不釋放,程序結束時可能由操作系統回收。
    ● 共(gong)享庫的內(nei)存映射(she)(she)區(qu)(qu)域:這(zhe)是Linux動態鏈接器和其他共(gong)享庫代碼的映射(she)(she)區(qu)(qu)域。


圖3.3 進程的虛(xu)擬(ni)內(nei)存地址空間

    由于在(zai)Linux系(xi)統(tong)中(zhong)每一個(ge)(ge)進(jin)(jin)程都會(hui)有/proc文(wen)件(jian)系(xi)統(tong)下與之對應(ying)的(de)(de)(de)一個(ge)(ge)目(mu)(mu)錄(如(ru)將init進(jin)(jin)程的(de)(de)(de)相關信息在(zai)/proc/1目(mu)(mu)錄下的(de)(de)(de)文(wen)件(jian)中(zhong)描述),因此(ci)通過proc文(wen)件(jian)系(xi)統(tong)可(ke)以(yi)查看某個(ge)(ge)進(jin)(jin)程的(de)(de)(de)地址(zhi)空間的(de)(de)(de)映射情(qing)(qing)況(kuang)。例如(ru),運(yun)行一個(ge)(ge)應(ying)用程序(示例中(zhong)的(de)(de)(de)可(ke)運(yun)行程序是在(zai)/home/david/project/目(mu)(mu)錄下的(de)(de)(de)test文(wen)件(jian)),如(ru)果(guo)它的(de)(de)(de)進(jin)(jin)程號為(wei)13703,則(ze)輸入“cat /proc/13703/maps”命令,可(ke)以(yi)查看該進(jin)(jin)程的(de)(de)(de)內存映射情(qing)(qing)況(kuang),其結果(guo)如(ru)下:

    $ cat /proc/13703/maps
    /* 只讀段:代碼段、只讀數據段 */
    08048000-08049000 r-xp 00000000 08:01 876817 /home/david/project/test
    08049000-0804a000 r--p 00000000 08:01 876817 /home/david/project/test
    /* 可讀寫數據段 */
    0804a000-0804b000 rw-p 00001000 08:01 876817 /home/david/project/test
    0804b000-0804c000 rw-p 0804b000 00:00 0
    08502000-08523000 rw-p 08502000 00:00 0 [heap] /* 堆 */
    b7dec000-b7ded000 rw-p b7dec000 00:00 0
    /* 動態共享庫 */
    b7ded000-b7f45000 r-xp 00000000 08:01 541691
    /lib/tls/i686/cmov/libc-2.8.90.so
    b7f45000-b7f47000 r--p 00158000 08:01 541691
    /lib/tls/i686/cmov/libc-2.8.90.so
    b7f47000-b7f48000 rw-p 0015a000 08:01 541691
    /lib/tls/i686/cmov/libc-2.8.90.so
    b7f48000-b7f4b000 rw-p b7f48000 00:00 0
    b7f57000-b7f5a000 rw-p b7f57000 00:00 0
    /* 動態鏈接器 */
    b7f5a000-b7f74000 r-xp 00000000 08:01 524307 /lib/ld-2.8.90.so
    b7f74000-b7f75000 r-xp b7f74000 00:00 0 [vdso]
    b7f75000-b7f76000 r--p 0001a000 08:01 524307 /lib/ld-2.8.90.so
    b7f76000-b7f77000 rw-p 0001b000 08:01 524307 /lib/ld-2.8.90.so
    bff61000-bff76000 rw-p bffeb000 00:00 0 [stack] /* 堆棧 */

    本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》

   熱點(dian)鏈接:

   1、Linux下進程的創建、執行和終止
   2、Linux下的進程結構
   3、Linux下多任務系統之進程的基本概念
   4、Linux下多任務系統之任務介紹
   5、實驗:Linux下多路復用式串口操作

更多新聞>>