Linux
文章平均质量分 84
NullObjectError
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
MIT6.S081学习总结-lab10:mmap
lab10 实现mmap介绍mmap和munmap系统调用允许UNIX程序对它们的地址空间进行详细的控制。它们可以用于在进程之间共享内存,将文件映射到进程地址空间,以及作为用户级页面错误方案的一部分,比如在讲座中讨论的垃圾收集算法。在本实验中,您将向xv6添加mmap和munmap,重点关注内存映射文件。void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);mmap可以通过多种方原创 2021-07-09 16:44:03 · 1674 阅读 · 2 评论 -
MIT6.S081学习总结-lab9:file system
lab9 是文件系统相关,主要实现大文件的支持和软链接。Large files实现对大文件的支持文件分配策略就是国内操作系统教材上讲的索引分配。原本xv6中每个文件有13个地址索引,前12个是直接地址索引,对应的数据块直接存储数据,最后一个是一级间接地址索引,对应的数据块存储地址索引,因此最大文件为256+12=268256+12=268256+12=268个数据块。增大支持的最大文件大小,可以增加一个二级间接地址索引,变为前11个直接地址索引,第12个一级间接地址索引,最后一个是二级间接地址索引,原创 2021-07-06 23:45:17 · 2281 阅读 · 3 评论 -
MIT6.S081学习总结-lab8:Lock
lab8 是关于锁的应用,重新设计内存分配和缓冲区分配,来增加多核并行速度Memory allocator物理内存分配,之前的实现里每次分配内存kalloc、释放内存kfree都需要获得全局锁kmem.lock,在多核系统里这会导致很激烈的race condition。改进时,可以考虑为每个CPU一个空闲内存列表,每次分配内存时先分配当前cpu空闲内存列表里的内存,如果不够就从其他空闲列表里‘steal’一个内存快。这样需要每个列表一个锁,可以大量减少锁的竞争。实现:kmem修改为每个CPU一个fr原创 2021-07-05 19:38:59 · 1839 阅读 · 1 评论 -
MIT6.S081学习总结-lab7:Multithreading
lab7 是多线程相关,将会实现一个用户级线程,使用多线程加速程序以及实现一个barrierUthread:switching between threads实现用户级线程的切换,主要修改thread_create()、thread_schedule()和thread_switch.实现:刚开始没怎么懂,照着kernel里的swtch写了一下,竟然过了新增上下文数据结构:thread_create里初始化该线程上下文信息中的ra和sp寄存器值,ra是返回地址,就是函数返回之后继续执行的点,sp原创 2021-07-01 20:25:24 · 1403 阅读 · 5 评论 -
MIT6.S081学习总结-lab6:Copy-On-Write Fork
lab6 也是虚拟内存的一种应用,主要实现fork时的写时复制copy-on-write功能。问题xv6中的fork()系统调用将所有父进程的用户空间内存复制到子进程中。如果父进程用户空间很大,复制可能需要很长时间。更糟糕的是,这种复制工作经常被浪费;例如,子进程中的fork()后跟exec()将导致子进程丢弃复制的内存,可能根本就没有使用复制来的很大一部分内存。另一方面,如果父类和子类都使用一个页面,而其中一方或双方都编写该页面,则确实需要一个副本。解决方法写时拷贝(COW) fork()的目标是原创 2021-06-30 13:09:25 · 1215 阅读 · 1 评论 -
MIT6.S081学习总结-lab5:lazy page allocation
lab5 是lazy page allocationi相关,主要解决页面错误问题。O/S可以对页表硬件使用的许多巧妙技巧之一是延迟分配用户空间堆内存。Xv6应用程序使用sbrk()系统调用向内核请求堆内存。在我们给出的内核中,sbrk()分配物理内存并将其映射到进程的虚拟地址空间。内核为一个较大的请求分配和映射内存可能需要很长时间。例如,考虑一个gb由262,144 4096字节的页组成;即使每一种都很便宜,这也是一笔巨大的投资。此外,一些程序分配的内存比实际使用的要多(例如,实现稀疏数组),或者在使用之前原创 2021-06-28 22:59:49 · 1053 阅读 · 1 评论 -
MIT6.S081学习总结-lab4:traps
lab4 是traps相关Backtrace添加一个backtrace函数,sys_sleep调用这个函数后可以打印出函数调用栈实现:kernel/riscv.h里添加函数来获取frame pointer:在kernel/printf.c里添加backtrace函数:sys_sleep里调用即可Alarm实现两个系统调用:int sigalarm(int ticks, void (*handler)()) 每ticks时钟单位调用handler;int sigreturn(void)在h原创 2021-06-25 16:30:39 · 1071 阅读 · 2 评论 -
MIT6.S081学习总结-lab3:page tables
lab3 主要是页表相关,难度突然提高了好多,遇到了无数个坑,太难了。打印页表第一个进程启动时打印页表内容实现:kernel/vm.c里添加,递归实现即可每个进程一张内核页表目前xv6的实现里,每个进程只有一张独立的用户地址空间页表,共享一张内核页表,这样的话每次内核不能直接使用用户指针,只能先将其通过用户页表转为物理地址。本节及下一节要做的是使内核可以直接解引用用户指针,就是可以直接通过虚拟地址访问。本节要做的就是为每个进程复制一个内核页表。实现省略了 添加函数到defs.h的步骤,这原创 2021-06-15 23:49:37 · 3925 阅读 · 4 评论 -
MIT6.S081学习总结-lab2: system calls
lab2 主要实现两个系统调用添加系统调用过程user/user.h里添加系统调用函数,这个lab需要添加两个系统调用,下图中最后两个:trace 和 sysinfouser/usys.pl里添加一个entry,这个文件会生成user/usys.S,就是系统调用的具体实现,之后会使用ecall指令跳转到相应的系统调用去执行。kernel/syscall.h添加系统调用的编号kernel/syscall.c添加系统调用的函数映射,syscalls这个数组存放了所有指向系统调用的实现函数指针原创 2021-06-04 14:49:35 · 1614 阅读 · 3 评论 -
MIT6.S081学习总结-lab1: Xv6 and Unix utilities
最近学习MIT比较有名的操作系统课程6.S081,这门课程主要亮点就是设计精巧的lab了。这里记录一下lab1:Xv6 and Unix utilities.1.sleep用系统调用实现sleep#include "kernel/types.h"#include "user/user.h"intmain(int argc, char* argv[]){ if (argc <= 1) { fprintf(2, "sleep: missing operand\n")原创 2021-06-03 14:05:39 · 2579 阅读 · 4 评论 -
Linux网络编程之TCP相关
目录TCP连接建立服务器端客户端TCP断开连接一些细节:1.文件描述符的阻塞非阻塞问题2.三次握手发生在哪步3.关于 listen 第二个参数 backlog4.通信的一端突然断开会怎样5.shutduwn 和 close6.RST包总结参考最近在学习一些Linux网络编程,这里整理一下TCP相关内容TCP连接建立建立连接需要三次握手,对应的socket编程如下(忽略了异常处理):服务器端#include <sys/socket.h>#include <arpa/inet.h&原创 2021-05-28 16:02:44 · 753 阅读 · 0 评论
分享