首页 > 其他分享 >xv6 file system

xv6 file system

时间:2023-12-04 18:56:07浏览次数:30  
标签:log ip system xv6 file 磁盘 inode 节点 struct

xv6 file system

在我看来文件系统某种程度上是最复杂的一部分(单从页数也足以说明了),而且我对文件系统的了解其实很少,因此这部分仔细看了一下。

xv6文件系统提供类似unix的文件、目录和路径名,并将其数据存储在virtio磁盘上以实现持久化。
文件系统解决了几个挑战:

  1. 文件系统需要磁盘上的数据结构来表示目录树和文件,记录保存每个文件内容的块的标识,并记录磁盘的哪些区域是空闲的。
  2. 文件系统必须支持崩溃恢复。也就是说,如果发生崩溃,文件系统必须在重新启动后仍能正常工作。
  3. 不同的进程可能同时在文件系统上操作,因此文件系统代码必须协调以维护invariants(这个词一直不知道怎么翻译,应该是修改过程需要原子操作的量,修改前后具有相同含义,但过程中可能变化)。
  4. 访问磁盘比访问内存慢几个数量级,因此文件系统必须在内存中维护缓存。

xv6文件系统一共有七层。

disk

磁盘硬件传统上将磁盘上的数据表示为512字节块,即扇区。操作系统为其文件系统使用的块大小可能与磁盘使用的扇区大小不同,但块大小通常是扇区大小的倍数。Xv6在buf中保存已读入内存的块的副本。存储在这个结构中的数据有时与磁盘不同步:它可能还没有从磁盘读入(磁盘正在处理它,但还没有返回扇区的内容),或者它可能已经被软件更新了,但还没有写入磁盘。

xv6将磁盘划分为几个部分,文件系统不使用块0(它包含引导扇区)。区块1是超级区块(由一个名为mkfs的单独程序填充,构建一个初始文件系统),它包含有关文件系统的元数据(以块为单位的文件系统大小、数据块数量、inode数量和日志中的块数量)。从2开始的块记录日志,之后是inodes,之后是位图块,记录数据块使用情况,剩下的块是数据块。

buffer

Buffer cache有两个任务

  • 同步对磁盘块的访问,以确保内存中只有一个块的副本,并且一次只有一个内核线程使用该副本;
  • 缓存常用块,提供快速读写。

buffer的主接口由bread和bwrite组成,前者获取一个包含可在内存中读取或修改的块副本,后者将修改后的缓冲区写入磁盘上相应的块,二者均调用virtio_disk_rw。bget获取LRU缓冲队列对应块号的缓存,或者未缓存时选取队尾缓存,无论哪种情况返回的缓存块都带锁(每个缓存块各自的睡眠锁,而不是缓存整体的那把大自旋锁),保证一次只有一个线程使用该缓存块。brelse释放缓存块的睡眠锁。bio.c中双链和各种操作的实现非常规整,简单易读,值得学习。

buf缓冲区有两个与之相关联的状态字段。字段valid表示缓冲区包含该块的副本。字段disk表示缓冲区内容已被交给磁盘。

xv6并未实现缓存的置换,在没有空闲块时,只是简单地panic。为什么不选择队尾的块置换呢?或者睡眠?也许是简单吧QAQ

logger

这部分描述得好抽象啊,看书完全不懂,结合代码看了好久

标签:log,ip,system,xv6,file,磁盘,inode,节点,struct
From: https://www.cnblogs.com/wangerblog/p/17875689.html

相关文章

  • seafile获取token和文件夹ID
    获取tokencurl-d"[email protected]&password=tkv7zjV4P0Rq"http://xxxxxxxx:50018/api2/auth-token/双因素认证:curl-d"[email protected]&password=tkv7zjV4P0Rq" -H'X-SEAFILE-OTP:<token>......
  • 最简明扼要的 Systemd 教程,只需十分钟
    systemctl常用命令介绍~~~  Systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器。Systemd是一个系统管理守护进程、工具和库的集合,用于取代SystemV初始进程。Systemd的功能是用于集中管理和配置类UNIX系统。  启动及服务    大多数主流发行版要么......
  • C++/Filesystem 文件类型
    #include<iostream>#include<filesystem>#include<string>namespacefs=std::filesystem;voiddemo_status(constfs::path&p,fs::file_statuss){std::cout<<p;switch(s.type()){casefs::file_type::none:......
  • xv6 cow
    虚拟内存提供了一定程度的间接性:内核可以通过将PTE标记为无效或只读来拦截内存引用,从而导致页面错误,并可以通过修改PTE来更改地址的含义。xv6中的fork系统调用将父进程的所有用户空间内存复制到子进程中。如果父对象很大,则复制可能需要很长时间。更糟糕的是,这项工作经常被大量浪......
  • 如何用FileZilla访问、下载服务器中的数据?
      本文介绍FileZilla软件的下载、配置与使用方法。  在文章高分GF、环境HJ遥感影像的下载方法中,我们提到了下载高分遥感影像数据需要用到FTP(文件传输协议,FileTransferProtocol)软件FileZilla;这一软件用以在自己的电脑与服务器之间相互传输数据,在进行下载科学数据、网站开发等......
  • 【pwn】puts or system? --格式化字符串漏洞泄露libc基址
    还是先看一下保护情况开了canary,接着看主函数逻辑看到这里的代码逻辑,我一开始是想通过printf泄露出canary的值,然后再用ret2libc来打,但是我发现这个libc不好泄露,一般的泄露的思路都是构造ROP,通过puts函数泄露出puts的got表内容,但是我在寻找rdi这个gadget的时候,是找不到的这也......
  • CentOS7 无法执行systemctl status ntpd的原因及解决方法
    在CentOS7中,NTP的服务名为ntpd.service,如果出现Unitntpd.servicecouldnotbefound的错误,可能是由于NTP没有安装或未正确启动所致。你可以尝试以下步骤来解决此问题:首先,检查系统是否已经安装NTP。可以运行以下命令:rpm-qntp如果返回packagentpisnotinstall......
  • java获取multipartfile的编码
    Java获取MultipartFile的编码在Java开发中,我们经常需要处理文件上传功能。Spring框架提供了MultipartFile接口来处理文件上传,它是对文件上传的封装,提供了一系列的方法来处理文件的内容、类型、大小等。在某些情况下,我们可能需要获取MultipartFile的编码信息,比如判断上传文件的编......
  • java后缀名file
    Java后缀名文件Java是一种高级编程语言,经常用于开发各种应用程序。在Java编程中,我们经常会遇到以.java为后缀名的文件。这篇文章将为您介绍Java后缀名文件的相关知识,并提供代码示例来帮助您更好地理解。Java后缀名文件的含义在Java中,后缀名为.java的文件是Java源代码文件的标识......
  • [https @ 000001a69f0bae00] Protocol 'https' not on whitelist 'file,crypto,data'!
    ffmpeg下载视频并合并到一个视频中,执行如下命令:ffmpeg-iindex.m3u8-ccopyresult.mp4出现[https@000001a69f0bae00]Protocol'https'notonwhitelist'file,crypto,data'!问题,详情如下: 因fmpeg默认不使用https协议,https协议没有在白名单内,所以无法下......