(undone) MIT6.S081 2023 學習筆記 (Day11: LAB10 mmap)

url: https://pdos.csail.mit.edu/6.1810/2023/labs/mmap.html


mmap和munmap系統調用允許UNIX程序對其地址空間進行精細控制。它們可用于進程間共享內存、將文件映射到進程地址空間,并作為用戶級頁面錯誤處理方案的一部分,例如課程中討論的垃圾回收算法。在本實驗中,您將向xv6添加mmap和munmap功能,重點關注內存映射文件。

The manual page (run man 2 mmap) shows this declaration for mmap:

void *mmap(void *addr, size_t len, int prot, int flags,int fd, off_t offset);

mmap 可以通過多種方式調用,但本實驗僅需要實現與文件內存映射相關的部分功能。您可以假設 addr 始終為零,這意味著內核應自行決定文件的映射虛擬地址。mmap 會返回該地址,如果失敗則返回 0xffffffffffffffff。len 是要映射的字節數,它可能與文件長度不同。prot 表示內存是否應映射為可讀、可寫和/或可執行;您可以假設 prot 是 PROT_READ 或 PROT_WRITE 或兩者兼具。flags 可以是 MAP_SHARED(表示對映射內存的修改應寫回文件)或 MAP_PRIVATE(表示不應寫回文件),無需實現其他標志位。fd 是要映射的文件的打開文件描述符。您可以假設 offset 為零(即文件中的映射起始位置)。

即使映射相同 MAP_SHARED 文件的進程不共享物理頁,也是允許的。

munmap 的手冊頁(運行 man 2 munmap)顯示其聲明如下:

int munmap(void *addr, size_t len);

munmap 應移除指定地址范圍內的內存映射。如果進程修改了該內存區域且映射方式為 MAP_SHARED,則需先將修改內容寫回文件。munmap 可能僅解除部分 mmap 映射區域,但可以假設其操作范圍僅限于:從起始位置解除、從末尾解除,或解除整個區域(而不會在區域中間“打洞”解除部分映射)。

你需要實現足夠的 mmap 和 munmap 功能,以確保 mmaptest 測試程序能夠正常運行。如果 mmaptest 沒有用到某個 mmap 的特性,你就不需要實現該特性。

When you’re done, you should see this output:

$ mmaptest
mmap_test starting
test mmap f
test mmap f: OK
test mmap private
test mmap private: OK
test mmap read-only
test mmap read-only: OK
test mmap read/write
test mmap read/write: OK
test mmap dirty
test mmap dirty: OK
test not-mapped unmap
test not-mapped unmap: OK
test mmap two files
test mmap two files: OK
mmap_test: ALL OK
fork_test starting
fork_test OK
mmaptest: all tests succeeded
$ usertests -q
usertests starting
...
ALL TESTS PASSED
$ 

以下是一些提示:

  • 首先,將 _mmaptest 添加到 UPROGS 中,并添加 mmap 和 munmap 系統調用,以便編譯 user/mmaptest.c。目前,只需從 mmap 和 munmap 返回錯誤。我們在 kernel/fcntl.h 中為您定義了 PROT_READ 等。運行 mmaptest,它將在第一個 mmap 調用失敗。
  • 在頁面錯誤處理時懶加載頁表。也就是說,mmap 不應分配物理內存或讀取文件。相反,在 usertrap 中(或由 usertrap 調用的頁面錯誤處理代碼中)執行此操作,就像寫時復制實驗一樣。懶加載的原因是為了確保對大文件的 mmap 快速,并且對大于物理內存的文件的 mmap 成為可能。
  • 跟蹤每個進程 mmap 映射的內容。定義一個與“應用程序的虛擬內存”講座中描述的 VMA(虛擬內存區域)相對應的結構。這應該記錄由 mmap 創建的虛擬內存范圍的地址、長度、權限、文件等。由于 xv6 內核中沒有內核內存分配器,因此可以聲明一個固定大小的 VMA 數組,并根據需要從中分配。大小為 16 應該足夠。
  • 實現 mmap:在進程的地址空間中找到一個未使用的區域來映射文件,并將一個 VMA 添加到進程的映射區域表中。VMA 應該包含一個指向被映射文件的 struct file 的指針;mmap 應該增加文件的引用計數,以便在文件關閉時結構不會消失(提示:參見 filedup)。運行 mmaptest:第一個 mmap 應該成功,但是對 mmap-ed 內存的第一次訪問將導致頁面錯誤并殺死 mmaptest。
  • 添加代碼以使 mmap-ed 區域的頁面錯誤分配一個物理頁面的內存,將相關文件的 4096 字節讀取到該頁面,并將其映射到用戶地址空間。使用 readi 讀取文件,該文件需要一個偏移參數來讀取文件(但是您將不得不鎖定/解鎖傳遞給 readi 的 inode)。不要忘記正確設置頁面的權限。運行 mmaptest;它應該到達第一個 munmap。
  • 實現 munmap:找到地址范圍的 VMA 并取消映射指定的頁面(提示:使用 uvmunmap)。如果 munmap 刪除了之前 mmap 的所有頁面,則應該減少相應 struct file 的引用計數。如果取消映射的頁面已被修改并且文件被映射為 MAP_SHARED,則應將頁面寫回文件。查看 filewrite 以獲取靈感。
  • 理想情況下,您的實現只會寫回程序實際修改的 MAP_SHARED 頁面。RISC-V PTE 中的臟位(D)指示頁面是否已被寫入。但是,mmaptest 不會檢查未修改的頁面是否沒有被寫回;因此,您可以不查看 D 位就寫回頁面。
  • 修改 exit 以取消映射進程的映射區域,就像調用了 munmap 一樣。運行 mmaptest;mmap_test 應該通過,但可能不是 fork_test。
  • 修改 fork 以確保子進程具有與父進程相同的映射區域。不要忘記增加 VMA 的 struct file 的引用計數。在子進程的頁面錯誤處理程序中,分配一個新的物理頁面而不是與父進程共享頁面是可以的。后者會更酷,但需要更多的實現工作。運行 mmaptest;它應該通過 mmap_test 和 fork_test。

運行 usertests -q 以確保一切仍然正常工作。

TODO: here


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904213.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904213.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904213.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Q_OBJECT宏的作用

Qt 中,如果一個類中定義了信號(signals)或槽(slots),那么這個類必須包含 Q_OBJECT 宏。 Q_OBJECT宏是 Qt 元對象系統的核心部分,它使得信號和槽機制能夠正常工作。 Q_OBJECT宏是 Qt 的元對象系統…

信息安全基石:加解密技術的原理、應用與未來

信息加解密技術是信息安全領域的核心技術之一,以下為你詳細介紹: 一、加密技術 1.定義:加密是通過特定的算法和密鑰,將原始的明文信息轉化為看似無意義的密文信息的過程。這一過程使得信息在傳輸、存儲等過程中,即使…

LeetCode:返回倒數第k個結點

1、題目描述 實現一種算法,找出單向鏈表中倒數第 k 個節點。返回該節點的值。 注意:本題相對原題稍作改動 示例: 輸入: 1->2->3->4->5 和 k 2 輸出: 4 說明: 給定的 k 保證是有效的。 2、…

R004 -計算機硬件基礎

目錄 1.數據表示&計算機網絡組成 2.計算機網絡分類 3.馮諾依曼體系結構 4.指令系統基礎 5.指令系統類型 6.流水線技術 流水線周期 :各流水段中,執行時間最長的那一段。就是T 流水線時間:t 1t2t 3 (n-1) * T 7.流水線指標 8.存儲系…

Mybatis學習(下)

目錄 1. 動態sql的應用 1.2 1.2 1.3 、 、 標簽 1.4 1. 動態sql的應用 使用Mybatis框架時, 對于sql數據的操作量比較大的時候, 看著會覺得很亂, 可能寫著寫著就亂了, 或者說回過頭來發現sql語句寫錯了, 很麻煩, 所以動態sql就可以讓我們用Java代碼, 替換部分sql語句 1.2 &l…

iview 老版本合并單元格

新版的iview中已經支持了合并單元格了,我的版本比較老,為:"iview": "^3.5.2"。暫不支持。記錄一下別的大佬的方法。感覺思路比較活,正在這種思路需要在解決問題的過程中學習。 核心思路:通過rende…

FGMRES(Flexible Generalized Minimal Residual)方法

FGMRES(Flexible Generalized Minimal Residual)方法是GMRES的變種,主要用于處理變預處理子(即每次迭代的預處理子可能不同)的情況。與標準GMRES相比,FGMRES通過存儲預處理后的向量而非預處理子本身&#x…

自主采集高質量三維重建數據集指南:面向3DGS與NeRF的圖像與視頻拍攝技巧【2025最新版!!】

一、? 引言 隨著三維重建技術的飛速發展,NeRF(Neural Radiance Fields)與 3D Gaussian Splatting(3DGS)等方法成為重建真實場景和物體幾何細節的前沿方案。這些方法在大規模場景建模、機器人感知、文物數字化、工業檢…

HarmonyOS Next-DevEco Studio(5.0.2)無網絡環境配置(詳細教程)

開發者如果電腦處于完全無網環境,可以參考下面文檔進行相關配置 DevEco Studio(5.0.2)開發環境一覽: 工具版本DevEco Studio5.0.2openHarmonySDK14ohpm5.0.11node.js18.20.1hypium1.0.21 一、下載DevEco Studio(5.0.2 Release)…

MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - sleep 是怎樣練成的?

接上文MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - sleep 探究sleep.c是如何’煉成’的? 老實講,我不熟悉Makefile,最多寫過簡單的編譯和輔助腳本,拿到Xv6的Makefile是一臉懵的,至今還是一臉懵,那么我們上篇中新加的…

順序結構雙鏈表的實現

雙鏈表是用最快的時間實現鏈表的一種方式&#xff0c;具體的實現代碼如下&#xff1a; #pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h>typedef int LTDataType; typedef struct ListNode {LTDataType data;struct ListNode* next;/…

GoFrame 奉孝學習筆記

第一章節 GoFrame 是一款基礎設施建設比較完善的模塊化框架 GoFrame 是一款基礎設施建設比較完善的模塊化框架, Web Server 模塊是其中比較核心的模塊,我們這里將 Web 服務開發作為框架入門的選擇,便于大家更容易學習和理解。 用GOland編寫代碼 go.mod module goframePro…

pinia實現數據持久化插件pinia-plugin-persist-uni

在學習uniapp過程中&#xff0c;看到了pinia-plugin-persist-uni插件&#xff0c;以前面試過程中也有面試過說vuex數據刷新之前的數據就丟失了&#xff0c;之前回答的是把數據存儲到數據庫或者本地存儲。pinia-plugin-persist-uni本質上數據也是本地存儲。 1、安裝 npm instal…

Git 多賬號切換及全局用戶名設置不生效問,GIT進行上傳無權限問題

解決 Git 多賬號切換及全局用戶名設置不生效問題 在軟件開發過程中&#xff0c;我們經常會使用 Git 進行版本控制。有時&#xff0c;我們需要在同一臺機器上管理多個 Git 賬號&#xff0c;最近我在進行使用git的時候因為項目要進行上傳的不同的git賬號&#xff0c;但是通過本地…

基于STM32定時器中斷講解(HAL庫)

基于STM32定時器中斷講解&#xff08;HAL庫&#xff09; 1、定時器簡單介紹 以STM32F103C8T6中幾個定時器為例&#xff1a; TIM1&#xff1a;這是一個高級定時器&#xff0c;不僅具備基本的定時中斷功能&#xff0c;還擁有內外時鐘源選擇、輸入捕獲、輸出比較、編碼器接口以…

UE5 項目遷移 注意事項記錄

做項目的時候項目越做越大 132g的體量一旦移動復制就耗時間 這個時候遷移派上了用場 前置知識&#xff1a;會使用基本ue遷移流程 以下是遷移注意事項 遷移步驟 首先把項目插件plugins復制粘貼到新項目中其次把.project文本形式 全部復制粘貼新項目中開始遷移項目 選中要遷移的…

套接字+Socket連接

制作加載中動畫&#xff1a; 創建Panel&#xff0c;制作預制體&#xff0c;在Image游戲物體中添加DOTween插件&#xff0c;相關設置如下&#xff1a; (此為DOTween Pro,需付費&#xff0c;也可按下面的數值編寫代碼解決) Socket套接字 套接字就是將IP地址與主機端口號合并在一…

第 11 屆藍橋杯 C++ 青少組中 / 高級組省賽 2020 年真題答和案解析

一、選擇題 第 1 題 單選題 題目:表達式 ‘6’ - ‘1’ 的值是 ( ) A. 整數 5 B. 字符 5 C. 表達式不合法 D. 字符 6 答案:A 解析:在 C++ 中,字符常量以 ASCII 碼形式存儲。6 的 ASCII 碼為 54,1 的 ASCII 碼為 49,二者相減結果為 5,是整數類型,因此選 A。 第 2 題 …

使用Rust + WebAssembly提升前端渲染性能:從原理到落地

一、問題背景&#xff1a;為什么選擇WebAssembly&#xff1f; 最近在開發數據可視化大屏項目時&#xff0c;我們遇到了一個棘手的問題&#xff1a;前端需要實時渲染10萬數據點的動態散點圖&#xff0c;使用純JavaScript Canvas方案在低端設備上幀率不足15FPS。經過性能分析&a…

【沐風老師】3DMAX按元素UV修改器插件教程

3DMAX按元素UV修改器UV By Element是一個腳本化的修改器插件。對于需要創建隨機化紋理效果的用戶而言&#xff0c;3DMAX的UV By Element修改器無疑是一款高效工具&#xff0c;它將以偽隨機量偏移、旋轉和/或縮放每個元素的UV坐標。 【版本要求】 3dMax 2016及以上 【安裝方法】…