本人在学习MIT6.S081的lecture 1时,想复现老师编译运行copy.c文件的操作,但是遇到了重重阻碍,查阅了许多经验贴后才得以解决,现在将探索过程复盘如下。
1.在linux中编辑文件
linux提供了vi编辑器来编辑主机中的文件,这个文件可以是.txt的文本格式,也可以是.c等各种可编辑格式。其使用方法很简单,只需要输入vi <文件名>即可,如我想在桌面创建一个copy.c文件,那我的指令就是输入在“桌面”的根目录下的vi copy.c。

按下enter后,系统就会自动在桌面创建一个copy.c文件,并且终端会进入vi的命令模式,如下图。

此时我们需要从命令模式切换到编辑模式,此时只要在键盘上按下a、A、i、I、o、O中任何一个字符即可进入编辑模式,这些字符各自的含义如下:
- a:在当前光标下一位开始编辑
- A:在当前光标所在行行尾开始编辑
- i:在当前光标开始编辑
- I:在当前光标所在行行首开始编辑
- o:在当前光标的下一行开始编辑
- O:在当前光标的上一行开始编辑
这里我们选择按下小写i,在当前光标处开始编辑,按下之后左下角变成了“– 插入 –”,如下图。

注:如果你发现按下i后没有变化,并且出现症状:
- 按键盘上的方向键后终端却显示出ABCD等字符
- backspace(删除)键不起作用
时,请移步至https://blog.csdn.net/a12355556/article/details/120512771,先解决此问题。
言归正传,接下来默认大家的vi/vim编辑器都可以正常使用。
在编辑模式下,我们可以输入任意内容,此处我选择输入lecture 1中示范的代码。输入完成后,按下esc退出编辑模式,如下图:

上图中的示例代码如下:
#include "kernel/types.h"
#include "user/user.h"
int main()
{
char buf[64];
while(1){
int n = read(0,buf,sizeof(buf));
if(n <= 0)
break;
write(1,buf,n);
}
exit(0);
}
此时我们想要保存并退出,只需要直接输入:wq,并按下回车即可,如下图(不用调整光标位置,键入:时光标会自动跳转到底部)

然后关闭终端,你会发现桌面上多了一份copy.c文件,你可以双击确认其中的内容是否和我们刚刚键入的相同,如果一致,那就说明我们创建成功了。


2.在正确的目录下创建代码
由于xv6系统本身并没有编译器的实现,所以我们需要把程序在编译系统时一并编译,因此,我们需要在xv6系统的编译文件夹中加入我们的copy.c文件。对于不同人的主机,xv6系统存储的位置各不相同,所以我们应该把待编译的.c文件创建在正确的相对位置。
我们要找的目录是xv6-labs-2020/user,我们可以在终端中通过cd指令来切换到对应目录,如下图:

此时我们只需要仿照第1步,在该目录下创建一个copy.c文件即可。
3.修改Makefile文件
为了让xv6帮我们一起编译文件,光把文件“给它”还不行,我们要通过修改它的“待编译清单”来“告知它”我们的需求。
首先我们在xv6-labs-2020目录下输入指令:
vi Makefile

按下回车后,我们按下i进入编辑模式,然后往下翻找,找到UPROGS关键词,这下面就是待编译的文件名了,此时我们只需要照葫芦画瓢,在后面接上我们的文件名copy即可:

即插入下面的代码:
$U/_copy\
修改成功后,依旧仿照之前的操作,按下esc,再:wq即可保存退出。
3.编译运行xv6
同样的,我们在xv6-labs-2020目录下输入:make qemu来启动xv6系统:

启动成功后,我们可以输入ls指令,来查看已编译的文件,此时我们就可以看到刚刚添加的copy:

随后,我们就可以仿照课程中老师的操作,直接输入copy即可调用我们的copy程序:

要想退出xv6系统,只需要先按下ctrl+a,然后再按下x即可:
