
OS
文章平均质量分 87
瑜陀
Sophomore, major in Computer Science.
展开
-
mmap() 的几种用法
mmap 是一个非常强大的系统调用,常用于映射文件到内存中,以实现快速和方便的文件访问,也用于进程间通信等多种场景。原创 2024-06-12 17:50:07 · 1250 阅读 · 2 评论 -
关于一篇知乎答案的重现
实现了一个简单的容器化环境的初始化过程,包括命名空间的隔离、文件系统的挂载与切换、进程环境的修改等操作,从而创建了一个隔离的运行环境。原创 2024-03-31 17:20:23 · 285 阅读 · 0 评论 -
mit6.s081【目录】
现在是 2023 年 12 月 24 日,我终于完成了 mit6.s081课程的学习,期间读完了xv6book、OSTEP、xv6 部分内核源码,也写了 近 20 篇的博客,可以说是学习之旅收获颇丰。本文将会起一个目录,方便查找和阅读。原创 2023-12-24 19:08:07 · 515 阅读 · 0 评论 -
MIT 6.S081学习笔记(第十章)
实现对于完成 MIT 6.S081 实验中的网络部分非常详细和全面。e1000_transmit() 函数有效地将数据包发送到 E1000 网卡中,涵盖了缓冲区描述符的正确设置和释放,并确保了发送队列的并发安全性。e1000_recv() 函数则能够持续地处理接收到的数据包,在循环中检查描述符的状态并进行数据包处理、网络栈传递和接收队列更新等操作。原创 2023-12-24 18:41:41 · 230 阅读 · 0 评论 -
MIT 6.S081学习笔记(第九章)
实验的目标是确保实现 mmap 和 munmap 功能,使得测试程序 mmaptest 能够成功运行,并通过一系列测试,包括对 mmap 和 munmap 的功能、文件的读写、进程 fork 和 exit 的正确性检验等。原创 2023-12-23 22:22:25 · 290 阅读 · 0 评论 -
MIT 6.S081学习笔记(第八章)
为 xv6 的文件系统添加大文件以及符号链接支持。原创 2023-12-21 19:22:05 · 230 阅读 · 0 评论 -
xv6 文件系统面临的问题
这篇文章的总结可以强调 **xv6** 文件系统在处理缓存、适配日志大小和管理并发系统调用时所面临的挑战和解决方案,突出了数据一致性和可恢复性的重要性。原创 2023-12-20 15:47:03 · 202 阅读 · 0 评论 -
xv6 文件系统(下)
这种技术在许多数据系统中也被广泛应用,比如数据库系统(比如MySQL、PostgreSQL等)、缓存系统(比如Redis)等。它们使用日志记录来确保数据库或者缓存在崩溃或者异常情况下的数据完整性和一致性。通过记录操作和事务,系统可以在崩溃后重新应用这些记录,从而确保数据的恢复和一致性。原创 2023-12-18 22:43:42 · 168 阅读 · 0 评论 -
xv6 文件系统(上)
探讨了文件系统在 xv6 环境下的工作原理,分层次地介绍了文件系统的实现概述、硬盘使用、inode 结构、目录、以及文件系统的工作示例。文章详细解释了inode和block在磁盘上的分布方式,以及文件的创建、写入和元数据修改的过程。它提供了清晰的代码示例和相关函数的解释,为理解文件系统的内部机制提供了深入而全面的认识。原创 2023-12-18 17:00:59 · 595 阅读 · 0 评论 -
MIT 6.S081学习笔记(第七章)
只有第一个线程进入并执行了驱逐和重新分配后释放了 eviction_lock,blockno 的缓存才从不存在转变为存在。后续命中相同 blockno 的线程会被第二次“blockno 缓存是否存在”的检查拦截,并直接返回已分配的缓存 buf,而不会重新执行驱逐和重新分配。原创 2023-12-13 23:37:58 · 188 阅读 · 0 评论 -
xv6 中的一些系统调用(下)
这篇文章详细地介绍了 xv6 操作系统中的 sleep() 和 wakeup() 系统调用的实现原理以及相关的内部工作机制。主要强调了在 sleep() 中的原子操作性,确保了操作的完整性,以及在 wakeup() 中唤醒休眠进程的方式。原创 2023-12-11 14:47:30 · 234 阅读 · 0 评论 -
xv6 中的一些系统调用(上)
现在进程还没有完全释放它的资源,所以它还不能被重用。所谓的进程重用是指,我们期望在最后,进程的所有状态都可以被一些其他无关的fork系统调用复用,但是目前我们还没有到那一步。现在我们还没有结束,因为我们还没有释放进程资源。我们在还没有完全释放所有资源的时候,通过调用 sched() 函数进入到调度器线程。原创 2023-12-10 23:02:24 · 462 阅读 · 0 评论 -
MIT 6.S081学习笔记(第六章)(下)
整体而言,这个实验涉及了多线程编程、上下文切换机制设计、锁的使用、以及线程同步问题的解决。需要理解和实现线程的创建、调度、上下文切换,以及在多线程环境下处理临界区和同步问题。原创 2023-12-08 09:04:37 · 220 阅读 · 0 评论 -
MIT 6.S081学习笔记(第六章)(上)
为了提高性能同时降低切换上下文带来的开销,我们更倾向于把一个任务编排在同一个进程中,而不是写两个进程(比如上面的多进程打印 hello world)。换句话说,一个活动最好是一个进程单元,而为了提高这个进程单元的执行速度,最大化利用 CPU 多核心性能,可以在这个进程中创建多个线程来完成任务。毕竟进程太大,切换上下文相当复杂,xv6 中的trapframe 太大,而线程中的 context 则小得多。原创 2023-12-07 22:52:48 · 254 阅读 · 0 评论 -
MIT 6.S081学习笔记(第五章)
该实验主要解决了在 xv6 操作系统中,通过实现Copy-on-Write(COW)fork,减少 fork() 系统调用所需的内存复制。这意味着在父进程和子进程之间共享物理页,并延迟物理内存分配和复制,直到有进程对共享的页进行写入操作。原创 2023-12-06 11:33:52 · 185 阅读 · 0 评论 -
xv6 book Chapter7 中文翻译
任何操作系统可能会运行比计算机 CPU 数量更多的进程,因此需要一个计划来在这些进程之间进行 CPU 的时间共享。理想情况下,共享对于用户进程应该是透明的。常见的方法是通过将进程复用到硬件 CPU 上,为每个进程提供其拥有独立虚拟 CPU 的假象。翻译 2023-12-04 20:57:29 · 115 阅读 · 0 评论 -
xv6 book Chapter6 中文翻译
锁提供互斥性,确保一次只有一个CPU可以持有锁。如果程序员将每个共享数据项与一个锁相关联,并且代码在使用数据项时始终持有相关联的锁,那么该数据项将一次只被一个CPU使用。在这种情况下,我们说该锁保护了数据项。翻译 2023-12-04 20:32:36 · 154 阅读 · 0 评论 -
xv6 book Chapter5 中文翻译
许多设备驱动程序在两个上下文中执行代码:一个是在进程的内核线程中运行的上半部分,另一个是在中断时执行的下半部分。上半部分通过诸如读取和写入之类的系统调用进行调用,这些调用希望设备执行输入输出操作。该代码可能会要求硬件开始一个操作(例如,要求磁盘读取一个块),然后等待操作完成。翻译 2023-12-04 20:18:27 · 103 阅读 · 0 评论 -
xv6 book Chapter4 中文翻译
这里有三种事件会导致 CPU 暂停正常执行指令,并强制转移控制权到处理该事件的特殊代码。一种情况是系统调用,当用户程序执行 ecall 指令请求内核为其执行某些操作时。另一种情况是异常:指令(用户或内核)执行了一些非法操作,比如除以零或使用无效的虚拟地址。第三种情况是设备中断,当设备发出信号需要注意时,例如当磁盘硬件完成读取或写入请求时。翻译 2023-12-04 16:00:43 · 161 阅读 · 0 评论 -
MIT 6.S081学习笔记(第四章)
每一次我们调用一个函数,函数都会为自己创建一个Stack Frame,并且只给自己用。函数通过移动Stack Pointer来完成Stack Frame的空间分配。对于Stack来说,是从高地址开始向低地址使用。所以栈总是向下增长。当我们想要创建一个新的Stack Frame的时候,总是对当前的Stack Pointer做减法。原创 2023-11-24 15:33:41 · 324 阅读 · 0 评论 -
MIT 6.S081学习笔记(第三章)
如果用户态调用系统调用(比如getpid()),那么就需要切换到内核态,这中间就会带来开销。对于加速系统调用,思路就是不让它切换到核心态,仍然能运行一些核心态才能运行的操作,比如获取某个进程的 pid。原创 2023-11-22 17:19:13 · 551 阅读 · 0 评论 -
xv6 book Chapter3 中文翻译
页表是最流行的机制,操作系统通过它提供每个进程拥有自己的私有地址空间和内存。页面表确定了内存地址的含义,以及可以访问物理内存的哪些部分。它们使得 xv6 能够隔离不同进程的地址空间,并将它们多路复用到单个物理内存中。翻译 2023-11-18 11:27:51 · 203 阅读 · 0 评论 -
《OSTEP》信号量(chap31)
假设两个生产者(Pa和Pb)几乎同时调用`put()`。当Pa先运行,在f1行先加入第一条数据(fill=0),假设Pa在将fill计数器更新为1之前被中断,Pb开始运行,也在f1行给缓冲区的0位置加入一条数据,这意味着那里的老数据被覆盖。原创 2023-11-13 18:32:25 · 123 阅读 · 0 评论 -
《OSTEP》条件变量(chap30)
假设生产者唤醒了第一个消费者,消费者又恰巧唤醒了第二个生产者,第二个生产者被唤醒之后又睡眠。这样三个线程都在睡眠。解决问题的办法就是消费者只能唤醒生产者,生产者只能唤醒消费者。原创 2023-11-11 22:10:26 · 322 阅读 · 0 评论 -
MIT 6.S081学习笔记(第二章)
库函数会将系统调用号码和参数加载到寄存器中,通常使用a7寄存器(或者其他体系结构中的类似寄存器),其中a7用于存储系统调用号码原创 2023-10-05 00:15:19 · 661 阅读 · 0 评论 -
MIT 6.S081学习笔记(第一章)
xv6是以ANSI C重新编写的Unix第六版现代实现版本,适用于多处理器x86或RISC-V系统。xv6于2006年问世,作为麻省理工学院的操作系统工程(6.828)课程的教学使用。与Linux或BSD不同,xv6非常简单,足以在一个学期内讲完,但仍然包含Unix的重要概念和组织。原创 2023-09-10 19:30:08 · 627 阅读 · 0 评论 -
MIT 6.S081学习笔记(第〇章)
......有一个例外,那就是 cd,它是在 shell 中实现的。cd 必须改变 shell 自身的当前工作目录。如果 cd 作为一个普通命令执行,那么 shell 就会 fork 一个子进程,而子进程会运行 cd,cd 只会改变子进程的当前工作目录。父进程的工作目录保持原样,这意味着这个命令没有起到预期的作用......原创 2023-09-07 23:04:29 · 624 阅读 · 0 评论 -
Hackintosh 入门
本文收集了黑苹果入门的方法,只要按顺序阅读这些帖子,就能对 Hackintosh 的过程和细节有大致的了解,当然想要精通,还需要日积月累。以上几篇文章按照顺序耐心阅读,即可入门。原创 2023-07-27 11:28:57 · 165 阅读 · 0 评论 -
Docker网络模型以及容器网络初探(一)
安装Docker时,它会自动创建三个网络,默认`bridge网桥`(创建容器默认连接到此网络)、 `none` 、`host`。各个方式有各自的特点,它们有着特定的差距,比如网络性能等,一般按照实际应用方式手动指定(或者选用默认)一个网络,或者使用命令自己添加一个自己定义的网络。原创 2023-07-04 15:51:59 · 393 阅读 · 0 评论 -
Start to write a simple Linux kernel Module
make -C /usr/src/linux-headers-5.4.0-48-generic M=/home/ubuntu/Mooc modulesmake[1]: Entering directory '/usr/src/linux-headers-5.4.0-48-generic' CC [M] /home/ubuntu/Mooc/hello.o Building modules, stage 2. MODPOST 1 modules CC [M] /home/ubuntu/Mo原创 2022-12-28 17:44:35 · 198 阅读 · 0 评论 -
对环境变量的探究
可以看到子进程的环境变量PATH被修改为了wrong,并且多了一个环境变量`PENGUIN=BEAR`,这些环境变量都一起最先压入栈中。即父进程在创建子进程时,可以修改子进程的环境变量,子进程创建完毕调用main()时修改后的环境变量会首先压入栈中。原创 2023-01-10 20:42:18 · 174 阅读 · 0 评论