MIT6.828 HW4 lazy page allocation

環(huán)境

ubuntu 18.04 64位系統(tǒng)
HW地址:HW2 lazy page alloction

雖然官網(wǎng)沒有要求去閱讀trap這一章兔簇,但是我覺得還是讀一下對(duì)于本次實(shí)現(xiàn)的代碼有些幫助硬耍,而且還能基本清楚xv6是如何實(shí)現(xiàn)一個(gè)中斷和trap的。上一次的system call雖然我們實(shí)現(xiàn)了一個(gè)新的system call经柴,但是對(duì)于一個(gè)system call以及中斷這些調(diào)用的過程還沒有完全理解,閱讀一下這一章應(yīng)該可以理解個(gè)大概坯认。

正文

操作系統(tǒng)使用頁表的硬件來完成一些很巧妙的技巧之一就是對(duì)堆內(nèi)存來懶分配(lazy applocation)。Xv6程序使用系統(tǒng)調(diào)用sbrk()來申請(qǐng)堆內(nèi)存陋气。在現(xiàn)有的xv6源碼當(dāng)中,sbrk()分配了物理內(nèi)存并且將新分配的物理內(nèi)存同進(jìn)程的虛擬內(nèi)存映射起來。有一些程序申請(qǐng)了內(nèi)存巩趁,但是并沒有使用這些內(nèi)存,比如說一個(gè)很大的稀疏矩陣晶渠。復(fù)雜的內(nèi)核會(huì)延遲每一個(gè)內(nèi)存頁的分配知道程序真正需要這個(gè)頁--會(huì)觸發(fā)page fault(因?yàn)闆]有分配頁,所以會(huì)觸發(fā)page fault)褒脯。本次實(shí)驗(yàn)的目的就是在xv6中實(shí)現(xiàn)lazy page allocation。
第一部分:
第一部分要做的就是在sbrk()移除page allocation的代碼番川。sbrk()會(huì)掉用sys_sbrk()來實(shí)現(xiàn)內(nèi)存的分配,所以我們要去修改sys_sbrk()的代碼(sys_sbrk在sysproc.c中)颁督。sbrk(n)這個(gè)系統(tǒng)調(diào)用將進(jìn)程的內(nèi)存范圍增長(zhǎng)n字節(jié),然后返回新分配的內(nèi)存塊的地址(也就是原來內(nèi)存的大谐劣)。新的sbrk(n)應(yīng)該只增長(zhǎng)進(jìn)程的內(nèi)存大小(myproc()->sz)然后返回old size伐谈。它應(yīng)該只增加進(jìn)程內(nèi)存大小,但是不分配內(nèi)存诵棵。
實(shí)現(xiàn)代碼后祝旷,編譯,然后在shell 里面輸入echo hi 怀跛,你應(yīng)該會(huì)看到下面的結(jié)果:

init: starting sh
$ echo hi
pid 3 sh: trap 14 err 6 on cpu 0 eip 0x12f1 addr 0x4004--kill proc
$ 

錯(cuò)誤信息pid 3 sh:trap...來自trap.c,因?yàn)閠rap.c不知道如何去處理page fault(中斷號(hào)14,也就是T_PGFLT)吻谋。0x4004表示導(dǎo)致發(fā)生錯(cuò)誤的虛擬地址。

代碼實(shí)現(xiàn)
因?yàn)榍懊嬲f了sbrk()會(huì)掉用sys_sbrk()來實(shí)現(xiàn)內(nèi)存的申請(qǐng)什湘,所以我們只需要去修改sys_sbrk()的代碼就行了长赞。原來的代碼就不貼了。

int
sys_sbrk(void)
{
  int addr;
  int n;

  if(argint(0, &n) < 0)  //從棧當(dāng)中獲得參數(shù)得哆,并且放到n當(dāng)中,看trap那一節(jié)可以理解的
    return -1;
  addr = myproc()->sz;
  myproc()->sz += n; //只增加內(nèi)次大小栋操,但是沒有分配實(shí)際的內(nèi)存
  return addr; //返回原來的size
}

下面是我的實(shí)驗(yàn)結(jié)果:


實(shí)驗(yàn)結(jié)果

可以看到和上面題目說的輸出結(jié)果是一樣的,錯(cuò)誤的原因是在trap.c里面沒有代碼來處理page fault(中斷號(hào)14)矾芙。下面的 代碼就在trap.c當(dāng)中舍沙,上面的輸出結(jié)果就這里來的拂铡。

  default:
    if (myproc() == 0 || (tf->cs & 3) == 0)
    {
      // In kernel, it must be our mistake.
      cprintf("unexpected trap %d from cpu %d eip %x (cr2=0x%x)\n",
              tf->trapno, cpuid(), tf->eip, rcr2());
      panic("trap");
    }
    // In user space, assume process misbehaved.
    cprintf("pid %d %s: trap %d err %d on cpu %d "
            "eip 0x%x addr 0x%x--kill proc\n",
            myproc()->pid, myproc()->name, tf->trapno,
            tf->err, cpuid(), tf->eip, rcr2());
    myproc()->killed = 1;
  }

第二部分: lazy page allocation
修改trap.c中的代碼葱绒,通過新申請(qǐng)一個(gè)物理內(nèi)存頁并且將這個(gè)頁映射到錯(cuò)誤的地址,然后返回到用戶程序繼續(xù)執(zhí)行接下來的代碼地淀。你應(yīng)該在cprintf輸出錯(cuò)誤信息之前加上你的代碼。你不需要覆蓋所有的邊界條件帮毁,只需要能夠運(yùn)行一些簡(jiǎn)單的命令就行了,比如說echo,ls等等
第二部分的關(guān)鍵是下面幾個(gè)提示:

  1. 提示: 看看cprintf的參數(shù)作箍,如何得到引發(fā)page fault的地址
  2. 從allocuvm()中偷學(xué)一點(diǎn)代碼,sbrk()通過調(diào)用growporc(),然后gorwproc()調(diào)用allocuvm()來實(shí)現(xiàn)對(duì)進(jìn)程的內(nèi)存擴(kuò)容荧止。
  3. break或者return來避免cprintf()以及myproc()->killed,這個(gè)意思是說省的調(diào)用cprintf輸出了錯(cuò)誤信息,所以應(yīng)該在錯(cuò)誤信息之前就返回
  4. 你應(yīng)該調(diào)用mappages().為了能夠調(diào)用mappages(),首先需要在vm.c中將mappages()前面的static移除跃巡,然后還要在trap.c當(dāng)中聲明一下牧愁。
  5. 你可以通過tf->trapno == T_PGFLT來判斷此時(shí)的錯(cuò)誤是不是page fault
  6. 使用PGROUNDDOWN(va)來講虛擬地址向下取整
    本來按照題目的意思應(yīng)該是在default里面通過if(tf->trapno == T_PGFLT)來判斷的,不過我這樣做了猪半,我加一個(gè)新的case來實(shí)現(xiàn)這個(gè),就直接給出代碼吧,思路就卸載注釋里面:
  case T_PGFLT:
    cprintf("page fault occured \n");  //測(cè)試一下我們進(jìn)入了這里的代碼
    struct proc *curproc = myproc();  //獲得當(dāng)前進(jìn)程
    uint addr = PGROUNDDOWN(rcr2());  //向下取整磨确,cr2寄存器保存這引發(fā)page fault的地址
    char *mem = kalloc(); //新申請(qǐng)一個(gè)頁,返回的是虛擬地址
    memset(mem, 0, PGSIZE); //將這個(gè)頁設(shè)置的內(nèi)容設(shè)置為0

      //mappages摆舟,將新申請(qǐng)到的虛擬地址和mem對(duì)應(yīng) 物理地址映射起來
    if (mappages(curproc->pgdir, (char *)addr, PGSIZE, V2P(mem), PTE_W | PTE_U) < 0)
    {  
      //如果映射失敗,kill這個(gè)線程恨诱,并且釋放剛剛申請(qǐng)的內(nèi)存。
      //這里只是將進(jìn)程標(biāo)記為kill
      cprintf("out of memory \n");
      curproc->killed = 1;
      kfree(mem);
    }
    break;

下面是我的實(shí)驗(yàn)結(jié)果,不知道什么原因會(huì)輸出兩次page fault occured,也就是說發(fā)生了兩次page fault照宝,原因我也暫時(shí)還不知道。上面的代碼還是比較簡(jiǎn)陋的厕鹃,challenge 里面的東西都還沒有實(shí)現(xiàn)。


實(shí)驗(yàn)結(jié)果
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旨别,一起剝皮案震驚了整個(gè)濱河市汗茄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌洪碳,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞳腌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡嫂侍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門菲盾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來各淀,“玉大人,你說我怎么就攤上這事碎浇。” “怎么了奴璃?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)溺健。 經(jīng)常有香客問我,道長(zhǎng)鞭缭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任吱晒,我火速辦了婚禮,結(jié)果婚禮上仑濒,老公的妹妹穿的比我還像新娘。我一直安慰自己墩瞳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布氏豌。 她就那樣靜靜地躺著,像睡著了一般泵喘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纪铺,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音突诬,去河邊找鬼。 笑死攒霹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的催束。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼抠刺,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了速妖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤罕容,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后露泊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惭笑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年生真,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柱蟀。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖派歌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胶果,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布早抠,位于F島的核電站,受9級(jí)特大地震影響蕊连,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜甘苍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一烘豌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧廊佩,春花似錦、人聲如沸标锄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽星压。三九已至,卻和暖如春娜膘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拧簸。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工盆赤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人牺六。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓汗捡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親扇住。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • 簡(jiǎn)介 該實(shí)驗(yàn)需要讓JOS實(shí)現(xiàn)一個(gè)用戶環(huán)境锄贼,使其可以運(yùn)行用戶程序(進(jìn)程),用戶程序的運(yùn)行涉及到內(nèi)核態(tài)和用戶態(tài)之間的切...
    Kyrie_046a閱讀 386評(píng)論 0 0
  • 地址空間 分頁硬件 xv6的VM代碼 虛擬內(nèi)存概述 問題:假設(shè)shell程序有一個(gè)bug:有時(shí)宅荤,它會(huì)向一個(gè)隨機(jī)的內(nèi)...
    橡樹人閱讀 432評(píng)論 0 1
  • lab4 是實(shí)現(xiàn)多處理器支持以及搶占式任務(wù)調(diào)度浸策,exercize代碼見 這里。 1 多處理器啟動(dòng)流程 1.1 多處...
    __七把刀__閱讀 4,614評(píng)論 0 4
  • 環(huán)境 系統(tǒng)Ubuntu 20.04 64位系統(tǒng) HW地址:HW2-Shell[https://pdos.csail...
    扶桑與克里斯閱讀 732評(píng)論 0 0
  • Part A: User Environments and Exception Handling 在 JOS 中惫确,...
    ZoltanJin閱讀 629評(píng)論 0 2