BUAAOS Lab2實驗報告

2022-09-08 21:27:28 字數 4441 閱讀 8267

本次明確

實驗要做的作業系統是32位的,按位元組編址

採用鍊錶來管理空閒記憶體空間

相同型別資料的指標相減得到的是其中間相差的該型別資料個數

對指標進行加的含義並非對位址進行加,而是加對應倍的指標型別資料大小。

作業系統執行在虛擬記憶體空間中,過程中使用的所有的位址都是虛擬位址。

物理記憶體與核心虛擬空間實際上就是簡單的線性對映。

thinking2.1 請思考cache用虛擬位址來查詢的可能性,並且給出這種方式對訪存帶來的好處和壞處。另外,你能否能根據前乙個問題的解答來得出用實體地址來查詢的優勢?

thinking2.2 在我們的實驗中,有許多對虛擬位址或者實體地址操作的巨集函式(詳見include/mmu.h ),那麼我們在呼叫這些巨集的時候需要弄清楚需要操作的位址是實體地址還是虛擬位址,閱讀下面的**,指出x是乙個實體地址還是虛擬位址。

thinking2.3 我們在 include/queue.h 中定義了一系列的巨集函式來簡化對鍊錶的操作。實際上,我們在 include/queue.h 檔案中定義的鍊錶和 glibc 相關原始碼較為相似,這一鍊錶設計也應用於 linux 系統中 (sys/queue.h 檔案)。請閱讀這些巨集函式的**,說說它們的原理和巧妙之處。

原理:巨集函式在預處理的時候會將相應的位置替換成對應的巨集,然後對其中的一些引數做替換。

具體巨集**解讀:

thinking2.4 我們注意到我們把巨集函式的函式體寫成了 do while(0)的形式,而不是僅僅寫成形如 的語句塊,這樣的寫法好處是什麼?

thinking2.5 注意,我們定義的 page 結構體只是乙個資訊的載體,它只代表了相應物理記憶體頁的資訊,它本身並不是物理記憶體頁。 那我們的物理記憶體頁究竟在哪呢?page 結構體又是通過怎樣的方式找到它代表的物理記憶體頁的位址呢? 請你閱讀 include/pmap.h 與 mm/pmap.c 中相關**,並思考一下。

thinking2.6 請閱讀 include/queue.h 以及 include/pmap.h, 將page_list的結構梳理清楚,選擇正確的展開結構(請注意指標)。

thinking2.7 在 mmu.h 中定義了 bzero(void *b, size_t) 這樣乙個函式,請你思考,此處的b指標是乙個實體地址, 還是乙個虛擬位址呢?

thinking2.8 了解了二級頁表頁目錄自對映的原理之後,我們知道,win2k核心的虛存管理也是採用了二級頁表的形式,其頁表所佔的 4m 空間對應的虛存起始位址為 0xc0000000,那麼,它的頁目錄的起始位址是多少呢?

thinking2.9 注意到頁表在程序位址空間中連續存放,並線性對映到整個位址空間,思考:是否可以由虛擬位址直接得到對應頁表項的虛擬位址?上一節末尾所述轉換過程中,第一步查頁目錄有必要嗎,為什麼?

thinking2.10 觀察給出的**可以發現,page_insert會預設為頁面設定pte_v的許可權。請問,你認為是否應該將pte_r也作為預設許可權?並說明理由。

thinking 2.11 思考一下tlb_out彙編函式,結合**闡述一下跳轉到nofound的流程?從mips手冊中查詢tlbp和tlbwi指令,明確其用途,並解釋為何第10行處指令後有4條nop指令。

thinking2.12 顯然,執行後結果與我們預期的不符,va值為0x88888,相應的pa中的值為0。這說明我們的**中存在問題,請你仔細思考我們的訪存模型,指出問題所在。

thinking2.13 在x86體系結構下的作業系統,有乙個特殊的暫存器cr4,在其中有乙個pse位,當該位設為1時將開啟4mb大物理頁面模式,請查閱相關資料,說明當pse開啟時的頁表組織形式與我們當前的頁表組織形式的區別。

emmm感覺好多東西學完感覺也不是很難的,但當時覺得都挺難的,我就記錄一下吧

物理記憶體管理中相關結構理解

記錄頁資訊的的結構體

該結構體的形式擴充套件開來如下:

//頭節點:

struct page_list

//頁面資訊節點:(若是空閒頁面則在鍊錶中)

struct page pp_link;

u_short pp_ref; //記錄該物理頁面引用次數

}

鍊錶的整體結構大抵如下圖所示:(注意指標的指向)

這裡的鍊錶用於空閒頁面的管理,其中每個節點都表示乙個相應的空閒物理頁表資訊。

所有的物理頁面都有各自的頁面資訊結構體,在實驗要設計的作業系統中使用了乙個結構體指標pages(當然也可以視為陣列啦),根據物理頁面的實體地址pa將相應資訊結構體按順序存放在該指標開始的空間裡,具體來講就是:根據物理頁面的實體地址pa計算出來物理頁號ppn,那麼其資訊結構體就可以通過pages[ppn](這是個頁虛擬位址)來進行訪問嘍!!

物理頁號、頁實體地址、頁面資訊結構體指標、頁虛擬位址轉換

在標頭檔案中定義了幾個函式和巨集:

記憶體管理初始化流程

mips_vm_init();

為頁目錄、頁結構體和envs分配了物理空間,並建立了頁結構體pages虛擬記憶體空間和pages物理記憶體空間的頁表對映關係,以及envs虛擬記憶體空間和envs物理記憶體空間的也表對映關係。

分配envs空間(216kb):虛擬記憶體空間:0x80432000 ~ 0x80468000

page_init();

初始化頁結構體,建立空閒頁面管理的鏈結構體

頁目錄自對映

虛擬記憶體空間中的結構如圖所示:

這部分的學習記錄寫在了部落格裡。

pte //page table entry 頁表項

pgdir //page directory 頁目錄

pde //page directory entry 頁目錄項

彙編**的理解

幾個巨集函式的理解:

#define leaf(symbol) 			\

.global symbol; \

.align 2; \

.type symbol, @function; \

.ent symbol, 0; \

symbol: .frame sp, 0, ra

#define end(function)			\

.end function \

.size function, .-function

leaf和end是彙編檔案中常見的巨集,在我們實驗的作業系統彙編**裡幾乎都有這兩個巨集作為檔案的開頭和結尾。leaf被用來定義乙個簡單的例程,即不呼叫其他例程,其中幾個偽指令的解讀如下:

tlb轉換表中每一項含有乙個頁的虛擬位址(vpn即虛擬頁號)和乙個物理頁位址(pfn即物理頁幀號)。所以tlb中是直接拿虛擬頁號來查詢的,並且不是按照索引,而是逐項比較vpn,是一種內容定址的儲存器。當查詢到相符的vpn,則取出pfn。(pfn與標誌位一同儲存一同返回,標誌位能讓作業系統指定某一頁為唯讀或者指定某頁的資料是否可以快取記憶體)。

tlb相關的cpu控制暫存器

cp0_entrylo0/cp0_entrylo1(輸出域):

ps:目前為止還用不到這些,等我日後總結吧

cp0_index:tlb表項的索引

tlb控制指令

從寫本次lab2課下實驗的過程中就能明顯感受到這次實驗的難度陡然增大,搞懂(自我感覺的搞懂。。。可能只是一知半解吧)本次實驗我大概用了30多個小時。感覺這一部分的填寫並不難,因為助教給了詳細的步驟說明,幾乎每一行**都有相應的提示,但是要搞懂整個的記憶體管理模型結構還是很耗費精力的(腦子疼wwww),即使到現在還是有一部分問題沒有解決,希望在之後的**能找到這些問題的答案,也希望下次的**能讀得順利一些。

實驗2實驗報告

實驗結論 1 書上任務1的填空 首先,使用 e 命令將記憶體單元 0021 0 0021 7 連續 8 個位元組資料修改為 30h,31h,32h,33h,34h,35h,36h,37h 然後用a命令輸入程式段 然後蠢蠢的我檢查了一下cs和ip的值,結果發現就是該程式段的起始位址,emmmm 好吧,...

實驗報告 2

編寫基於物件的程式。資料成員包括長寬高,體積,要求用成員函式實現下面的功能 1 由鍵盤輸入3個長方柱的長 length 寬 width 高 high 2 計算長方柱的體積 volume 和表面積 areas 3 輸入這3個長方柱的體積和表面積。html view plain copy print?i...

實驗報告2

1 用floyd演算法求解下圖各個頂點的最短距離。寫出floyd演算法的偽 和給出距離矩陣 頂點之間的最短距離矩陣 2 對於下圖使用dijkstra演算法求由頂點a到頂點h的最短路徑。1 用d v w 記錄每一對頂點的最短距離。依次掃瞄每乙個點,並以其為基點再遍歷所有每一對頂點d的值,看看是否可用過...