操作系统课设--虚拟内存
山東大學(xué)操作系統(tǒng)課設(shè)lab7
- 實(shí)驗(yàn)七 虛擬內(nèi)存(lab7)
- 實(shí)驗(yàn)?zāi)康?/li>
- 實(shí)驗(yàn)環(huán)境
- 實(shí)驗(yàn)思路
- 關(guān)鍵源代碼注釋以及程序說明
- 調(diào)試記錄
實(shí)驗(yàn)七 虛擬內(nèi)存(lab7)
實(shí)驗(yàn)?zāi)康?/h2>
在未實(shí)現(xiàn)虛擬內(nèi)存管理之前,Nachos在運(yùn)行一個(gè)用戶進(jìn)程的時(shí)候,需要將程序運(yùn)行所需所有內(nèi)存空間一次性分配。虛擬內(nèi)存實(shí)現(xiàn)將突破物理內(nèi)存限制。本實(shí)驗(yàn)核心任務(wù)為根據(jù)理論學(xué)習(xí)中涉及的兌換技術(shù),設(shè)計(jì)并實(shí)現(xiàn)用戶空間的虛擬內(nèi)存管理。
實(shí)驗(yàn)環(huán)境
虛擬機(jī)下Ubuntu Linux 16.04 LTS系統(tǒng),nachos-3.4內(nèi)核管理模塊和MIPS CPU軟件模擬模塊,代碼在lab7文件夾下面實(shí)現(xiàn)。
實(shí)驗(yàn)思路
我已經(jīng)完全忘記了大二下學(xué)期學(xué)的虛擬內(nèi)存是什么了,連概念都不記得,去查了一下才記起來和虛擬內(nèi)存相對應(yīng)的是物理內(nèi)存??戳诉@個(gè)網(wǎng)頁,https://blog.csdn.net/qq_40840459/article/details/81054164
大概知道物理內(nèi)存是平時(shí)我們理解的內(nèi)存,就是一般都會(huì)從硬盤里把數(shù)據(jù)拿進(jìn)來用,因?yàn)閮?nèi)存速度比硬盤快很多。但是有時(shí)候內(nèi)存不夠用,就要用上硬盤,所以虛擬內(nèi)存其實(shí)是占用硬盤中的空間,不過是和真正內(nèi)存對應(yīng)起來的,有建立索引,每次不夠用了,就可以把現(xiàn)有的這些換出去放到硬盤里先存著,把想要的page換進(jìn)來。這樣換來換去,反反復(fù)復(fù),就很少的內(nèi)存空間可以對應(yīng)很多的硬盤空間,相當(dāng)于有很多虛擬內(nèi)存可以使。我差不多是這樣理解。
有一個(gè)很重要的步驟是交換。在發(fā)生缺頁錯(cuò)誤時(shí),才需要交換。因?yàn)閮?nèi)存中可能會(huì)存在大量我們不常訪問的數(shù)據(jù)占空間,真正的內(nèi)存不夠用的時(shí)候,需要把物理內(nèi)存通過虛擬地址當(dāng)成內(nèi)存換進(jìn)來。就其實(shí)內(nèi)存能容納的地方并沒有變多,也沒有變少,只是因?yàn)榭梢越粨Q,所以可以把舊的換出去,新的換進(jìn)來,就可以認(rèn)為我們多了很多虛擬內(nèi)存。
關(guān)鍵源代碼注釋以及程序說明
本實(shí)驗(yàn)思路來自如下網(wǎng)頁:
https://wenku.baidu.com/view/9383d57a5acfa1c7aa00ccd6.html
主要是看machine文件夾里的translate.h和translate.cc吧,這應(yīng)該就是如何去物理內(nèi)存里找頁的方法。有虛擬內(nèi)存、物理內(nèi)存這樣的屬性。
初始如下:
需進(jìn)行修改:
添加一種類型PageType,包括該頁中代碼、初始化數(shù)據(jù)、未初始化數(shù)據(jù)、用戶棧。
新定義了兩個(gè)屬性,一個(gè)是該頁在文件中塊偏移量inFileAddr,一個(gè)是當(dāng)前頁存儲(chǔ)的數(shù)據(jù)類型type。
在lab6里有在progtest.cc聲明過一個(gè)BitMap類,用來記錄內(nèi)存中物理頁的分配情況。之前是為了多用戶并行,才需要設(shè)置全局變量來控制程序。這里的交換頁同樣是全局問題,故也需要在progtest.cc里聲明一個(gè)全局變量BitMap。以下是lab6的變量設(shè)置:
將userprog文件夾里的文件拷貝到lab7中,添加新變量,SwapBitMap和SwapFile。
在AddrSpace里添加4個(gè)私有屬性,
保存指向用戶文件的指針OpenFile;
當(dāng)下正在執(zhí)行的用戶文件的NoffHeader;
頁置換用FIFO算法,添加virtualMem數(shù)組和p_vm指針,virtualMem存儲(chǔ)的是按進(jìn)入內(nèi)存的先后順序排列的當(dāng)前占用內(nèi)存空間的虛頁,p_vm指針指向數(shù)組中當(dāng)前將要被換出的那個(gè)位置。
在addrspace.h和addrspace.cc中添加方法
調(diào)試記錄
可以看出,我的96行是空行,怎么會(huì)報(bào)錯(cuò)呢?
忘記make了。
報(bào)錯(cuò),是中間有一個(gè)void和方法名沒有空格。語法錯(cuò)誤。
修改sort.c里的數(shù)組長度,避免打印過多,初始值是1024。
重新對test進(jìn)行編譯
再對lab7-8編譯
結(jié)果正確。
總結(jié)
以上是生活随笔為你收集整理的操作系统课设--虚拟内存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统课设--系统调用
- 下一篇: 机器学习+算法考试有感 2019 山东大