CSC3150Unix的教學作業系統

j22h7x發表於2024-04-04

CSC3150-說明書-A3介紹這項任務使用xv6,一個簡單的、類似Unix的教學作業系統,作為平臺指導您實現mmap和munmp系統呼叫。

這兩個用來共享程序之間的記憶體,並將檔案對映到程序地址空間。一般來說,這項任務的重點是記憶體對映檔案。支援記憶體對映的機制檔案可以處理檔案,就好像它們是程式記憶體的一部分一樣。這是透過以下方式實現的將檔案對映到虛擬記憶體空間的一段(提醒:每個程序都有自己的程序虛擬地址空間)。檔案和記憶體空間之間的這種對映是使用“mmap()”系統呼叫,並且使用“munmap()”的系統呼叫刪除對映。我們提供一個虛擬機器映像,在該映像中配置和設定了所有內容。影像可用在黑板上。屈服截止日期:2024年4月9日23:59嚴禁抄襲。請注意,TA可能會要求您解釋您的程式,以確保程式碼確實是由您自己編寫的。

還請注意我們會檢查你的程式是否與同學的程式碼過於相似網際網路上可用的使用剽竊檢測器的解決方案。逾期提交:在15分鐘內逾期提交不會對您的分數。在那之後,你每多提交一天,你的分數就會減少10%. (例如,肖宇在2024年4月11日提交了課業3的完美嘗試。她會得到100*(1-0.2)=課業3得80分。您應該向黑板提交一個zip檔案。zip檔案結構如下。格式化指南專案結構如下圖所示。您也可以使用ls命令檢查您的結構良好。結構不匹配會導致扣分。

對於這項任務,您不需要為額外的學分部分指定特定的資料夾。原始檔夾應包含四個檔案:proc.c、proc.h、sysfile.c和trap.cmain@ubuntu:~/桌面/工作分配_3_120010001$lsReport.pdf來源/1.2.(一個目錄和一個pdf。)3.4.main@ubuntu:~/桌面/Assignment_3_120010001/source$lsproc.c proc.h系統檔案.c陷阱.c(三個.c檔案和一個.h檔案)1.2.3.4.請將檔案結構根資料夾中的所有檔案壓縮為一個zip檔案,並使用命名例如,您的學生ID為下面和上面顯示的程式碼,工作分配_3_120010001.zip。報告應以pdf格式一起提交使用原始碼。格式不匹配會導致扣分。以下是示例步驟用於壓縮程式碼。main@ubuntu桌面zip-q-r分配_3_120010001.zip分配_3_12001/0001main@ubuntu:~/桌面$ls工作分配_3_120010001工作分配_3_
1 20010001.zip1.2.3.4.5.主機和虛擬機器之間的互動提示以下是一些在主機和虛擬機器之間進行互動的有用提示。如果你熟悉它和“格式指南”,你可以忽略這一部分。在終端中,不應包含“<”和“>”。

在這裡,它們只是為了呈現一個自定義字串變數1.將分配資料夾複製到您的虛擬機器。您可以在中複製資料夾VSCode或使用下面的scp命令。在主機中:cd<your_host_path_to_project_zip>scp-P 2200/csc3150-project3.zipcsc3150@127.0.0.1:~1.2.如果路徑中有空格,請使用雙引號包括您的路徑,例如cd“your主機路徑”。2.解壓縮虛擬機器中的分配資料夾。在虛擬機器中:解壓縮~/cs3150-project3.zip~/chmod-R+x~/cs3150專案31.2.然後,您可以瀏覽課業資料夾。完成專案後,應按照格式說明包裝檔案。我們為您準備一個指令碼來生成提交zip。此可選指令碼僅適用於方便包裝檔案。您可以用自己的方式包裝檔案,只需確保遵循格式。3.假設您已經將Report.pdf複製到虛擬機器(如將分配zip從主機複製到虛擬機器的方式)。在虛擬機器中:cd~/cs3150專案3bash gen_submission.sh1.2.gen_submission.sh指令碼將詢問您的學生id和Report.pdf的路徑。然後你可以在~/cs3150下找到你的提交資料夾專案3/提交/分配_3_<your_student_id>.zip4.您可以使用以下命令將提交zip複製到您的主機上。

在主機中:scp-P 2200csc3150@127.0.0.1:~/cs3150-專案3/提交/分配_3_<your_student_id>.zip<your_host_machine_folder_path>1.然後,您將在_host_machine_folder_path中獲得提交zip。別忘了將您的zip檔案提交到BlackBoard。說明書指南我們將您的實現限制在proc.c、proc.h、sysfile.c、trap.c四個檔案中,其中有缺少一些以“TODO”註釋開頭的程式碼部分。入口代 寫CSC3150Unix的教學作業系統(您可以從那裡開始學習)是csc3150下mmaptest.c的主要功能-project3/使用者目錄。帶(*)的部分為引言部分。這些部分介紹了將幫助您瞭解這個系統是關於什麼的,以及該系統如何與這些元件。在實現TODO部分時,您可能需要使用某些函式。您只能修改這四個檔案中的TODO部分!我們會給你打分專案僅基於TODO部分的實現。任何其他修改都將被視為無效。1.對於介紹部分,請弄清楚功能是如何工作的以及如何使用它們。2.在開始你的課業之前,確保你對內容有一個基本的想法。我們相信這些就足夠應付這項任務了。

3.(可選)對於對xv6系統感興趣並想了解更多資訊的學生,歡迎您閱讀“xv6書籍”以獲取更多詳細資訊。一https://pdos.csail.mit.edu/6.828/2022/xv6/book-riscv-rev3.pdf沒有(*)的節是TODO節。在這些部分中,該元件的邏輯/詳細列出了應該工作的功能。您應該在給定的位置實現功能。1.但是,此處不會顯示示例程式碼。你需要弄清楚實現基於介紹部分中提供的邏輯和API。引數獲取*<xv6 book>第4.3章孔隙泥(int,int*);int argstr(int,char*,int);void argaddr(int,uint64*);int argfd(int n,int*pfd,結構檔案**pf);1.2.3.4.核心函式argint、argaddr和argfd檢索第n個系統呼叫引數作為整數、指標或檔案描述符。他們都呼叫argraw來檢索適當儲存的使用者暫存器(kernel/syscall.c:34)。Proc*//在proc.h中定義結構程序{結構自旋鎖;1.2.3.//使用這些時必須保持p->鎖:列舉程序狀態;//程序狀態void*chan;//如果非零,則在chan上睡覺int已終止;//如果非零,則已被殺死int xstate;//要返回到家長等待的退出狀態int pid;//程序ID//使用此選項時必須保持wait_lock:struct proc*parent;//父程序//這些對程序是私有的,因此不需要持有p->鎖。uint64 kstack;//核心堆疊的虛擬地址uint64 sz;//程序記憶體大小(位元組)pagetable_t pagetable;//使用者頁面表struct trapframe*trapframe;//蹦床資料頁。S結構上下文;//swtch()在此處執行程序結構檔案*ofile[NOFILE];//開啟檔案結構索引節點*cwd;//當前目錄字元名稱[16];//程序名稱(除錯)struct VMA VMA[VMASIZE];//虛擬mem區域};//在proc.c中定義//返回當前結構體proc*,如果沒有則返回零。struct-proc*myproc(void)#定義PTE_W(1L<<2)#定義PTE_X(1L<<3)#定義PTE_U(1L<<4)

//使用者可以訪問//一個超出可能的最高虛擬地址。

//MAXVA實際上比允許的最大值小一位//Sv39,以避免必須對擴充套件虛擬地址進行簽名//具有高位集的。

#定義MAXVA(1L<<(9+9+12-1))保護和標誌*//在fcntl.h中定義#定義PROT_NONE 0x0#定義PROT_READ 0x1#定義PROT_WRITE 0x2#定義PROT_EXEC 0x4#定義MAP_SHARED 0x01#定義MAP_PRIVATE 0x02(TODO)陷阱//trap.cvoid usertrap(void){...///TODO:管理頁面錯誤否則,如果(r_scause()==1
3 ||r_scause)==15){...}...}//主管陷阱原因靜態內聯uint64r_scause()

{1.2.3.4.5.6.7.8.9101112131415uint6
4 x;asm-volatile(“csrr%0,scause”:“=r”(x));返回x;}//主管陷阱值靜態內聯uint64r_stval(){uint6
4 x;asm-volatile(“csrr%0,stval”:“=r”(x));返回x;}16171819202122232425262728Usertrap處理來自使用者空間的中斷、異常或系統呼叫。它呼叫r_scause()以獲取異常程式碼。在本課業中,您將被要求處理PageFault異常。暗示r_stval()提供陷阱值。(即引起異常的地址)xv6系統不支援交換機制。如果物理儲存器被填充,你應該終止這個過程。(您將學習使用kalloc()和setkilled()函式)如果實體記憶體中有空閒空間,請將檔案的一頁對映到相應的vma。(mapfile()和mappages())//檔案.c//讀取一頁檔案以定址mem//地圖檔案和readi中的off參數列示偏移//從應該開始讀取操作的檔案開始。無效對映檔案(結構檔案*f,字元*mem,int偏移量){//printf(“關閉%d\n”,偏移量);ilock(f->ip);readi(f->ip,0,(uint64)mem,offset,PGSIZE);iunlock(f->ip);}//vm.c//為從va開始的虛擬地址建立PTE,這些地址引用//以pa.va和size開頭的實體地址可能不會//頁面對齊。成功時返回0,如果walk()不能,則返回-1//分配所需的頁面表頁面。int對映頁(pagetable_t pagetable,uint64-va,uint64 size,uint64-pa,int燙髮){uint64 a,最後一個;pte_t*pte;如果(大小==0)panic(“mappages:size”);a=PGROUNDDOWN(va);last=PGROUNDDOWN(va+size-1);對於if((pte=walk(分頁表,a,1))==0)return-1;如果(*pte和pte_V)panic(“mappages:remap”);*pte=PA2PTE(pa)|perm|pte_V;if(a==last)打破a+=PGSIZE;pa+=PGSIZE;}返回0;}結構“檔案”“索引節點”將提供給您以供參考。當記憶體對映結束時,將呼叫filewrite()進行寫回。即呼叫munmap或呼叫程序出口。類似於fileclose()。當訪問檔案的次數增加時,將呼叫filedup()。(mmap(),fork())//在fs.c中定義//從索引節點讀取資料。//呼叫者必須持有ip->lock。//如果user_dst==1,則dst是使用者虛擬地址;//否則,dst是核心地址。int readi(結構體inode*ip,int user_dst,uint6
4 dst,uint off,uint n);//將資料寫入inode。//呼叫者必須持有ip->lock。//如果user_src==1,則src是使用者虛擬地址;//否則,src是一個核心地址。//返回成功寫入的位元組數。//如果返回值小於所請求的n,//出現了某種錯誤。int writei(結構inode*ip,int user_src,uint6
4 src,uint off,uint n);//鎖定給定的索引節點。//如有必要,從磁碟中讀取索引節點。void ilock(結構索引節點*ip);//解鎖給定的索引節點。void iunlock(結構inode*ip);處理頁面錯誤時需要使用的函式,請注意readi()的工作方式並計算出應該傳送給readi()的引數。如果您不知道readi()在做什麼,請考慮read()或memcpy(),它們處理指標和地址。與writei()類似ilock()和iunlock()是inode的鎖,用於確保記憶體的一致性。暗示您可以檢視sys_open()來了解inode、檔案和鎖是如何工作的。(

TODO)VMA結構1//我們已經為您定義了VMA陣列的大小#定義VMASIZE 16//TODO:完成VMA的結構結構VMA{};2.3.4.5.6.解釋VMA(虛擬記憶體區域)結構用於管理和跟蹤以下記憶體區域對映到程序的地址空間。每個VMA代表一個連續的虛擬區域具有相同許可權並由相同型別的物件支援的記憶體。這個作業系統需要跟蹤這些對映,包括它們的起始位置、大小它們是,它們具有什麼許可權,以及它們與什麼檔案或裝置相關聯。這是vma結構的用途。實施跟蹤mmap為每個流程對映的內容。定義與VMA(虛擬記憶體區域)相對應的結構,記錄地址,mmap建立的虛擬記憶體範圍的長度、許可權、檔案等。由於xv6核心中沒有記憶體分配器,因此可以宣告一個固定大小的VMA陣列,並根據需要從該陣列中進行分配。尺寸為16就足夠了。我已經為您定義了VMASIZE)暗示看看什麼引數將被髮送到mmap()中。VMA應包含指向要對映的檔案的結構檔案的指標;如果您想在VMA中使用更多的變數來進一步實現,請隨意使用它們。正確答案不止一個。(TODO)mmap()//在user.h中定義void*mmap(void*addr,size_t length,int prot,int flags,int fd,off_t抵消//TODO:在sysfile.c中執行的核心mmapuint64sys_mmap(無效){1.2.3.4.5.6.7.8.引數解釋:在mmaptest.c中,我們呼叫'char*p=mmap(0,PGSIZE*2,PROT_READ,MAP_PRIVATE,fd,0);'。此呼叫要求核心對映檔案“fd”的內容進入地址空間。第一個“0”引數指示核心應該選擇虛擬地址(在本課業中,您可以假設“addr”將始終為零)。這個第二個引數“length”指示要對映的位元組數。第三個論點“PROT_READ”表示對映的記憶體應為只讀,即修改為不允許。第四個引數“MAP_PRIVATE”表示,如果程序修改對映記憶體,修改不應寫回檔案,也不應與共享對映同一檔案的其他程序(當然,由於PROT_READ,更新是在這種情況下禁止)。第五個引數是要對映的檔案的檔案描述。最後一個引數“offset”是檔案中的起始偏移量。返回值表示是否mmap成功與否。sys_xxx()函式是xxx()系統呼叫的核心實現。在xv6操作中在系統中,系統呼叫以sys_為字首,以將其與其他函式區分開來,並用於指示它們是系統呼叫。核心函式argint、argaddr和argfd從陷阱幀中以整數、指標或檔案的形式檢索第n個系統呼叫引數描述符。請參閱引數獲取部分。mmap的實現:在程序的地址空間中找到一個未使用的區域,以便對映檔案,並將VMA新增到程序的對映區域表中。VMA應包含指向要對映的檔案的結構檔案的指標;mmap應該增加檔案的引用計數,以便在關閉檔案時結構不會消失(提示:請參閱filedup)。在mmap()實現後執行mmaptest:第一個mmap應該成功,但第一個對mmap-ed記憶體的訪問將導致頁面錯誤並終止mmaptest。 在mmap()實現之前 mmap()實現後出現頁面錯誤(工作正常)頁面錯誤示例進度圖(TODO)PageFault控制代碼<xv6 book>第4.5、4.6章新增導致mmap ed區域出現頁面故障的程式碼,以分配實體記憶體頁面。透過故障地址查詢相應的有效vma。在該頁面上讀取相關檔案的4096位元組,並將其對映到使用者地址空間。使用readi讀取檔案,它採用一個偏移量引數來讀取檔案(但您將必須鎖定/解鎖傳遞給readi的inode)。在頁面上正確設定許可權。執行mmaptest;它應該到達第一個munmap。參見章節陷阱(TODO)munmap()實施munmap: 找到地址範圍的VMA並取消對映指定的頁面(提示:使用uvmunmap)。 如果munmap刪除了前一個mmap的所有頁面,它應該會減少引用計數對應結構檔案的。 如果未對映的頁面已被修改,並且檔案已對映為MAP_SHARED,請寫入頁面返回到檔案。從filewrite中尋找靈感。 理想情況下,您的實現只會寫回程式實際上已修改。RISC-V PTE中的髒位元(D)指示頁面是否已經被書面的但是,mmaptest不會檢查是否未回寫非髒頁;因此,您可以在不看D位的情況下寫回頁面。//TODO:完成munmap()uint64sys_munmap(無效){}//在vm.c中定義void uvmunmap(pagetable_t pagetable,uint64-va,uint64-npages,int do_free);1.2.3.4.5.6.7.8.(TODO)頁面對齊方式這是一個提醒,提醒您注意核心中的所有虛擬地址實現應該與頁面對齊!保持這條規則的真實性非常重要實施也就是說,用PGROUNDUP或PGROUNDOWN將地址包裝在不同的情況。你必須弄清楚該用哪一個。(額外優惠)叉柄在您的Assignment 1中,您應該已經知道fork()建立了一個子流程相同的資訊。因此,您應該處理呼叫fork()時mmap()的工作方式。

確保子物件與父物件具有相同的對映區域。別忘了增加VMA的結構檔案的引用計數。在子級的頁面錯誤處理程式中,可以分配一個新的物理頁面,而不是與父級共享頁面。後者將是更酷,但這將需要更多的實現工作。分級規則課程第90部分+額外學分您可以在'~/cs3150下使用以下命令來測試程式碼的正確性-project3'目錄。製作qemummaptest1.2.“make-qemu”開啟xv6系統,您將看到您的終端以“$”開頭。你可以執行“ls”命令以檢視包括“mmaptest”在內的檔案mmaptest命令執行可執行檔案mmaptest來測試您的程式。您應具有以下輸出$mmaptestmmap_test啟動測試mmap f測試mmap f:OK測試mmap私有測試mmap私有:好測試mmap只讀只讀測試mmap:確定測試mmap讀/寫測試mmap讀/寫:OK測試mmap髒測試mmap髒:好測試未對映取消對映1.2.3.4.5.6.7.8.910111213測試未對映取消對映:確定測試mmap兩個檔案測試mmap兩個檔案:好測試mmap偏移測試mmap偏移:正常測試mmap半頁測試mmap半頁:好mmap_test:全部正常fork_test啟動fork_test確定mmaptest:所有測試都成功1415161718192021222324mmap f 13pmmap私人5pmmap只讀5pmmap讀/寫5pmmap髒5pmmap兩個檔案5p未對映取消對映12pmmap偏移5pmmap半頁15p編譯成功20pfork_test(額外學分)報告第10部分您應嚴格遵循提供的報告乳膠模板,我們強調重要部件和各自的分級細節。基於其他模板的報告將不會分級。LaTex編輯器為了方便起見,您可以使用線上LaTex編輯器Overleaf。1.建立一個新的空白專案。2.點選下面的高亮底部,上傳我們提供的模板。3.單擊“重新編譯”,您將看到PDF格式的報告。

相關文章