![](https://img-blog.csdnimg.cn/20190918140213434.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
mit6.s081
文章平均质量分 80
一起学习兄弟们
alpha miao~
这个作者很懒,什么都没留下…
展开
-
xv6源码解析 014
如果我们是在内核中处理其他的事情(我暂时想不出有什么其他的事情),此时陷入处理的向量也是指向这个函数,所以如果有一个无论是什么情况引起的trap,我们都会直接跳转到这个函数中进行处理。现在我们就安全的返回了用户空间了,站在用户进程的视角来看,用户进程并没有察觉时间的流逝(一个比喻,对于(分时操作系统的)用户进程来说,消耗了时间片才被视为是时间的流逝),相当于时间暂停了一下下,当返回时,又重新开始了。这是一个不会返回的函数,正如我们上篇说到的,在trap的整个过程链中的函数都是不会返回的。原创 2024-05-01 23:17:50 · 15 阅读 · 0 评论 -
xv6源码分析 013
我们需要了解用用户态陷入内核态并从内核态返回用户态,从内核态进行陷入并返回的整个过程,以及会调用那些函数,陷入之前的进程的上下文如何被保存,保存在哪里,陷入过程中需要改变那些寄存器的值,从陷入中恢复之后需要如何恢复这些寄存器的值,等等。在内核中,ecall相当于一条没用的指令,所以我们需要跳过这条指令,指向下一条需要执行的指令,注意这两条指令不一定是在连续的物理内存中的。函数的入口处,我们现在来执行这个函数,这个函数的主要的功能是路由(routine):判断陷入的原因,并执行相应的处理程序。原创 2024-04-30 00:13:44 · 844 阅读 · 0 评论 -
xv6源码分析 012
它被定义在kernel.ld文件中,这个文件是一个ARM架构的链接脚本(linker script),用来指导链接器如何布局目标文件中的各个段(section)。bss(block started by symbol)段是程序在内存中占用的一个特定的区域,主要用来存放未初始化的全局变量和静态变量。是块链表,每一个节点代表一个内存块(memory block),固定4096个字节的大小。xv6的内存配置器是基于单向链表的,这是最简单实现方式。并不是库函数中的memset,是自己实现的。我们需要注意,这里的。原创 2024-04-26 23:45:50 · 916 阅读 · 0 评论 -
xv6源码分析 011
为什么要先检查进程的进程锁是否已经被获取呢?我们上一集看过sleep的代码,在sleep中,进程首先获取进程锁,为了防止唤醒信号的丢失;这里检查进程锁是否被获取,看起来有点多余哈哈哈,而且是因为如果没有检测结果为false的化就会panic,这个在正常的系统中肯定是不被允许的。也可以这样理解,kill的作用具有延迟性,在进程由于中断或者系统调用陷入内核时,kill才起作用。这个函数用于唤醒所有在这个channel结构上睡眠的进程,类似于我们c++中的。OK,proc.c和proc.h的讲解到此结束啦!原创 2024-04-24 23:19:48 · 204 阅读 · 0 评论 -
xv6内核剖析 010
调度器执行完这个函数,并不会返回,因为这个函数底层是汇编代码,它改变了一系列寄存器的值:加载了被调度进程的上下文,并且将原来的调度器的上下文保存cpu中的context属性中以备下一次调度,我们可以理解为调度器在调用完swtch()之后就被暂停了,然后cpu通过ra寄存器返回了被调度进程上下文,那什么时候调度器的上下文才会被加载呢?取代原本的context,这样就切换到了调度函数中了,就能够进行调度,而原来的进程就作为一个就绪状态调度进程等待cpu的调度。的时候提到,在这个cpu的结构体中有一个。原创 2024-04-24 00:01:16 · 547 阅读 · 0 评论 -
xv6源码剖析 008
两者都是通过调用内联的汇编函数来打开或者禁止设备中断(device interrupts),因为xv6在自旋锁创建的临界区之间是不允许中断的,因为这有可能会产生死锁;进程收养、确保资源及时回收以及维持孤儿进程的正常运行或终止流程,有效地管理孤儿进程,避免了因父进程异常导致的子进程管理问题和系统资源浪费。一样,也是在内核的main函数中调用的,它初始化内核的第一个用户进程,这个进程作为这个操作系统进程树(process tree)的根节点(root)。的,因为进程也是来自于内核的,但是更都更了,先写完。原创 2024-04-20 00:02:02 · 513 阅读 · 0 评论 -
xv6源码剖析 009
从代码中,我们知道,当调用fork的时候,内核会完全复制父进程的页表,进程地址空间,trapframe page和相应的文件描述符,等等,唯一不同的就是,内核会直接将父进程的返回值返回(在代码中),而对于子进程则是将返回值保存在一个寄存器中;其实本质上,它们都是相同的,只是在代码中的体现有所不同,因为这个调用是由父进程引起的。子进程和父进程是相互独立的,它们并不共享相同的资源,这是由操作系统的隔离机制决定的,但是线程不一样,线程是运行在进程中的,而且一个进程中的不同进程是共享一部分进程的内存的;原创 2024-04-21 00:06:28 · 633 阅读 · 0 评论 -
xv6源码剖析 008
两者都是通过调用内联的汇编函数来打开或者禁止设备中断(device interrupts),因为xv6在自旋锁创建的临界区之间是不允许中断的,因为这有可能会产生死锁;进程收养、确保资源及时回收以及维持孤儿进程的正常运行或终止流程,有效地管理孤儿进程,避免了因父进程异常导致的子进程管理问题和系统资源浪费。一样,也是在内核的main函数中调用的,它初始化内核的第一个用户进程,这个进程作为这个操作系统进程树(process tree)的根节点(root)。的,因为进程也是来自于内核的,但是更都更了,先写完。原创 2024-04-21 00:05:03 · 1060 阅读 · 0 评论 -
xv6源码分析 007
用于实现trap机制,即在用户进程陷入内核态的时候,内核需要将该cpu上的该用户态进程的寄存器的状态保存在trapframe中,这样在恢复trap,返回用户空间的时候我们才能够继续正常地执行我们的指令。:每一个进程都有一个context,一般在没有进程或线程调度的时候,context保存的是这个进程的内核线程的上下文。在xv6中,线程调度需要先切换到内核的线程,然后这个内核线程的上下文和cpu中保存的上下文(cpu调度线程的上下文)交换,来回到到调度器线程中,在来选择下一个处于就绪状态的进程。原创 2024-04-18 23:59:00 · 723 阅读 · 0 评论 -
xv6源码分析 006
能够减少MMU的工作,因为在只有一个内核页表的情况下,这个内核页表是和用户进程的页表分离的,所以在内核页表中并不包含用户进程的地址空间的映射,这就意味着,在用户态有效的地址(va),在内核页表上是无效的,所以内核需要将这些地址转换成物理地址,才能够在内核页表上使用。,页表项,进程的进程地址空间在xv6中是由一个一个固定的4096个字节的虚拟页面(virtual page)来组成的,但是每个虚拟页的实际物理页其实不同的,所以说,一个进程的虚拟地址空间是连续的,但是这个进程的物理地址空间不一定是连续的。原创 2024-04-17 23:59:39 · 961 阅读 · 0 评论 -
xv6源码剖析 004
可以看到其实在下面的内存中我们是有足够的空间来容纳两个新的数据块的,但是,因为这几个空闲内存块并不连续,导致了malloc返回一个空指针,在实际情况中我们可能也会发现,我们的内存利用率并不高,但是内存分配总是失败,有可能就是这个原因。(在xv6中一个页固定大小为4096,当然我们实现内存池的时候当然可以根据我们自己的需要将内存划分为多种不同的大小的块,就是将xv6的这个配置器看成我们内存池的一个子集)。这一步也很简单,找到第一个合适的块,如果块的大小刚刚好,直接全部给,否则就进行切割,原创 2024-04-11 00:13:51 · 1013 阅读 · 0 评论 -
xv6源码分析 003
大致就是这个情况,好像并不会调用其他的函数,可能是我的测试命令太简单了,但是大致的调用流程和我上面给出的流程图是一样的,这种设计思路我们可以学习学习,其实我们也能够用函数指针的方法来实现,可能是由于我们命令有时候会比较复杂,比如当我们调用。今天是2024/4/9,发现我也看不懂了,不死磕了大佬们,简单做了个实验,发现我还是太年轻了,,而且我也大致的给出了第二个函数的实现的思路,现在就来正式的看看吧。这种复合命令的时候,就需要这种过滤的思维,来逐个解析命令。的字符的位置,并将对应的指针返回。原创 2024-04-09 00:20:28 · 793 阅读 · 0 评论 -
xv6源码分析 002
我们可以将xv6的shell看成是一个代理(proxy),我们将我们需要执行的命令交给这个帮我们代理的对象(shell),然后它再帮我们真正去做这件事情,然后将处理的结果返回给我们。这一层代理替我们与操作系统的用户态进行进行交互,我们我们不需要将写各种的函数来将我们的命令传递到内核,等内核处理完之后,再写各种的函数获取内核的处理的结果。了解一下内存池的实现,对我们水平的提高也是有帮助的。中,大家可以去看看,里面的函数的都很极致的,因为都是大佬写的,而且在面试的时候,面试佬可能会让你实现一些api。原创 2024-04-07 00:16:22 · 790 阅读 · 0 评论 -
xv6源码分析 001
是一些用户程序,也就是我们平时在shell上面执行的命令,每执行一个命令就会创建一个新的用户进程来执行这个命令。:主要是输出一段汇编指令,并通过重定向输入到指定的文件中,下面我们就来看看这段汇编。很明显,这是系统调用的trap过程,但是这个是什么语言我还不清楚,我们先看看xv6这个项目的基本结构(只看代码部分)ok,今晚就先到这里了,我们明晚再继续吧。ok,今晚就先到这里了,我们明晚再继续吧。.long 0 # 一个空指针。的过程,我就直接在源码上注释了。原创 2024-04-06 00:06:08 · 782 阅读 · 0 评论 -
xv6内核源码解析trap.c
为了方便我把整个实验代码都搬过去了,在windows下来看会方便一点,主要是招函数比较方便。要是觉得麻烦直接看博客也行,不过我觉得对着来看效果会好一点。基于实验4,我们先熟悉一下。原创 2024-03-17 22:35:49 · 422 阅读 · 0 评论 -
001 mit6.s086实验解析
大佬们,如果看到不通顺或者有不对的地址可以联系我(第一次搞翻译),或者那些地方怎么翻译会更好。实验后续在开始,现在先做翻译,希望能够6级。原创 2024-03-03 19:48:01 · 244 阅读 · 0 评论