|  | |
| Linux下進程的內存結構 | |
| 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)。 
 由于在(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 本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》 熱點(dian)鏈接: 
         1、Linux下進程的創建、執行和終止 |