随笔分类 -  操作系统

摘要:最后一个实验了,代码在Github上。 这一个实验其实挺简单的,就是要实现网卡的e1000_transmit和e1000_recv函数。不过看以前的实验好像还要实现上层socket相关的代码,今年就只有网卡驱动了。 虽然实验文档里面给了一本400多页的网卡文档,但其实也不需要怎么读这本厚厚的文档,实 阅读全文
posted @ 2021-02-10 18:50 星見遥 阅读(3482) 评论(0) 推荐(1)
摘要:代码在Github上。 这一个实验是要实现最基础的mmap功能。mmap即内存映射文件,将一个文件直接映射到内存当中,之后对文件的读写就可以直接通过对内存进行读写来进行,而对文件的同步则由操作系统来负责完成。使用mmap可以避免对文件大量read和write操作带来的内核缓冲区和用户缓冲区之间的频繁 阅读全文
posted @ 2021-02-10 12:04 星見遥 阅读(3686) 评论(0) 推荐(0)
摘要:代码在github上。 这次实验是要对文件系统修改,使其支持更大的文件以及符号链接,实验本身并不是很复杂。但文件系统可以说是XV6中最复杂的部分,整个文件系统包括了七层:文件描述符,路径名,目录,inode,日志,缓冲区,磁盘。 文件描述符类似于Linux,将文件、管道、设备、套接字等都抽象为文件描 阅读全文
posted @ 2021-02-09 20:12 星見遥 阅读(4841) 评论(0) 推荐(2)
摘要:几乎所有操作系统都会运行数量远多于CPU数量的进程,因此需要对CPU进行分时共享。理想情况下这种共享应该是对用户进程透明的。一个常用的方法是通过多路复用将进程分配到硬件CPU上,使每个进程有其自己的虚拟CPU。 多路复用 XV6在两种情况下会对CPU的进程进程切换从而实现复用:一种是XV6的slee 阅读全文
posted @ 2021-02-08 20:35 星見遥 阅读(1398) 评论(0) 推荐(0)
摘要:代码在github上 这一次实验是要对XV6内部的锁进行优化,减少锁争用,提高系统的性能。 Memory allocator (moderate) 第一个实验是对XV6内核的内存页面分配器进行改进,改进的策略在前面的章节中也讲过了。XV6原本是使用一个空闲页面链表,但是这样就会导致不同CPU上的ka 阅读全文
posted @ 2021-02-06 19:01 星見遥 阅读(3543) 评论(0) 推荐(0)
摘要:代码放在github上。 这一次实验感觉挺简单的,特别是后面两个小实验。主要就是对多线程和锁进行一个学习。 Uthread: switching between threads 这一个实验是要实现一个简单的用户级线程,写完之后发现原来用户级线程的简单实现也没有想象的那么复杂。 首先定义一个conte 阅读全文
posted @ 2021-02-05 21:24 星見遥 阅读(3202) 评论(1) 推荐(0)
摘要:在包括XV6的绝大部分操作系统都是多个任务交错执行的。交错的一个原因是多核硬件:多核计算机的多个CPU核心独立执行计算,如XV6的RISC-V处理器。多个CPU核心共享物理内存,XV6利用这种共享来维护所有核心都会读写的数据结构。而这种共享会导致一个CPU在读取某数据结构时,可能有另一个CPU正在对 阅读全文
posted @ 2021-02-05 11:05 星見遥 阅读(1516) 评论(0) 推荐(1)
摘要:epoll是Linux中用于IO多路复用的机制,在nginx和redis等软件中都有应用,redis的性能好的原因之一也就是使用了epoll进行IO多路复用,同时epoll也是各大公司面试的热点问题。 IO多路复用 IO多路复用是一种同步IO模型,使得一个线程就可以对多个文件描述符进行监听。当有文件 阅读全文
posted @ 2021-01-31 20:44 星見遥 阅读(1025) 评论(0) 推荐(1)
摘要:代码在github上。总体来说如果理解了COW机制的话,这个实验的完成也没有很复杂。 这一个实验是要完成COW(copy on write)fork。在原始的XV6中,fork函数是通过直接对进程的地址空间完整地复制一份来实现的。但是,拷贝整个地址空间是十分耗时的,并且在很多情况下,程序立即调用ex 阅读全文
posted @ 2021-01-31 12:19 星見遥 阅读(4421) 评论(0) 推荐(1)
摘要:驱动是操作系统中用于管理特定设备的代码:驱动控制设备硬件,通知硬件执行操作,处理中断,与等待该设备IO的进程进行交互。 当设备需要与操作系统进行交互时,就会产生中断(陷阱的一种),之后内核的陷阱处理代码就会识别中断设备并调用对应的驱动处理程序。在XV6这一步发生在trap.c的devintr中。 大 阅读全文
posted @ 2021-01-30 11:00 星見遥 阅读(1746) 评论(0) 推荐(0)
摘要:代码在github上。 这一个实验是要利用缺页异常来实现懒分配(lazy allocation)。用户态程序通过sbrk系统调用来在堆上分配内存,而sbrk则会通过kalloc函数来申请内存页面,之后将页面映射到页表当中。 当申请小的空间时,上述过程是没有问题的。但是如果当进程一次申请很大的空间,如 阅读全文
posted @ 2021-01-16 10:39 星見遥 阅读(2101) 评论(1) 推荐(0)
摘要:这一个实验主要是对RISC-V的汇编、栈帧结构以及陷阱进行简单的了解,难度并不大。 代码放在github上。 RISC-V assembly (easy) Q1: Which registers contain arguments to functions? For example, which r 阅读全文
posted @ 2021-01-06 10:37 星見遥 阅读(3773) 评论(0) 推荐(1)
摘要:在操作系统中,有三种情况会导致CPU的控制流发生转移:用户态中通过ecall指令进入内核态;异常发生,如除零、访问非法地址;设备中断,如硬盘完成读写请求。上面这些情况可以统称为陷阱(trap)。 陷阱在一般情况下应该是透明的,即当执行完处理程序后能够恢复之前程序的状态。这就要求在陷入内核态时,内核要 阅读全文
posted @ 2021-01-04 10:35 星見遥 阅读(1894) 评论(0) 推荐(0)
摘要:这一个实验主要是学习XV6的页表(分页机制),关于分页机制的相关内容已经写在XV6学习 (3)里面了。 代码放在Github上。 Print a page table (easy) 这一个就是要实现一个vmprint()函数来遍历页表并打印,可以仿照freewalk()函数来写。 void prin 阅读全文
posted @ 2020-12-23 10:33 星見遥 阅读(3311) 评论(0) 推荐(0)
摘要:正在学习MIT的6.S081,把做的实验写一写吧。 实验的代码放在了Github上。 第一个实验是Lab util,算是一个热身的实验,没有涉及到系统的底层,就是使用系统调用来完成几个用户模式的小程序。 Boot xv6 (easy) 启动XV6,按照文档执行就ok了。 $ git clone gi 阅读全文
posted @ 2020-12-21 17:21 星見遥 阅读(6137) 评论(0) 推荐(2)
摘要:页表是操作系统中非常重要的一部分,用于将虚拟地址转化为物理地址。虚拟内存是操作系统实现进程隔离的关键技术。 在 XV6 中通过 RISC-V 的页表机构完成了虚拟地址向物理地址的转换。 分页硬件机构 XV6 运行于 Sv39 RISC-V 上,64 位地址中的低 39 位被使用。RISC-V 的页表 阅读全文
posted @ 2020-12-21 10:32 星見遥 阅读(4894) 评论(0) 推荐(0)
摘要:实验的代码放在了Github上。 第二个实验是Lab: system calls。 这个实验主要就是自己实现几个简单的系统调用并添加到XV6中。 XV6系统调用 添加系统调用主要有以下几步: 在user/user.h中添加系统调用函数的定义。 在user/usys.pl中添加入口,这个文件将会在ma 阅读全文
posted @ 2020-12-21 10:28 星見遥 阅读(5307) 评论(0) 推荐(1)