進(jìn)程和內(nèi)存的橋梁——頁(yè)表技術(shù)(x86-64Linux下)

其實(shí)這篇文章是printf("%d%d%d",i++,i++,i++)的后續(xù)佳鳖。

需要注意的名詞:

地址空間和內(nèi)存空間

序:

我之前在寫完printf函數(shù)傳參之后评凝,所有的技術(shù)層面全在操作系統(tǒng)給我們提供的進(jìn)程抽象之上灭美,但是,作為一個(gè)決定挖坑到底的C程序員寸齐,我們繼續(xù)討論我們關(guān)于“內(nèi)存”這個(gè)神坑屯曹。

下面是x86-64Linux操作系統(tǒng)給我們提供的,進(jìn)程(邏輯)地址空間:

圖片發(fā)自CSAPP

這個(gè)圖很經(jīng)典宁赤,剛?cè)肟拥呐笥芽梢粤魝€(gè)心眼舀透,入坑已久的,不用我多說决左,自然是倒著也能畫出來了愕够。

這個(gè)圖是結(jié)果走贪,我們要找的是它的根,但是我們?cè)谙旅娴挠懻摿戳遥⒉灰詘86-64Linux內(nèi)核真正的內(nèi)存映射方式為例厉斟,而是僅僅從分頁(yè)技術(shù)的角度去討論。至于原因强衡,很簡(jiǎn)單我們是來填坑的擦秽,一旦使用了更大的技術(shù),那么我們最終填的坑還不如挖的坑多漩勤,所以我們的目標(biāo)很明確——填小坑感挥。

1、對(duì)于內(nèi)存:我們將內(nèi)存抽象成一個(gè)連續(xù)的數(shù)組空間(關(guān)于內(nèi)存的層次存儲(chǔ)結(jié)構(gòu)的坑越败,我在之后會(huì)填上)触幼。

2、對(duì)于進(jìn)程:由序中進(jìn)程地址空間的結(jié)果可以知道究飞,最終我們的操作系統(tǒng)給內(nèi)存形成了一個(gè)連續(xù)的地址空間置谦。

我們的最終結(jié)果是把內(nèi)存和進(jìn)程聯(lián)系起來,當(dāng)然亿傅,還有很多其他的引導(dǎo)思路的方式(重定位——靜態(tài)重定位媒峡、靜態(tài)重定位;對(duì)換技術(shù)葵擎;分區(qū)法)谅阿。當(dāng)然我這里是引述的某本我覺得還行的書籍上的內(nèi)容,我自己還沒有形成體系酬滤。

呃呃呃签餐,又扯遠(yuǎn)了。對(duì)了盯串,上面的坑氯檐,我不負(fù)責(zé)填。

頁(yè)表——內(nèi)存和進(jìn)程的橋梁

既然是橋梁体捏,當(dāng)然是這頭連著進(jìn)程男摧,那頭牽著內(nèi)存刑棵。放下大圖:

“喏宅荤,我們的橋就是這個(gè)樣子”

1殖侵、橋梁存在的目的:

方便一個(gè)進(jìn)程使用不連續(xù)的(物理)內(nèi)存空間,想象一下奏司,在內(nèi)存不足的情況下,如果每個(gè)進(jìn)程都使用連續(xù)的內(nèi)存空間樟插,那么我們的內(nèi)存一次只能加載少量的進(jìn)程韵洋,那么將消耗更多的時(shí)間從硬盤加載進(jìn)程到內(nèi)存竿刁,而在加載的時(shí)間我們的CPU極有可能處于空閑狀態(tài),那么我們的程序運(yùn)行上就感覺很慢搪缨,客戶體驗(yàn)極差食拜。

我來翻譯一下橋梁是怎么連接內(nèi)存和進(jìn)程的:

2、邏輯地址空間分頁(yè):

我們把進(jìn)程最終的地址空間劃分成相等的若干部分副编,我們稱每一個(gè)部分為一頁(yè)负甸。每頁(yè)都有一個(gè)地址編號(hào),我們稱為頁(yè)號(hào)痹届。且從0開始依次編排呻待,如0,1队腐,2蚕捉,3...

3、內(nèi)存空間分塊:

我們把內(nèi)存等分成與一個(gè)頁(yè)相等的若干部分柴淘,每個(gè)部分稱為內(nèi)存塊迫淹。同樣,對(duì)他們進(jìn)行編號(hào)为严,塊號(hào)從0開始依次編排:0#塊敛熬,1塊,2#塊梗脾,3#塊...


頁(yè)或塊的大小是由硬件(系統(tǒng))確定的荸型,它一般被選擇為2的若干次冪。例如炸茧,IBM AS/400規(guī)定的頁(yè)面大小為512B瑞妇,而Intel 80836的頁(yè)面大小為4KB(即4096B)。所以不同的機(jī)器頁(yè)面大小有所不同梭冠。

我們現(xiàn)在得到了幾個(gè)零散的概念辕狰,我在這里再重新梳理一遍:

進(jìn)程空間的頁(yè),內(nèi)存空間的塊控漠,橋梁蔓倍。

我們的空間頁(yè)和內(nèi)存塊都是一段絕對(duì)連續(xù)的線性字節(jié)數(shù)組,我們要把空間頁(yè)和內(nèi)存塊連接起來盐捷,現(xiàn)在猜測(cè)偶翅,有一種可能的方式:頁(yè)表的任一項(xiàng)的一段保存某一空間頁(yè)的首地址,另一段保存塊的首地址碉渡。好像沒有什么毛病聚谁,對(duì)吧。但是滞诺,這種方式并不利于我們的數(shù)據(jù)尋址形导。為什么不利于环疼,這個(gè)坑,我也不填朵耕。



4炫隶、而實(shí)際上的聯(lián)系

我們并不是在頁(yè)表的每一項(xiàng)保存頁(yè)和塊的首地址,而是頁(yè)號(hào)和頁(yè)內(nèi)地址阎曹。

例如:我們的進(jìn)程中有一條代碼的指令是:LOAD 1伪阶,500,它實(shí)現(xiàn)把500號(hào)單元的數(shù)據(jù)裝到寄存器1中去芬膝。這里的500還是我們程序被編譯好之后的可重定位地址望门,還是相對(duì)地址。我們首先從地址A(這里是500)锰霜,由分頁(yè)地址映像硬件自動(dòng)得到我們的頁(yè)表項(xiàng)內(nèi)容:頁(yè)號(hào)和塊號(hào)橋(p筹误,d)。然后以頁(yè)號(hào)p為索引去檢索頁(yè)表癣缅,得到我們的塊號(hào)f厨剪,然后由塊號(hào)f和頁(yè)內(nèi)地址d在內(nèi)存空間中進(jìn)行數(shù)據(jù)檢索。下面是詳細(xì)圖:

每個(gè)作者有不同的理解方式友存,這是某本書原作者的內(nèi)容

經(jīng)過上述的步驟祷膳,我們的進(jìn)程地址空間和內(nèi)存空間就形成了一個(gè)良好的聯(lián)系。再啰嗦一句屡立,上面我只提到數(shù)據(jù)尋址直晨,其實(shí)我們往內(nèi)存中保存數(shù)據(jù)時(shí)就是這種方式,所以才能有我們數(shù)據(jù)尋址的結(jié)果膨俐。

頁(yè)號(hào)p和頁(yè)內(nèi)地址d的求值方式


還是從某書的照片勇皇,我太懶了,直接看圖吧
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末焚刺,一起剝皮案震驚了整個(gè)濱河市敛摘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乳愉,老刑警劉巖兄淫,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蔓姚,居然都是意外死亡捕虽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門坡脐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泄私,“玉大人,你說我怎么就攤上這事⊥诼耍” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵浅役,是天一觀的道長(zhǎng)斩松。 經(jīng)常有香客問我,道長(zhǎng)觉既,這世上最難降的妖魔是什么惧盹? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮瞪讼,結(jié)果婚禮上钧椰,老公的妹妹穿的比我還像新娘。我一直安慰自己符欠,他們只是感情好嫡霞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著希柿,像睡著了一般诊沪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上曾撤,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天端姚,我揣著相機(jī)與錄音,去河邊找鬼挤悉。 笑死渐裸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的装悲。 我是一名探鬼主播昏鹃,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼衅斩!你這毒婦竟也來了盆顾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤畏梆,失蹤者是張志新(化名)和其女友劉穎您宪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奠涌,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宪巨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了溜畅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捏卓。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出怠晴,到底是詐尸還是另有隱情遥金,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布蒜田,位于F島的核電站稿械,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏冲粤。R本人自食惡果不足惜美莫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梯捕。 院中可真熱鬧厢呵,春花似錦、人聲如沸傀顾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)锣笨。三九已至蝌矛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間错英,已是汗流浹背入撒。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留椭岩,地道東北人茅逮。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像判哥,于是被迫代替她去往敵國(guó)和親献雅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,072評(píng)論 25 707
  • 一.管道機(jī)制(pipe) 1.Linux的fork操作 在計(jì)算機(jī)領(lǐng)域中塌计,尤其是Unix及類Unix系統(tǒng)操作系統(tǒng)中挺身,...
    Geeks_Liu閱讀 3,687評(píng)論 1 9
  • 昨天給李曉發(fā)了我穿的新買的衣服的照片,問他美不?他說锌仅,不美章钾,只是人美了,穿什么都好看热芹。有覺悟贱傀,我也是這么覺得的。你...
    范范不適合飯飯閱讀 242評(píng)論 3 0
  • 00 我是一個(gè)智腦伊脓。 確切來說府寒,我是由一個(gè)智能芯片而進(jìn)化出來的人格。 如果你還不明白,那么再進(jìn)一步株搔。按照教科書上的...
    殊嬰閱讀 510評(píng)論 1 4
  • 剛剛修改好論文剖淀,洗漱的同時(shí)想著今天一直想寫的話題∠朔浚可作了幾番思想斗爭(zhēng)祷蝌,結(jié)果竟是無內(nèi)容可寫。索性順其自然帆卓,就回憶回憶...
    咚2咯咯閱讀 289評(píng)論 1 3