日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nachos-虚拟内存管理

發布時間:2023/12/10 编程问答 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nachos-虚拟内存管理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

nachos虛擬內存實驗

文章目錄

  • nachos虛擬內存實驗
  • 內容一、總體概述
  • 內容二、任務完成情況
    • 具體Exercise的完成情況
      • 1.Exercise1 源代碼閱讀
      • 2.Exercise2 TLB MISS 異常處理
      • Exercise 3 置換算法
      • Exercise 4 內存全局管理數據結構
      • Exercise 5 多線程支持
      • Exercise 6 缺頁中斷處理
      • Exercise 7 lazy-loading
      • Challenge2 多線程實現基本思路:
    • 內容三:遇到的困難及解決方法
    • 內容四:收獲及感想
    • 內容五:對課程的意見和建議


內容一、總體概述

本次實驗主要是通過閱讀相關代碼,了解 nachos用戶程序的執行過程,之后完成TLB,頁表和虛擬內存等的實現。。其中第一部分主要內容是實現TLB相關異常處理和置換算法,當前的 nachos只支持單個用戶程序,沒有用到TLB。第二部分的主要內容是實現全局內存管理機制,使得 nachos內存可以同時存在多個線程。第三部分的主要內容是實現程序運行過程中發生缺頁中斷時,才會將所需的頁面從磁盤調入內存。Challenge部分是增加線程掛起狀態以及實現倒排頁表。

內容二、任務完成情況

任務完成列表(Y/N)

Exercise1Exercise2Exercise3Exercise4Exercise5Exercise6Exercise7Challenge
YYYYYYYY

具體Exercise的完成情況

1.Exercise1 源代碼閱讀

  • 閱讀code/userprog/progtest.cc,著重理解nachos執行用戶程序的過程,以及該過程中與內存管理相關的要點。
  • 閱讀code/machine目錄下的machine.h(cc),translate.h(cc)文件和code/userprog目錄下的exception.h(cc),理解當前Nachos系統所采用的TLB機制和地址轉換機制。

(1)用戶程序執行過程

userprog/progtest.cc定義函數
StartProcess主要功能是實現用戶程序啟動,
如果我們希望執行test中的用戶程序,
那么我們進入userprog,執行./nachos -x …/test/
(用戶程序),通過識別-x 參數,nachos 調用
StartProcess 執行用戶程序
(具體實現在 threads/main.cc)
StartProcess 的基本流程是:
通過文件系統定義的 OpenFile 打開相關文件
通過 AddrSpace的構造函數建立用戶空間,裝載文件
通過 AddrSpace 的InitRegisters 函數初始化用戶寄存器
通過 AddrSpace 的RestoreState 函數裝載頁表
通過machine的Run 函數運行用戶程序
AddrSpace 的構造函數實現在 userprog/addrspace.cc,主要流程是:
獲取文件頭,大小端做適宜轉換
通過文件頭計算文件所需空間,包括代碼段,初始化數據段,未初始化數據段,棧空間 4 個部分
通過文件所需空間計算出文件所需的虛擬頁面數量,創建用戶空間頁表,指示了第 i 個虛擬頁對應第 i 個物理頁,將用戶程序的正文段和相關數據依次調入內存。
AddrSpace 的 InitRegisters 函數實現在 userprog/addrspace.cc,主要流程是:
初始化普通寄存器(初始化為 0)
初始化當前指令指針(PC,初始化為 0)
初始化下一條指令指針(初始化為 4)
初始化棧指針(地址空間尾部適當前移)
AddrSpace 的 RestoreState 函數實現在 userprog/addrspace.cc,主要流程是:
將頁表裝載到machine 類中
準備執行用戶程序machine 的Run函數實現在machine/mipssim.cc,基本流程是:
通過 OneInstruction 函數完成指令譯碼和執行
通過interrupt 的 OneTick 函數使得時鐘前進
machine 的Run 函數通過 machine 的ReadMem 函數讀內存數據,通過 machine的WriteMem 函數寫內存數據,兩個函數的實現在 machine/translate.cc,核心是 translate 函數
translate 函數實現在machine/translate.cc,主要功能是實現虛擬地址到物理地址的轉換,translate 函數可能返回相應的錯誤,在這樣的情況下,ReadMem 函數/WriteMem 函數調用 RaiseException 函數進行處理,
RaiseException 函數定義在 machine/machine.cc,基本流程是將錯誤信息存儲在特定位置,調用 ExceptionHandler 函數處理不同的錯誤,
ExceptionHandler函數實現在userprog/exception.cc,主要流程是根據錯誤信息處理不同錯誤。
目前支持的錯誤:

NoException, // 正常 SyscallException, // 系統調用 PageFaultException, // 缺頁(頁表/快表) ReadOnlyException, // 訪問只讀頁面 BusErrorException, // 總線錯誤 AddressErrorException, // 訪問地址對齊錯誤/超出范圍 OverflowException, // 算數溢出 IllegalInstrException, // 非法指令 NumExceptionTypes

寄存器支持:

(2)TLB 機制和地址轉換機制

表項維護的位置是machine/translate.h 中 TranslationEntry 數據結構

Class TranslationEntry { public: int virtualPage; // 虛擬頁號 int physicalPage; // 物理頁號 boot valid; // 該Entry 是否使用,TRUE 表示使用 bool readOnly; // 對應頁的訪問屬性,TRUE 示只讀,否則為讀寫 bool use; // 該Entry 是否被使用過,每次訪問后置為TRUE bool dirty; // 對應的物理頁使用情況,TRUE 表示被寫過 }

相關參數

以下參數定義在filesys/disk.h #define SectorSize 128 以下參數定義在machine/machine.h #define PageSize SectorSize #define NumPhysPages 32 #define MemorySize (NumPhysPages * PageSize) #define TLBSize 4

TLB 初始化的位置是machine/machine.cc 中machine 的構造函數

TLB 的使用的位置是machine/translate.cc中的translate函數,基本流程是遍歷TLB 數組,查找是否有對應映射,如果有,那么 TLB 命中,直接進行物理地址轉換,否則,TLB 沒有命中,標志 PageFaultException,進入Exception處理。(目前還沒有對應的處理函數)
地址轉換機制的位置是machine/translate.cc中的translate 函數,基本流程是:通過虛擬地址得到vpn和offset,通過TLB或是 Pagetable得到vpn對應的ppn,(否則拋出異常,在異常處理函數中做處理,但目前這部分沒有實現),通過ppn 和offset 得到物理地址,返回物理地址。
需要說明的是,在處理完TLB的miss或者Pagefault 之后,不需要將PC+4,因為異常處理函數結束后,返回的最終位置會是OneInstruction函數的取指階段。取指失敗后,OneInstruction函數會退出,然后再用相同的PC取指。而這次就能夠TLB hit或者pagetable hit了。
machine/machine.cc 的 Machine 類模擬內存,重要函數包括

Run 運行用戶程序 ReadRegister/WriteRegister 讀/寫寄存器 OneInstruction 執行一條指令 ReadMem/WriteMem 讀/寫內存 Translate 地址轉換(虛擬地址->物理地址) RaiseException 拋出異常 userprog/addrspace.cc 的 AddrSpace 類模擬用戶程序內存,重要函數包括 InitRegisters 初始化相關寄存器 SaveState 保存機器狀態 RestoreState 恢復機器狀態

2.Exercise2 TLB MISS 異常處理

修改code/userprog目錄下exception.cc中的ExceptionHandler函數,使得Nachos系統可以對TLB異常進行處理(TLB異常時,Nachos系統會拋出PageFaultException,詳見code/machine/machine.cc)

1、設計思路

首先Translate()方法,啟動TLB,讓用戶程序在運行的時候先訪問 TLB,如果出現 TLB MISS,會立刻拋出一個 RaiseException(),然后通過 ExceptionHandler()處理這個缺頁異常,處理的動作就是讓系統從pageTable 頁表中查找要找的頁表項。

2、userprog/Makefile

我們需要使用TLB,但是TLB并沒有啟用(在Exercise1里面解釋過),所以我們需要先在userprog/Makefile添加宏。

然后在machine/machine.h中對USE_TLB進行宏定義,只有這樣宏才能真正起作用。

3、machine/translate.cc

因為系統是默認沒有啟用TLB的,但是我們現在啟用了TLB,所以我們應該注釋掉ASSERT(tlb == NULL || pageTable == NULL); ,否則會報錯Assertion failed: line 203, file “…/machine/translate.cc”

4、userprog/exception.cc

修改ExceptionHandler函數,因為之前系統是沒有PageFaultException異常的(因為之前系統默認是把物理頁面全部裝入內存的,也沒有啟用TLB所以不會出現PageFaultException),所以我們需要添加PageFaultException,并進行處理。

else if(which == PageFaultException){//發生缺頁中斷則讓TLBMissCount++TLBMissCount++;if(machine->tlb == NULL){//頁表失效,因為默認不會出現所以直接用ASSERT(FALSE);ASSERT(FALSE);}else{//快表失效,處理流程首先調用machine的ReadRegister函數,從BadVAddrReg寄存器中取出發生異常的虛擬地址,并算出vpn//DEBUG('m',"=> TLB miss (no TLB entry)\n");int BadVAddr = machine->ReadRegister(BadVAddrReg);TLBMissHandler(BadVAddr);//TLBAlgoFIFO(BadVAddr); //FIFO算法測試//TLBAlgoClock(BadVAddr); //CLOCK時鐘算法測試}} int position = 0; void TLBMissHandler(int virtAddr) //頁表失效處理函數 {unsigned int vpn;vpn = (unsigned) virtAddr / PageSize;TranslationEntry page = machine->pageTable[vpn];if(!page.valid){DEBUG('m',"\t=> Page miss\n");page = PageFaultHandler(vpn);}TLBAlgoClock(virtAddr); //處理快表失效 }

5、測試結果


Exercise 3 置換算法

為TLB機制實現至少兩種置換算法,通過比較不同算法的置換次數可比較算法的優劣。

1、FIFO算法

算法的思想是每次淘汰最先進入TLB的頁面。具體實現方式則是每次移除塊表數組的第一項,然后一次將后面的往前移,新的表項放在快表數組的尾項。
userprog/exception.cc

void TLBAlgoFIFO(int virtAddr) {int position1 = -1;unsigned int vpn;vpn = (unsigned)virtAddr / PageSize;//尋找空的TLB數組for(int i=0; i<TLBSize;i++){if(machine->tlb[i].valid == FALSE){position1 = i;break;}}//如果滿了,移除首頁,然后把每一項往前移,然后放在最后一項if(position1 == -1){position1 = TLBSize - 1;for(int i=0;i<TLBSize - 1;i++){machine->tlb[i] = machine->tlb[i+1];}}machine->tlb[position1] = machine->pageTable[vpn]; }

2、CLOCK時鐘置換算法

Nachos系統已經定義了TLB的use和valid,所以我們可以很方便的實現時鐘算法。具體實現是首先判斷valid的值,看該位置是否被訪問過,如果為false則直接進行替換;如果為true,則進一步判斷use的值,來看是否被修改過,如果修改過則將其值置為false,然后判斷下一位。如果為use為false則直接進行替換。

void TLBAlgoClock(int virtAddr) {unsigned int vpn;vpn = (unsigned) virtAddr / PageSize;while(1){position3 %= TLBSize;if(machine->tlb[position3].valid == FALSE){break;}else{if(machine->tlb[position3].use){//更新use的值machine->tlb[position3].use = FALSE;position3++;}else{break;}}}machine->tlb[position3] = machine->pageTable[vpn];machine->tlb[position3].use = TRUE; }

3、測試兩個算法,并打印出TLB相關信息

首先在translate.cc中設置兩個全局變量, TLBMissCount = 0;(記錄TLB MISS);TranslateCount = 0(記錄進程頁面訪問次數)。并在machine.h中進行擴展聲明。然后在每次發生PageFaultException讓TLBMissCount+1;在每次執行TranslateCount函數時,讓TranslateCount+1。分別調用兩個算法最終在程序執行結束退出后調用debug函數打印出TLB缺頁次數,缺頁率等信息。

4、測試結果

測試說明:我試用了系統提供的sort排序進行測試,在最開始的時候報錯Assertion failed: line 81, file "…/userprog/addrspace.cc,仔細閱讀代碼發現是因為系統給的sort排序超出了內存限制,同時原來sort在最后接觸進行的系統調用EXIT 尚未在本系統中實現,所以我在原來的基礎上進行了修改,并重新make。

#include "syscall.h"int A[20]; /* size of physical memory; with code, we'll run out of space!*/int main() {int i, j, tmp;/* first initialize the array, in reverse sorted order */for (i = 0; i < 20; i++) A[i] = 20 - i;/* then sort! */for (i = 0; i < 19; i++)for (j = i; j < (19 - i); j++)if (A[j] > A[j + 1]) { /* out of order -> need to swap ! */tmp = A[j];A[j] = A[j + 1];A[j + 1] = tmp;}//Exit(A[0]); /* and then we're done -- should be 0! */Halt(); }

我將原來的數組縮小為20,同時結束之后進行halt系統調用.

FIFO算法測試結果:

CLOCK 時鐘算法測試結果:


對比之后發現,時鐘算法的效率明顯優于FIFO算法。

分頁式內存管理

目前Nachos系統中,類Class Thread的成員變量AddrSpace* space中使用TranslationEntry* pageTable來管理內存。應用程序的啟動過程中,對其進行初始化;而在線程的切換過程中,亦會對該變量進行保存和恢復的操作(使得類Class Machine中定義的Class Machine::TranslationEntry* pageTable始終指向當前正在運行的線程的頁表)。

Exercise 4 內存全局管理數據結構

設計并實現一個全局性的數據結構(如空閑鏈表、位圖等)來進行內存的分配和回收,并記錄當前內存的使用狀態。

1、基本思路

這里我選擇使用位圖(bitMap)來管理空閑的內存。在machine類中增加成員變量bitmap,類型為數組。因為Nachos系統擁有32位的物理頁面,所以設置了一個大小為32的數組,初始值都為0,分配之后設置為1。每次申請物理內存的時候調用allocateMemory函數來尋找一塊空閑的頁面 ,如果沒有空閑的頁面則返回-1。freeMemory函數則是負責回收內存的。具體就是將當前頁表對應的所有位圖位置設為0。

2、machine/machine.h

unsigned int bitmap[32];int allocateMemory(void);void freeMemory(void);

3、machine/machine.cc

實現上述函數

int Machine::allocateMemory() {for(int i=0;i<32;i++){if(bitmap[i]==0){bitmap[i]=1;printf("allocate memory %d\n",i);return i;}}return -1; }void Machine::freeMemory(void) {for(int i=0;i<NumPhysPages;i++){//int current=pageTable[i].physicalPage;if(pageTable[i].threadId == currentThread->getTid()){if(bitmap[i]==1){printf("free Memory %d\n",i);bitmap[i]=0;}}} }

4、添加內存分配回收機制

分配內存的allocateMemory函數主要是在內存初始化的時候調用的,主要通過修改userprog/addrspace.cc文件。而內存的回收則是在程序結束之后通過Exit進行調用,而系統還未實現Exit系統調用,所以在這個部分我們還需要實現Exit,具體實現是修改userprog/exception.cc文件。
addrspace.cc

//addrspace.cc中構造函數做的修改pageTable = new TranslationEntry[numPages];for (i = 0; i < numPages; i++) {pageTable[i].virtualPage = i; // for now, virtual page # = phys page #//pageTable[i].physicalPage = i;pageTable[i].physicalPage = machine->allocateMemory(); //exception.cc中的ExceptionHandler(ExceptionType which)函數中做的修改if ((which == SyscallException)) {if((type == SC_Halt)){DEBUG('T', "TLB Miss: %d, TLB Hit: %d, Total Translate: %d, TLB Miss Rate: %.2lf%%\n",TLBMissCount,TranslateCount-TLBMissCount,TranslateCount,(double)(TLBMissCount*100)/(TranslateCount));interrupt->Halt();}else if(type == SC_Exit){printf("program exit\n");if(currentThread->space != NULL){machine->freeMemory();delete currentThread->space;currentThread->space = NULL;currentThread->Finish();int nextPc=machine->ReadRegister(NextPCReg);machine->WriteRegister(PCReg,nextPc);}}}

5、測試結果

為了方便截圖,我們直接運行一個空的程序,將原有的halt.c進行修改,注釋掉Halt()(后面的測試基本上都使用修改后的halt.c文件進行測試)。

Exercise 5 多線程支持

1、基本思想

目前因為系統的內存中同時只能存在一個線程,所以規定系統將程序的內容調入內存時是根據虛擬地址來確定的,并且規定了這個虛擬地址和物理地址相同。基于上一個exercise修改之后,我們將實現掉入內存的位置根據物理地址來確定。同時之前在程序退出之后因為默認系統同時只存在一個線程,所以系統就運行結束了,現在我們因為有多個線程,所以在程序結束之后我們需要切換到下一個程序。

2、實現程序運行結束之后切換

//exception.cc中的ExceptionHandler(ExceptionType which)函數中做的修改 else if(which == PageFaultException){//發生缺頁中斷則讓TLBMissCount++TLBMissCount++;if(machine->tlb == NULL){//頁表失效,因為默認不會出現所以直接用ASSERT(FALSE);ASSERT(FALSE);}else{//快表失效,處理流程首先調用machine的ReadRegister函數,從BadVAddrReg寄存器中取出發生異常的虛擬地址,并算出vpn//DEBUG('m',"=> TLB miss (no TLB entry)\n");int BadVAddr = machine->ReadRegister(BadVAddrReg);TLBMissHandler(BadVAddr);//TLBAlgoFIFO(BadVAddr); //FIFO算法測試//TLBAlgoClock(BadVAddr); //CLOCK時鐘算法測試}}

3、修改地址空間的上下文交換

在進上下文交換的時候因為切換了程序,所以TLB原有的內容則失效了,所以我們應該清楚TLB的內容,否則會頻繁出現頁面替換,降低效率。

void AddrSpace::SaveState() {for(int i=0;i<TLBSize;i++){machine->tlb[i].valid = FALSE;} }

4、測試函數

Nachos執行用戶程序的函數入口是通過StartProcess函數,但是這個函數只能執行一個用戶程序。因此我們仿照StartProcess的思想,重新構造了一個新的函數入口StartTwoThread用于執行兩個程序。同時為了方便,我們將兩個線程載入同一個程序(就是之前的halt.c)。

Thread* CreateSingleThread(OpenFile *executable,int number) {printf("Creating user program thread %d\n",number);char ThreadName[20];sprintf(ThreadName,"User program %d",number);Thread *thread = new Thread(strdup(ThreadName),0);//注意這里設置的新線程的優先級必須高于main的優先級,否則線程不能主動放棄處理機需要手動實現AddrSpace *space;space = new AddrSpace(executable);thread->space = space;return thread; } void UserProgThread(int number) {printf("Running user program thread %d\n",number);currentThread->space->InitRegisters();currentThread->space->RestoreState();currentThread->space->PrintState();machine->Run();ASSERT(FALSE); } void StartTwoThread(char *filename) {OpenFile *executable = fileSystem->Open(filename);if(executable == NULL){printf("Unable to open file %s\n",filename);return ;}//CreateSingleThread函數主要實現了原來StartProcess函數的//space = new AddrSpace(executable,5);和//currentThread->space = space;部分Thread *thread1 = CreateSingleThread(executable,1);Thread *thread2 = CreateSingleThread(executable,2);delete executable;//UserProgThread函數的目的是進行相關寄存器的初始化以及加載頁表thread1->Fork(UserProgThread,1);thread2->Fork(UserProgThread,2); }

實現一個在類AddrSpace中實現一個PrintState函數,打印出Address Space的相關信息。

void AddrSpace::PrintState() {printf("=== %s ===\n","Address Space Information");printf("numPages = %d\n",numPages);printf("VPN\tPPN\tvalid\tR0\tuse\tdirty\n");for(int i=0;i<numPages;i++){printf("%d\t",pageTable[i].virtualPage);printf("%d\t",pageTable[i].physicalPage);printf("%d\t",pageTable[i].valid);printf("%d\t",pageTable[i].use);printf("%d\t",pageTable[i].dirty);printf("%d\t",pageTable[i].readOnly);printf("\n");}printf("========================================\n"); }

5、修改main函數

原來的程序執行函數入口通過-x調用StartProcess,但是現在我們修改了程序入口,所以我們應該新增參數-X調用StartTwoThread

#ifdef USER_PROGRAMif (!strcmp(*argv, "-x")) { // run a user programASSERT(argc > 1);StartTwoThread(*(argv + 1));argCount = 2;} else if (!strcmp(*argv, "-c")) { // test the consoleif (argc == 1)ConsoleTest(NULL, NULL);else {ASSERT(argc > 2);ConsoleTest(*(argv + 1), *(argv + 2));argCount = 3;}interrupt->Halt(); // once we start the console, then // Nachos will loop forever waiting // for console input} #endif // USER_PROGRAM

6、測試結果






由于Exercise6和Exercise7是密切關聯的,所以我把兩個實驗放在一起寫。

Exercise 6 缺頁中斷處理

基于TLB機制的異常處理和頁面替換算法的實踐,實現缺頁中斷處理(注意!TLB機制的異常處理是將內存中已有的頁面調入TLB,而此處的缺頁中斷處理則是從磁盤中調入新的頁面到內存)、頁面替換算法等。

Exercise 7 lazy-loading

我們已經知道,Nachos系統為用戶程序分配內存必須在用戶程序載入內存時一次性完成,故此,系統能夠運行的用戶程序的大小被嚴格限制在4KB以下。請實現Lazy-loading的內存分配算法,使得當且僅當程序運行過程中缺頁中斷發生時,才會將所需的頁面從磁盤調入內存。

1、基本思想

Exercise 6缺頁中斷處理的思想是將發生缺頁中斷的虛擬頁面從磁盤調入物理頁面,也就是虛擬內存的概念,在這里的虛擬內存通過filesystem創建了一個virtual_memory模擬。當發生PageFaultException時(分為兩種情況,頁表失效和快表失效)通過ExceptionHandler函數處理,前面實現了快表失效,在這里需要實現頁表失效處理。而之前Nachos系統本身是不會發生缺頁中斷的,因為系統直接將程序一次性裝載進入內存 ,所以不存在頁表失效,這就需要結合Exercise 7 的內存分配機制Lazy-loading才可能發生頁表失效。
對于Lazy-loading即按需請求調頁而不是一次性全部裝載,這就需要修改Addspace的構造函數,將用戶程序的內容先裝載到虛擬內存,等需要的時候再從virtual_memory中調入。

2、創建虛擬內存

在基本思想中已經描述過,通過fileSystem創建一個virtual_memory文件來模擬虛擬內存,同時將數據裝載到virtual_memory中。為了盡可能的使每個實驗代碼能夠運行,我這里重構了addspace的構造函數,首先在addspace.h中聲明新的構造函數。

AddrSpace(OpenFile *executable); // Create an address space,// initializing it with the program// stored in the file "executable"AddrSpace(OpenFile *executable,int lab); //虛擬內存實驗所重構的構造函數,lab參數沒有意義~AddrSpace(); // De-allocate an address space AddrSpace::AddrSpace(OpenFile *executable,int lab) {NoffHeader noffH;unsigned int i, size;executable->ReadAt((char *)&noffH, sizeof(noffH), 0);if ((noffH.noffMagic != NOFFMAGIC) && (WordToHost(noffH.noffMagic) == NOFFMAGIC))SwapHeader(&noffH);ASSERT(noffH.noffMagic == NOFFMAGIC);// how big is address space?size = noffH.code.size + noffH.initData.size + noffH.uninitData.size + UserStackSize; // we need to increase the size// to leave room for the stacknumPages = divRoundUp(size, PageSize);size = numPages * PageSize;//上面的內容與原來的一樣//用filesystem創建VirtualMemory文件,運行nachos之后,會在userprog目錄下面生成該文件bool success_create_vm = fileSystem->Create("VirtualMemory",size);ASSERT(numPages <= NumPhysPages);//pageTable = new TranslationEntry[numPages];for(i=0;i<numPages;i++){machine->pageTable[i].virtualPage = i;machine->pageTable[i].physicalPage = machine->allocateMemory(); //因為我們沒有將用戶程序內容裝載進內存,所以physicalPage的值可以為0machine->pageTable[i].valid = TRUE; //表示沒有從磁盤裝載任何頁面進內存machine->pageTable[i].use = FALSE;machine->pageTable[i].dirty = FALSE;machine->pageTable[i].readOnly = FALSE;machine->pageTable[i].threadId = currentThread->getTid();}//初始化整個物理內存bzero(machine->mainMemory,MemorySize);OpenFile *vm = fileSystem->Open("VirtualMemory");char *virtualMemory_temp;virtualMemory_temp = new char[size]; //該數組主要是用于將用戶程序的內容寫入磁盤的中間過度for(i=0;i<size;i++)virtualMemory_temp[i] = 0;if(noffH.code.size>0){DEBUG('a',"\tCopying code segment, at 0x%x, size %d\n",noffH.code.virtualAddr,noffH.code.size);executable->ReadAt(&(virtualMemory_temp[noffH.code.virtualAddr]),noffH.code.size,noffH.code.inFileAddr);vm->WriteAt(&(virtualMemory_temp[noffH.code.virtualAddr]),noffH.code.size,noffH.code.virtualAddr*PageSize);}if(noffH.initData.size >0){DEBUG('a',"\tCopying data segment, at 0x%x, size %d\n",noffH.initData.virtualAddr,noffH.initData.size);executable->ReadAt(&(virtualMemory_temp[noffH.initData.virtualAddr]),noffH.initData.size,noffH.initData.inFileAddr);vm->WriteAt(&(virtualMemory_temp[noffH.initData.virtualAddr]),noffH.initData.size,noffH.initData.virtualAddr*PageSize);}//上面的內容仿照原始的addspace構造函數編寫delete vm; }

3、缺頁處理

當發生缺頁異常時,通過ExceptionHandler函數調用TLBMissHandler函數,TLBMissHandler將將缺頁異常的地址裝換成虛擬地址,然后調用PageFaultHandler函數,該函數首先通過machine->allocateMemory()尋找一個空閑頁,如果返回-1則調用NaivePageReplacement函數,該函數的作用是進行頁面替換。首先尋找一個未被修改過的頁面進行替換,如果找到則結束;否則將第一個(1,1)的頁面進行替換,并將頁表內容寫會磁盤。

int NaivePageReplacement(int vpn) {int pageFrame = -1;for(int temp_vpn = 0;temp_vpn < machine->pageTableSize,temp_vpn != vpn;temp_vpn++){if(machine->pageTable[temp_vpn].valid){if(!machine->pageTable[temp_vpn].dirty){pageFrame = machine->pageTable[temp_vpn].physicalPage;break;}}}if(pageFrame == -1){for(int replaced_vpn = 0; replaced_vpn < machine->pageTableSize, replaced_vpn != vpn;replaced_vpn++){if(machine->pageTable[replaced_vpn].valid){machine->pageTable[replaced_vpn].valid = FALSE;pageFrame = machine->pageTable[replaced_vpn].physicalPage;//將頁表寫回磁盤OpenFile *vm = fileSystem->Open("VirtualMemory");vm->WriteAt(&(machine->mainMemory[pageFrame*PageSize]),PageSize,replaced_vpn*PageSize);delete vm;break;}}}return pageFrame; } TranslationEntry PageFaultHandler(int vpn) {int pageFrame = machine->allocateMemory();if(pageFrame == -1){pageFrame == NaivePageReplacement(vpn);}machine->pageTable[vpn].physicalPage = pageFrame;OpenFile *vm = fileSystem->Open("VirtualMemory");vm->ReadAt(&(machine->mainMemory[pageFrame*PageSize]),PageSize,vpn*PageSize);delete vm;machine->pageTable[vpn].valid = TRUE;machine->pageTable[vpn].use = FALSE;machine->pageTable[vpn].dirty = FALSE;machine->pageTable[vpn].readOnly = FALSE;currentThread->space->PrintState(); //打印地址空間信息 } int position = 0; void TLBMissHandler(int virtAddr) //頁表失效處理函數 {unsigned int vpn;vpn = (unsigned) virtAddr / PageSize;TranslationEntry page = machine->pageTable[vpn];if(!page.valid){DEBUG('m',"\t=> Page miss\n");page = PageFaultHandler(vpn);}TLBAlgoClock(virtAddr); //處理快表失效 } void ExceptionHandler(ExceptionType which) {int type = machine->ReadRegister(2);if ((which == SyscallException)) {if((type == SC_Halt)){DEBUG('T', "TLB Miss: %d, TLB Hit: %d, Total Translate: %d, TLB Miss Rate: %.2lf%%\n",TLBMissCount,TranslateCount-TLBMissCount,TranslateCount,(double)(TLBMissCount*100)/(TranslateCount));interrupt->Halt();}else if(type == SC_Exit){printf("program exit\n");if(currentThread->space != NULL){machine->freeMemory();delete currentThread->space;currentThread->space = NULL;currentThread->Finish();int nextPc=machine->ReadRegister(NextPCReg);machine->WriteRegister(PCReg,nextPc);}}}else if(which == PageFaultException){//發生缺頁中斷則讓TLBMissCount++TLBMissCount++;if(machine->tlb == NULL){//頁表失效,因為默認不會出現所以直接用ASSERT(FALSE);ASSERT(FALSE);}else{//快表失效,處理流程首先調用machine的ReadRegister函數,從BadVAddrReg寄存器中取出發生異常的虛擬地址,并算出vpn//DEBUG('m',"=> TLB miss (no TLB entry)\n");int BadVAddr = machine->ReadRegister(BadVAddrReg);TLBMissHandler(BadVAddr);//TLBAlgoFIFO(BadVAddr); //FIFO算法測試//TLBAlgoClock(BadVAddr); //CLOCK時鐘算法測試}} else {printf("Unexpected user mode exception %d %d\n", which, type);ASSERT(FALSE);} }

4、測試結果




Challenge2 多線程實現基本思路:

前面實現的倒排頁表并不是嚴格意思的倒排頁表,實際上,倒排頁表與進程/線程數量無關,所以,我們需要在 machine 類維護倒排頁表,而不是在 addrspace類維護倒排頁表。
考慮到多線程共用倒排頁表的實際情況,我們需要在頁表項記錄線程 ID

class TranslationEntry {...int threadID; };

在mahine/machine.cc 的machine 類的構造函數完成倒排頁表的初始化

#ifdef USE_TLBpageTable = new TranslationEntry[NumPhysPages];//初始化倒排頁表for (i = 0; i < NumPhysPages; i++)pageTable[i].physicalPage = i;pageTable[i].virtualPage = i;pageTable[i].valid = FALSE;pageTable[i].use= FALSE;pageTable[i].dirty = FALSE;pageTable[i].readOnly = FALSE;pageTable[i].threadId = -1; #else // use linear page tabletlb = NULL;pageTable = NULL; #endif

考慮到所有線程共用相同倒排頁表,不需要從線程內存空間載入頁表,這樣的修改同時意味著我們在addrspace 定義的頁表失去了作用

void AddrSpace::RestoreState() {// machine->pageTable = pageTable;//machine->pageTableSize = numPages; } //由于引入了線程ID,在表項判斷時增加判斷內容 pageTable[i].threadID == currentThread->getThreadID() //在表項修改時增加修改內容 machine->pageTable[pos].threadID = currentThread->getThreadID();

同時改寫釋放空間函數,根據線程ID 釋放相關空間

void Machine::freeMemory(void) {for(int i=0;i<NumPhysPages;i++){//int current=pageTable[i].physicalPage;if(pageTable[i].threadId == currentThread->getTid()){if(bitmap[i]==1){printf("free Memory %d\n",i);bitmap[i]=0;}}} }

測試結果:


內容三:遇到的困難及解決方法

困難 1:理解#ifdef

根據nachos 的默認設置,TLB 沒有開啟,查看相關代碼發現#ifdef 相關命令,查詢相關資料得知,#ifdef 是條件編譯的重要命令,所謂條件編譯,就是對程序中的部分內容只在滿足特定條件的情況下進行編譯,條件編譯包括許多指令,其中#ifdef 的常見形式為:
#ifdef 標識符
//程序段 1
#else
//程序段 2
#endif
這段語句的作用是當標識符已經被定義過(一般是用#define 命令定義),則對程序段1 進行編譯,否則編譯程序段2。進一步查詢相關資料,得知我們需要修改userprog/Makefile,開啟 USE_TLB
DEFINES = … -DUSE_TLB

困難2:理解nachos文件系統

如果希望利用文件而不是內存的額外空間實現 Exercise6和 Exercise7,那么需要涉及 nahcos 文件系統。主要涉及的部分包括文件系統數據結構FileSystem和打開文件數據結構Openfile。
文件系統數據結構FileSystem 的重要函數包括
Create函數:基本功能是文件系統中創建固定大小的文件,如果創建成功,那么返回TRUE,否則返回 FALSE
Open函數:基本功能是打開已經存在的文件,返回的是打開文件數據結構
Remove函數:基本功能是刪除已經存在的文件,如果刪除成功,那么返回TRUE,否則返回FALSE
需要說明的是,如果我們希望關閉已經打開的文件,那么需要調用相應打開文件數據結構的析構函數
打開文件數據結構Openfile 的重要函數包括
Length函數:基本功能是返回文件長度
Seek函數:基本功能是移動當前文件位置指針
ReadAt函數:基本功能是從文件特定位置讀取特定長度的數據到特定位置,返回值是實際讀出的字節數
WriteAt函數:基本功能是從特定位置向文件特定位置寫入特定長度的數據,返回值是實際寫入的字節數
Read函數:基本功能是從文件讀取特定長度的數據到特定位置,返回值是實際讀出的字節數,基于ReadAt 函數實現
Write函數:基本功能是從特定位置向文件寫入特定長度的數據,返回值是實際寫入的字節數,基于WriteAt 函數實現

困難3 理解DEBUG

對DEBUG函數不熟悉,剛開始在對程序進行調試的時候總是使用printf函數,然而nachos系統定義的DEBUG函數功能更加強大。

內容四:收獲及感想

實習課程和理論課程相得益彰。通過本次實習,我強化了對存儲模型相關知識的理解,鍛煉了編程能力。經過一段時間的接觸,感覺對 nachos 系統有了一定的了解,對課程有了一定的興趣,期待在以后的實習中能夠了解nachos 更多的功能并且在此基礎上進行更多的修改。

內容五:對課程的意見和建議

我覺得課程方式很好,老師講課非常認真,對同學們也很寬容,布置給我們的實驗雖然讓我們在做的過程中一直懷疑人生,但是在實驗完成之后回想整個過程,我們獲得的提高非常巨大!由于實驗逐漸變難,所以在實驗過程中大家出現了很多分歧,也無法確定誰的想法是正確的,希望老師能在課上對實驗進行一定的梳理。

總結

以上是生活随笔為你收集整理的nachos-虚拟内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

亚洲91网站 | 亚洲区另类春色综合小说校园片 | 免费高清在线一区 | 色丁香婷婷 | 久久久福利 | 色综合天天综合在线视频 | 日韩69视频 | 国产视频精品免费播放 | 国内精品中文字幕 | 日本精品午夜 | 国产不卡一二三区 | 久久亚洲成人网 | 久久国产剧场电影 | 久久成人午夜视频 | 中文字幕乱码在线播放 | 国产综合在线观看视频 | 精品国产一区二区三区久久久蜜月 | 国产欧美精品一区二区三区四区 | 中文字幕123区 | www.久久色 | 日批视频在线播放 | 国产91丝袜在线播放动漫 | 国产真实精品久久二三区 | 亚洲久草网 | 久久99爱视频 | 亚洲日本一区二区在线 | 免费看十八岁美女 | 亚洲免费av在线播放 | 久久综合久久综合久久 | 天天综合天天做 | 欧美一区,二区 | 干干操操| 超碰精品在线观看 | 日韩免费观看一区二区三区 | 久亚洲精品 | 五月天国产精品 | 97国产在线播放 | 最近更新好看的中文字幕 | 亚洲午夜久久久综合37日本 | 亚洲精品日韩在线观看 | 韩国av永久免费 | 中文字幕亚洲国产 | 五月婷婷丁香 | 久久精品一区二区 | 福利电影久久 | 久久国产精品99久久久久久老狼 | 在线成人免费电影 | 久久精品久久久精品美女 | 免费日韩一区二区三区 | 日韩免费在线观看视频 | 999久久久久久 | 伊人天天狠天天添日日拍 | 天天干天天操天天拍 | 欧美日韩国产精品一区二区亚洲 | 欧美精品v国产精品v日韩精品 | 日韩一级精品 | 少妇性aaaaaaaaa视频 | 国产一级免费在线 | 在线观看日韩免费视频 | 国产乱码精品一区二区三区介绍 | a黄色大片 | 日韩v在线| 精品久久久久久久久亚洲 | 91大神精品视频在线观看 | av免费网站在线观看 | 欧美射射射 | 日韩在线高清 | 日韩在线观看一区 | 久久综合影音 | 黄色软件视频网站 | 免费av大片| 成人久久18免费网站图片 | 日韩xxxbbb| 五月天最新网址 | 在线之家免费在线观看电影 | 99久久久久久国产精品 | 天天干天天干天天操 | 婷婷色综| 国产一级一片免费播放放a 一区二区三区国产欧美 | 成人国产网站 | 国产高清在线精品 | 91精品国产91久久久久久三级 | 国产精品视频app | 日韩在线观看小视频 | 中文字幕制服丝袜av久久 | 中文字幕国内精品 | 狠狠狠狠狠狠狠狠干 | 久久精国产 | 9999精品视频 | 日韩欧美视频一区二区三区 | 久久精品4| 免费看黄色大全 | 在线观看免费中文字幕 | 亚洲永久精品在线观看 | 色诱亚洲精品久久久久久 | 国产在线欧美日韩 | 最新国产中文字幕 | 免费在线观看亚洲视频 | 天天色天天操综合网 | 黄色官网在线观看 | 在线观看aaa| www.五月激情.com | 极品国产91在线网站 | 成人免费视频观看 | 亚洲资源网 | 国产成人福利片 | 伊人开心激情 | 91视频国产免费 | 成人免费在线电影 | 国产精品激情在线观看 | 亚洲女同videos | 在线观看免费中文字幕 | 韩国av在线 | 国产精品麻豆99久久久久久 | 国产成人精品午夜在线播放 | 五月婷婷色综合 | 国产日产精品久久久久快鸭 | 99免费在线视频观看 | 婷久久 | 手机av电影在线 | 在线观看视频91 | 免费日韩 精品中文字幕视频在线 | 日韩经典一区二区三区 | 亚洲午夜精品久久久久久久久久久久 | 日本中文字幕在线免费观看 | 亚洲狠狠操 | 欧美日韩高清在线一区 | 少妇性bbb搡bbb爽爽爽欧美 | 最新国产视频 | www.成人sex | 蜜桃传媒一区二区 | 91污污| 久久黄色免费视频 | 成年人黄色免费视频 | 婷婷新五月 | 天天干天天草天天爽 | 国产成在线观看免费视频 | 又湿又紧又大又爽a视频国产 | 亚洲国产精品久久久 | 亚洲免费av电影 | 久久久www成人免费精品张筱雨 | 日韩在线视频国产 | 国产精品美女免费 | 欧美激情综合五月色丁香 | 日本三级在线观看中文字 | 久久久91精品国产一区二区三区 | 丰满少妇在线观看网站 | 精品福利在线 | 国产精品久久久久影院日本 | 久久欧美综合 | 久久综合九色99 | 夜夜操网站 | 国产成人av网站 | 久久国产精品二国产精品中国洋人 | 久久全国免费视频 | 亚洲黄色三级 | 中文字幕 成人 | 成人黄色在线视频 | 国产剧情一区二区在线观看 | 久久久久久高潮国产精品视 | 三级av网 | 亚洲情婷婷 | 亚洲精品在| 91精品爽啪蜜夜国产在线播放 | 久久国产精品免费观看 | 黄免费在线观看 | 欧美另类美少妇69xxxx | 国产亚洲精品久久久久秋 | 国产精品久久久久久久久软件 | 96久久精品 | 中文字幕三区 | 久久国产精品免费观看 | 久久久久久久久久福利 | 日韩一区二区三区高清在线观看 | 亚洲一区日韩 | 综合网天天射 | 久久久久国产a免费观看rela | 18av在线视频 | 久久成人精品视频 | 久久资源总站 | 天天摸天天干天天操天天射 | 日韩特黄一级欧美毛片特黄 | 婷婷午夜| 久久久国产一区 | 91正在播放 | 日韩精品在线视频 | 97精品超碰一区二区三区 | 亚洲电影第一页av | 69久久久久久久 | av在线成人| 国产 字幕 制服 中文 在线 | 91亚洲激情 | 久久精品在线 | 91丨九色丨蝌蚪丨对白 | 99热999| 久久婷婷一区二区三区 | 国产成人av电影在线观看 | 四虎在线观看 | 波多野结衣视频一区二区 | 国产精品原创av片国产免费 | 久久天堂亚洲 | 国产精品美女久久久久久免费 | 香蕉视频国产在线观看 | 久久久久一区二区三区 | 四川bbb搡bbb爽爽视频 | 成人三级av| 射久久 | 欧美贵妇性狂欢 | www欧美日韩| 日韩在线激情 | 国产美女免费视频 | 日韩综合视频在线观看 | 免费看的黄网站 | 9797在线看片亚洲精品 | 亚洲精品456在线播放第一页 | 视频在线播放国产 | 在线播放日韩 | 久久免费精品一区二区三区 | 国产精品区免费视频 | 91大神在线观看视频 | av在线免费播放网站 | 国产精品久久电影网 | 悠悠av资源片 | 97av免费视频 | 久久免费国产电影 | 瑞典xxxx性hd极品 | 成人久久久久久久久 | 欧美日韩另类视频 | 色香com. | 久久一区二区三区日韩 | 久草在线在线精品观看 | 四虎影视精品成人 | 亚洲永久免费av | 粉嫩av一区二区三区免费 | www.亚洲精品 | 欧美精品久久久久久久久久白贞 | av高清网站在线观看 | 久久伊人八月婷婷综合激情 | 五月天婷亚洲天综合网鲁鲁鲁 | 中文字幕在线观看网址 | 在线中文字幕一区二区 | 欧美91成人网 | 日本视频网 | 久久公开视频 | 色婷婷视频网 | 日韩三级视频在线观看 | 婷婷av色综合 | 在线国产中文字幕 | 国产九色视频在线观看 | 青青草久草在线 | 91精品办公室少妇高潮对白 | 国产999免费视频 | 欧美日韩免费一区二区三区 | 天堂麻豆| 成人免费在线观看入口 | 日韩资源在线观看 | 日本资源中文字幕在线 | 久久国产亚洲 | 久久精品免费观看 | 亚洲情感电影大片 | 亚洲精品男女 | 精品字幕在线 | 就要干b | 99九九99九九九视频精品 | 91精品办公室少妇高潮对白 | 在线观看免费日韩 | 五月婷婷六月丁香 | 亚洲一区精品二人人爽久久 | 久久成人黄色 | 91亚洲精品久久久蜜桃借种 | 久久久一本精品99久久精品66 | 国产视频一区二区三区在线 | 999久久 | av在线永久免费观看 | 久久香蕉一区 | 国产色在线,com | 在线观看视频你懂得 | 午夜体验区 | 樱空桃av| 97人人模人人爽人人喊网 | 不卡的av在线 | 国产成人精品一区二 | 久草电影网 | 天堂视频一区 | 婷婷色九月 | 天天干夜夜 | 亚洲精品乱码久久久久久高潮 | 成人性生交视频 | 免费精品视频在线 | 97国产精品亚洲精品 | 天天干天天干天天色 | 国产精品婷婷 | 91久久久国产精品 | 国产精品久久久影视 | 亚洲五月六月 | 最新99热 | 国产精品免费看 | 天堂av网址 | 天天操比 | 国产精品久久久久久久久久 | 91精品视频免费看 | 亚洲综合在线五月天 | 九九免费观看视频 | 夜夜躁日日躁狠狠久久av | 91香蕉国产 | 精品国产乱码久久久久久1区2匹 | 婷婷爱五月天 | 在线看国产视频 | 91av综合| 亚洲更新最快 | 中文字幕av免费在线观看 | 一区二区三区四区在线免费观看 | 天天操天天射天天插 | 亚洲精品资源 | 久久久久久久免费观看 | 五月婷婷中文字幕 | 日韩专区中文字幕 | 国产一级在线观看视频 | 91av社区| 亚洲三级在线免费观看 | 国产大陆亚洲精品国产 | 欧美久草视频 | 97电影手机| 久久久福利 | 久久综合给合久久狠狠色 | 亚洲资源一区 | 久久综合九色九九 | 99麻豆久久久国产精品免费 | 在线看毛片网站 | 99热99re6国产在线播放 | 成人丁香花 | 国产黄在线| 国产特黄色片 | 美女黄频| 国产乱对白刺激视频在线观看女王 | 亚洲欧美乱综合图片区小说区 | 黄色三级网站在线观看 | 天天射天天舔天天干 | 精品一区二区三区四区在线 | 精品久久久国产 | 97在线视频免费看 | 亚洲精品美女久久久 | 国产精品久久久久四虎 | 国产精品久久久久久超碰 | 国产精品ⅴa有声小说 | 精品国产成人av在线免 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 在线电影 一区 | 欧美日韩中文字幕视频 | 国产精品入口66mio女同 | 日日干网址 | 婷久久 | 欧美综合在线视频 | 91亚洲综合| 久久国产高清 | 国产精品 日韩 | 高清色免费 | 亚洲精品视频在线观看免费 | 亚洲精品免费播放 | 91高清免费 | 在线中文字幕网站 | 国产精品a级 | 手机在线观看国产精品 | 天天操天天干天天爱 | 黄色在线观看免费网站 | 亚洲国产精品成人精品 | 人人看97| 国产麻豆精品一区二区 | 日韩在线观看视频免费 | 少妇高潮流白浆在线观看 | 亚洲精品国产日韩 | 国产精品成人一区二区 | 天天干天天做天天操 | 中文成人字幕 | 一区二区视频免费在线观看 | 中文在线亚洲 | 日本三级香港三级人妇99 | 国产精品成人在线观看 | 91大神精品视频在线观看 | 91女人18片女毛片60分钟 | 91在线免费看片 | 五月婷在线 | 国产黄色精品在线观看 | 国产精品人人做人人爽人人添 | 久久久久久免费视频 | 丁香九月婷婷 | 久久免费精品 | 亚洲在线成人精品 | 亚洲精品中文字幕在线观看 | 亚洲国产97在线精品一区 | 九九视频免费在线观看 | 99久久久国产免费 | 国产精品高清免费在线观看 | 亚洲伊人网在线观看 | 久久草| 69视频在线 | av免费电影在线观看 | 欧美性色网站 | 一级做a爱片性色毛片www | 色噜噜在线观看 | 欧美日韩电影在线播放 | 国产精久久 | 精品久久久久久国产偷窥 | 91网在线 | 欧美日韩视频免费看 | 亚洲aⅴ在线观看 | 久久精品五月 | 国产精品96久久久久久吹潮 | 欧美另类高清 videos | 一区二区三区 亚洲 | 91大神在线观看视频 | 91热视频| 婷婷久久精品 | 成人在线观看网址 | 亚洲永久精品在线 | 黄av资源 | 日韩精品91偷拍在线观看 | 婷婷六月天在线 | 成人精品电影 | 日韩av成人在线观看 | 国产一区二区三区免费在线观看 | 国产中文字幕第一页 | 亚洲 欧美 成人 | 久久久久久电影 | 亚洲尺码电影av久久 | 国产精品毛片一区二区在线 | av资源免费看 | 91视频在线自拍 | 天天曰天天射 | 9999国产| 成人黄色小视频 | 天天天天色射综合 | 欧美激情第八页 | 最近中文字幕大全中文字幕免费 | 欧美另类美少妇69xxxx | 亚洲国产av精品毛片鲁大师 | 久久久午夜精品福利内容 | 日本中文乱码卡一卡二新区 | 成人在线中文字幕 | 亚洲欧美日韩中文在线 | 高清国产午夜精品久久久久久 | 国产精品久久9 | 97电影院网| 国产美女无遮挡永久免费 | 91精品久久久久久久99蜜桃 | 2019中文在线观看 | 亚洲午夜精品久久久久久久久 | 999国内精品永久免费视频 | 97在线观看免费观看高清 | 最近中文字幕免费观看 | 国产精品三级视频 | 久久激情精品 | 欧美黑人性爽 | 国产欧美精品一区二区三区四区 | 91精品国产麻豆国产自产影视 | 亚洲精品欧美视频 | 国产精品资源在线 | 超碰在线网 | 久久香蕉电影网 | 欧美精品久久久久 | 四虎在线免费观看 | 国产高清久久 | 国产不卡精品 | 日本精品二区 | av一级免费 | 激情五月婷婷激情 | 久久婷婷精品视频 | 婷婷资源站 | 免费av一级电影 | 日日干美女 | 国产日韩欧美在线播放 | 日韩视频一区二区三区 | 亚洲在线日韩 | 97av在线视频免费播放 | 成人av一区二区三区 | 久久久久国产精品免费 | a在线观看免费视频 | 国产在线观 | 草久视频在线观看 | 黄色av一区 | 亚洲国产69 | 亚洲精品人人 | 九九久久久久久久久激情 | 超碰在线99| 久久久亚洲麻豆日韩精品一区三区 | 色鬼综合网| 免费观看十分钟 | av中文资源在线 | 99在线免费视频 | 热久久99这里有精品 | 伊人久久电影网 | 精品亚洲网 | 国产99免费视频 | 亚洲乱码精品久久久 | 日韩videos | a v在线观看 | 人人插人人艹 | 国内揄拍国产精品 | 午夜精品一区二区三区可下载 | 亚洲天堂网站视频 | 国产精品女同一区二区三区久久夜 | 国产精品亚洲片在线播放 | 蜜桃av久久久亚洲精品 | 中文字幕中文字幕中文字幕 | 国产精品久久久久久久久费观看 | 国产原厂视频在线观看 | av中文在线影视 | 国产不卡在线观看 | 久久激情视频 久久 | 天天操网址 | 97看片网 | 中文字幕资源网 | 国产99久久久久久免费看 | 亚洲视屏在线播放 | 亚洲视频免费在线观看 | 久久在线视频精品 | 欧美另类高清 videos | 亚洲另类视频 | 国产一区二区综合 | 一区二区三区四区五区六区 | 69精品在线 | www.国产毛片 | 久久综合九色九九 | 天天综合网久久综合网 | 免费黄a | 91九色性视频| 五月婷婷爱 | 九九日九九操 | 亚洲视频中文 | 人人澡超碰碰97碰碰碰软件 | 97在线看片| 免费麻豆 | 99热都是精品 | 天天摸天天操天天舔 | 亚洲精品字幕 | 99精品久久久久久久久久综合 | 欧美激情奇米色 | 91亚洲在线观看 | 91自拍视频在线观看 | 日韩影视精品 | 天天干人人| 天天鲁一鲁摸一摸爽一爽 | 久章草在线观看 | 国产18精品乱码免费看 | 69精品久久 | 久久久免费毛片 | 国产手机在线观看 | 999久久久久久久久 69av视频在线观看 | 亚洲综合激情小说 | 五月婷婷一区二区三区 | 国产日韩中文字幕 | 天天干天天在线 | 中文字幕丝袜美腿 | 久久tv| 四虎小视频 | 91精品爽啪蜜夜国产在线播放 | 国产91九色蝌蚪 | 国产福利91精品一区二区三区 | 成人在线视频在线观看 | h视频日本 | 亚洲欧洲国产精品 | 349k.cc看片app| 精品国产亚洲一区二区麻豆 | 精品国产午夜 | 欧美激情精品久久 | 天天操天天射天天插 | 黄色影院在线观看 | 久久男人免费视频 | 人人爱人人做人人爽 | 美女久久一区 | 成人网中文字幕 | 人人爱天天操 | 999久久国产精品免费观看网站 | 亚洲黄色成人网 | 久久久五月天 | 国产一区二区三区免费视频 | 黄色免费视频在线观看 | 6080yy精品一区二区三区 | 亚洲精品乱码久久久久久蜜桃动漫 | 午夜精品av| 日本精品视频一区 | 国产99一区视频免费 | 久久高清毛片 | 极品国产91在线网站 | 97超碰人人在线 | 国产精品99精品久久免费 | 亚洲欧洲av | 久av在线 | 日本久久久精品视频 | 亚洲成a人片77777kkkk1在线观看 | 超级av在线 | 色婷婷欧美 | 久久久久久久免费观看 | 亚洲高清免费在线 | 天天性天天草 | 在线a视频免费观看 | 久久精品欧美日韩精品 | 日韩午夜视频在线观看 | 深爱激情久久 | 免费在线成人av电影 | 在线观看视频在线 | 国产一区二区网址 | 热re99久久精品国产99热 | 伊人日日干 | 最近中文字幕免费 | 91精品在线视频观看 | 精品婷婷| 奇米网777 | www久久99| 九九热中文字幕 | 日韩在线观看视频在线 | 亚洲我射av| 久久久影院一区二区三区 | 香蕉网站在线观看 | 国产人成在线视频 | 顶级bbw搡bbbb搡bbbb | 国内精品久久久久久久97牛牛 | 成年在线观看 | 最近2019好看的中文字幕免费 | 久久99精品久久久久久久久久久久 | 麻豆av电影| 99一级片 | 日韩免费电影一区二区三区 | 成人免费看片98欧美 | 亚洲动漫在线观看 | 91av视频在线免费观看 | 久久只精品99品免费久23小说 | 波多野结衣在线播放一区 | 96久久精品 | 亚洲电影久久久 | 99激情网| 97超视频免费观看 | 国产精品av电影 | 欧美性猛片,| 国产精品久久久久一区二区三区共 | 国产拍在线 | 亚洲欧美日本一区二区三区 | 中文字幕一区二区三区在线视频 | 成人91视频| 国产99在线 | 国产精品久久久亚洲 | www.日日操.com | a√资源在线 | 国内精品久久久久 | 九七视频在线 | 国产一级视频在线观看 | 亚洲成av人片在线观看香蕉 | 四虎在线观看 | 99精品久久久久久久久久综合 | 国产一区网| 99久久精品无免国产免费 | 天天爽夜夜爽人人爽曰av | 91pony九色丨交换 | 色偷偷88888欧美精品久久久 | 国产字幕在线看 | 国产精品av一区二区 | 999视频精品 | 成人av影视观看 | 国产精品免费久久久 | 亚洲高清国产视频 | 国产黄色精品视频 | 91精品久久久久久久久久入口 | 亚洲综合成人av | 亚洲精品国产日韩 | 97自拍超碰| 在线观看911视频 | 国产一级一片免费播放放 | 欧美 国产 视频 | 精品视频免费播放 | 久久久午夜电影 | 在线观看精品视频 | 日韩av午夜在线观看 | av电影免费看 | 91精品毛片| 蜜桃视频日本 | 一级成人网 | 操天天操 | 国内精品久久天天躁人人爽 | 国产精品久久久久久久久费观看 | 久久精品123 | 99日精品 | 久久爽久久爽久久av东京爽 | 久久男人中文字幕资源站 | 黄色亚洲精品 | 日韩国产精品一区 | 亚洲精品国产精品国自产观看浪潮 | 亚洲一区久久久 | 玖玖在线视频观看 | 在线视频国产区 | 在线国产91 | 色偷偷中文字幕 | 九色在线 | 欧美日韩免费观看一区二区三区 | 蜜臀av性久久久久av蜜臀妖精 | 精品久久久久久久久久久久久久久久 | 久久综合久久综合这里只有精品 | 黄色毛片视频 | 午夜av片 | 日韩精品1区2区 | 天天爱天天射天天干天天 | www.狠狠操.com| 午夜的福利 | 亚洲精品美女在线观看 | 欧美激情视频一区二区三区 | 国产亚洲va综合人人澡精品 | av综合网址 | av激情五月 | 在线日韩一区 | 色综合天天综合 | 97色视频在线 | 99草在线视频 | 亚洲va欧美va人人爽春色影视 | 亚洲va韩国va欧美va精四季 | 天天草天天干天天 | 久久爽久久爽久久av东京爽 | 亚洲人在线7777777精品 | 国产精品99久久久久 | 午夜色婷婷 | 国产福利91精品张津瑜 | 在线视频精品播放 | 国产日韩在线看 | 国产手机在线观看 | 99久久久国产精品免费99 | 国产高清久久 | 99热这里是精品 | 国产伦精品一区二区三区免费 | 欧美最新大片在线看 | 久久综合色综合88 | 亚洲闷骚少妇在线观看网站 | 国产精品99久久免费黑人 | 一区二区三区三区在线 | 欧美日韩69 | 欧美伊人网 | 欧美一级片在线免费观看 | 日本中文字幕电影在线免费观看 | 色中文字幕在线观看 | 日韩电影在线一区二区 | 插久久 | 91精品啪在线观看国产 | 国产 精品 资源 | 狠狠天天 | 久久天天操| 日韩av伦理片 | 中文日韩在线 | 在线播放 一区 | 中文在线8资源库 | 久久久久久久久久久免费av | 天天操月月操 | 中文字幕乱视频 | av网址在线播放 | 久草视频在线资源 | 日本午夜在线亚洲.国产 | 操久| 国内外成人在线 | 亚洲第一区精品 | 日韩精品视频在线观看网址 | 久久精彩免费视频 | 国产精品免费久久久久久 | 伊人永久 | 成人午夜免费福利 | 日韩电影在线观看一区二区 | 国产伦精品一区二区三区无广告 | 久久综合国产伦精品免费 | 成人午夜免费剧场 | 亚洲黄色片在线 | 一区二区在线不卡 | 欧美亚洲免费在线一区 | 久久久久免费精品视频 | 国产手机精品视频 | 成人在线观看免费视频 | 国产福利91精品一区 | 国产一区二区三区免费视频 | 狠狠躁夜夜a产精品视频 | 777久久久 | 精品视频在线免费观看 | 国产一区二区精品 | 国产精品一码二码三码在线 | 欧美成人基地 | 免费在线91 | 在线99热| 国产手机在线精品 | 欧美肥妇free | av资源免费观看 | 日韩成人免费在线电影 | 亚洲精品国产精品乱码不99热 | 久草免费在线观看 | 日日碰狠狠躁久久躁综合网 | 91一区啪爱嗯打偷拍欧美 | 狠狠干夜夜操 | 97在线观看视频 | 精品久久久久久国产 | 国产精品久久久久三级 | 日日干干 | 久久亚洲婷婷 | 日韩欧美一级二级 | 国产成人精品亚洲精品 | 久久久一本精品99久久精品66 | 黄色软件在线看 | 激情欧美一区二区三区 | 色a综合 | 国产1区2 | 色久天 | 超碰在线最新网址 | 777久久久| 四虎国产 | 免费久草视频 | 在线欧美国产 | 911香蕉 | av黄色影院| 欧美福利片在线观看 | 日韩电影中文,亚洲精品乱码 | 日本电影久久 | 久久精品超碰 | 国产91综合一区在线观看 | 亚洲另类交 | 欧美精品免费一区二区 | 国产精品一区二区免费看 | 在线 高清 中文字幕 | 国产精品av电影 | 天天色官网 | 一区二区精品在线 | 亚洲天堂视频在线 | 久99久视频 | 四虎影视成人精品 | 成人a视频| 国产青草视频在线观看 | 中国一级特黄毛片大片久久 | 天天av天天 | 国产精品免费视频一区二区 | 精品在线播放 | 免费观看国产视频 | 久草视频在线免费看 | 成人小视频在线 | wwxxx日本| 中文字幕国产精品一区二区 | 国产美女被啪进深处喷白浆视频 | 色综合久久久久综合体桃花网 | 在线成人免费av | 精品在线视频播放 | 国产资源在线视频 | 精品 激情| 精品96久久久久久中文字幕无 | 热久久免费国产视频 | 日韩中文在线字幕 | 91超级碰碰 | 国产午夜在线观看视频 | 亚洲天堂网站 | 日韩高清成人 | 国产视频久久 | 国产在线日本 | 亚洲视频综合在线 | 狠狠狠色丁香婷婷综合久久88 | 中文字幕文字幕一区二区 | 夜夜操狠狠操 | 精品黄色片 | 国产精品久久麻豆 | 免费国产在线视频 | 丁香激情婷婷 | 亚洲国产午夜视频 | 三级免费黄 | 免费午夜在线视频 | 99人成在线观看视频 | 超碰97在线人人 | 亚州精品一二三区 | 九九爱免费视频在线观看 | 日韩欧美在线视频一区二区三区 | 久久99免费观看 | 性色av一区二区三区在线观看 | 男女靠逼app | 国产精品99久久久久久人免费 | 少妇av网| 久久久久久久久精 | 国产亚洲一区 | 探花视频免费在线观看 | 国产成人一区二区三区 | 国产精品久久久久久超碰 | 青草视频在线免费 | 人人干在线 | 美女久久久 | 国产精品久久久久久久久费观看 | 久久影视一区 | 日韩精品观看 | 国产精品一区二区你懂的 | 久久人人爽人人片av | 久久精品爱爱视频 | 丁香九月婷婷综合 | 欧美午夜一区二区福利视频 | 久久久国产影院 | 中文字幕欧美日韩va免费视频 | 黄色大片入口 | 天天干,天天干 | 伊人电影在线观看 | 久久免费视频观看 | 久久综合久久久 | 国产在线999| 日韩影视精品 | 国产精品视频99 | 97av影院 | 久久在线电影 | 久久99精品国产一区二区三区 | 狠狠色丁香婷婷综合久小说久 | 人人网av| 亚州精品天堂中文字幕 | 天天色天天爱天天射综合 | 在线观看中文字幕dvd播放 | 少妇搡bbbb搡bbb搡aa | 免费福利片2019潦草影视午夜 | 午夜一级免费电影 | 国产视频二 | 韩国一区在线 | av片一区 | 国产精品理论在线观看 | 99超碰在线观看 | 免费在线观看成人av | 91精品影视 | 在线黄频 | 黄色在线免费观看网址 | 国产精品福利在线播放 | 99r在线视频| 深爱激情五月婷婷 | 中文字幕国产在线 | 日韩在线一二三区 | 亚洲国产午夜视频 | 久久久久网站 | 色香蕉在线 | 日韩精品 在线视频 | 中文字幕电影高清在线观看 | 亚洲精品日韩一区二区电影 | 欧美一级裸体视频 | 99一区二区三区 | 久久精品视频中文字幕 | 欧美二区三区91 | 99视频在线精品国自产拍免费观看 | 91大神精品视频在线观看 | 99精品视频精品精品视频 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 亚洲精区二区三区四区麻豆 | 精品一区二区三区在线播放 | 一区二区三区免费在线 | 久久久久久久久久国产精品 | 91最新在线观看 | 一二三区视频在线 | 久久欧洲视频 | 2019精品手机国产品在线 | 久久人人精 | 国产理论片在线观看 | 久久视频| 国产视频在线观看一区 | 成人一级片在线观看 | 欧美 亚洲 另类 激情 另类 | 500部大龄熟乱视频使用方法 | 国产综合婷婷 | 开心激情综合网 | 日韩精品一区二区在线观看 | 午夜精品一区二区国产 | 欧美性生活大片 | 成人午夜免费剧场 | 日韩在线电影观看 | 亚洲午夜久久久综合37日本 | 国产婷婷一区二区 | 成人国产精品久久久 | 中文字幕成人一区 | 久草网站在线观看 | 丁香5月婷婷久久 | 日韩黄色在线观看 | 一区二区三区免费在线观看视频 | 97超碰人人爱 | 在线一区观看 | wwwwwww色| 欧美一区在线看 | 亚洲成人资源在线观看 | 免费看的av片 | 天天干天天操 | 日本性xxxxx 亚洲精品午夜久久久 | 91探花在线 | www.xxxx变态.com | 亚洲国产精品久久 | 成人av电影在线观看 | 日本黄色大片儿 | 国精产品一二三线999 | 国产精品白浆 | 久久久久国产精品免费网站 | 日韩高清不卡一区二区三区 | 国产在线国偷精品产拍免费yy | 亚洲电影免费 | 九色91福利| 黄色aaa级片 | 国产麻豆视频网站 | 99免费视频| 亚洲精品99久久久久中文字幕 | 亚洲精选视频免费看 | 欧美日韩视频网站 | 91av原创 | 91视频免费观看 | 91九色在线观看视频 | 国产精品美女视频网站 | 亚洲在线免费视频 | 婷婷婷国产在线视频 |