本博客目的是对mit6.s081中xv6整体流程进行梳理,对于具体细节方面可能有不到位之处,敬请包含。
首先是系统调用,即system call,该过程既有riscv的硬件汇编参与,又有软件编写,并且涉及到了user和kernel两个部分的结合。因此私以为这部分还是十分重要的。
1、如何开始
基于makefile文件可以观其端倪,可以看到使用perl这一命令(perl是一种类似python的脚本语言,可以认为这是其解释器,因为了解不多,因此浅浅解释一下),将user中的pl文件生成代码写入到汇编文件usys.S中。下一行中,也基于了usys.S文件,但是个人认为此时这个文件应当是空的。然后通过
同时,我们还要对我们使用的编译链有所了解。其中2>&1的含义是,将标准错误输出重定向到标准输出。符号>&是一个整体,不可分开,分开后就不是上述含义了。
比如有些人可能会这么想:2是标准错误输入,1是标准输出,>是重定向符号,那么"将标准错误输出重定向到标准输出"是不是就应该写成"2>1"就行了?是这样吗?
如果是尝试过,你就知道2>1的写法其实是将标准错误输出重定向到名为"1"的文件里去了
目前为止,$(CFLAGS)中的参数包括
-用于启用一批比较常见且易于修改的警告,这些选项都是对代码进行基本的检查
-Werror
用于将所有警告视为错误。
-fno-omit-frame-pointer omit the frame pointer这是一个关于栈帧的指令。意思是忽略这个栈帧。如果函数不需要frame pointer,就不要将frame pointer保留在寄存器中
每个进程的栈空间为一帧,FP指向当前进程栈空间的栈底(stack bottom)。而 stack pointer(SP) 即堆栈指针,总是指向栈顶(stack top)。
在多进程环境中&