OSDI6

ss
5 min readSep 24, 2018

--

突然發現這篇文一直躺在草稿中……….過了3個月讓他重見天日好了

這次的lab我覺得沒有比較簡單啊……….聽說後面會越來越簡單….可能是筆者太弱了QQ,導致最後跑去偷偷參考別人的orz,但參考之餘還是要弄懂比較重要,所以一樣會記錄下來

這次我們要實現的多核心的概念,這邊先扯到很多東西,從記憶體位置到中斷都是我們得考慮的,到底要怎樣去實現呢,主要我們會通過APIC(Advanced Programmable Interrupt Controller)去操作,每個cpu都有local APIC,又稱lapic,詳細定義可以參考kernel/lapic.c並看下圖去做一個連結

而下圖是我們這次實驗必須完成的部分

好首先我們從main.c裡面來到mem_init,這邊與lab4都一樣,差別是boot_map_region完後多了一個mem_init_mp

我們追進去查一下他要我們做什麼

根據提示說明,你必須為每個CPU的stack去做好映射,大小也告訴你了,詳情可以看inc/memlayout.h那邊畫出的圖就很好理解了,但看不太懂到底要用哪個範圍以及backed與nonbacked的差別…….,所以這邊我就參考別人做法了…..(第一關就崩潰QQ)等實驗後再問問助教好了

接著我們繼續往下走,發現在test裡面會測試mmio_map_region

主要是要我們去完成MMIO的映射,讓apic才能透過memory addrees map 去操作

透過boot_map_region就能做到這件事了,但要注意的是size如果不是PGSIZE的大小要對齊,並且稍微檢查有無overflow後,回傳此映射base的位址

然後我們注意到在 physical page中有一個MPENTRY_PADDR這個位置的page是用來放特定code用(後面會提到),我們必須先預留起來

查了一下,這個位置被定義在0x7000,也就是在npages_mem的範圍裡(詳情請至lab4),所以在page_init裡面去保留這個頁的狀態,讓他不要被抓去free區

最後在setupkvm這邊我也栽了很久,這邊沒設好就會一直發生page fault

LAB6兩個意思都懂但不知道怎樣實作,搞了很久才知道有cpunum這個function可以用,所以第一個map就解決了,但第二個,真的是讓筆者不知道吐了幾次血,最後只好再上網查資料先參考別人的,其實沒有的話直接執行在這邊就可以成功了,但一fork就會出事

先到這邊告一個小段落,光這樣就花了我整個周末,預計大概十小時吧…….

好接著我們站穩了腳步,就把心臟變大顆繼續往下走,接著我們在main.c遇見了mp_init,大家可以去看一下,他是怎麼去簡單初始化cpu的,然後我們接著看到lapic_init去初始化lapic裡面過程筆者就先略過了(但感覺demo一定跑不掉…….晚點做完lab再來研究),接著我們發現task_init多了一個task_init_percpu(),這邊將再面臨一個挑戰……….

因為現在變成多核心,每個cpu都要去設定也就是整段幾乎都要改掉,差點斷氣在這邊,我們去kernel/cpu.h查看cpu的struct有些什麼

一開始真的毫無頭緒,呈現崩潰狀態,因為提示真的太少了,所以我們就根據上方結構,去一個個改掉,但這邊牽一髮而動全身,很多東西都要跟著改掉,所以這邊容筆者先不說明了,說明玩肯定跑不了兩千字,等筆者有很閒的時間會再慢慢說完。

--

--

ss
ss

No responses yet