2024 NJU PA0

PA是Project Assignment的缩写,是个很草率的名字。参考文档位于此处,环境配置跟着文档一步步来就好。

1. 下载源代码

使用git将项目克隆到本地:

git clone -b 2024 https://github.com/NJU-ProjectN/ics-pa.git njupa

项目将会下载到文件夹njupa中(改成其它名字也可以)。打开这个文件夹,里面只有以下三个文件:

  • init.sh
  • Makefile
  • README.md

init.sh是一段脚本,用于下载其它项目。首先切换git分支为master:

git branch -m master

接下来,使用init.sh下载nemuabstract-machine:

bash init.sh nemu
bash init.sh abstract-machine


遇到问题了吗? 如果提示没有权限,可修改init.sh第21行:

git clone -b $2 git@github.com:$1.git $3

修改为:

git clone -b $2 https://github.com/$1.git $3

现在应该可以正常运行。

 

完成后,可以看到里面多了3个文件夹:

  • abstract-machine
  • fceux-am
  • nemu

提示

如果你的网络经常抽风,但现在网很好,可以把init.sh中另外几个项目也克隆下来,即am-kernels, nanos-litenavy-apps(bash init.sh XXX即可).

根据教程提示,脚本init.sh在配置文件.bashrc里添加了变量NEMU_HOMEAM_HOME, 分别是nemuabstract-machine这两个目录的绝对路径。因此,之后不要随便移动项目的位置。

如果安装了诸如zsh之类的终端配置,写入到.bashrc的配置不一定会起作用。此时需要将NEMU_HOMEAM_HOME添加到相应的配置文件(例如.zshrc)中。打开.bashrc(vim ~/.bashrc), 将末尾的NEMU_HOME, AM_HOME复制到其它配置文件(例如~/.zshrc)即可。

(如果克隆了所有项目,别忘了还有个NAVY_HOME变量。)

现在,可以通过:

cd $NEMU_HOME

快速进入nemu所在的目录。

 

2. 完成PA0

在做PA0之前,创建一个名为pa0的分支。执行以下指令:

git checkout -b pa0

这个指令做了两件事情:创建分支pa0并切换到这个分支。

 

接下来需要修改项目根目录下的Makefile文件(不是nemu目录下的Makefile). 打开这个文件,头两行就是需要修改的学号和姓名。接下来需要配置中文输入法,如果一时半会搞不清楚,复制粘贴也行,反正之后也用不到中文输入。

之后,就可以编译并运行nemu了。首先进入nemu目录:

cd $NEMU_HOME

执行以下命令:

make menuconfig

提示

这个是menuconfig(menu config, 即菜单配置),不是nemu(Nju EMUlator).

会弹出一个UI界面:

按方向键移动,按Enter键确认。目前无需修改,移动到Exit选项后,按下Enter键退出即可。

 

最后,执行:

make

完成编译。执行过程中可能会报以下错误:

不用担心,这和之前是一样的毛病,需要将git@github.com:替换为https://github.com/. 根据报错信息,修改$NEMU_HOME/tools/capstone/Makefile的第18行和

$NEMU_HOME/tools/spike-diff/Makefile的第18行。

提示

如果出现Makefile:18: *** recipe commences before first target.  Stop. 试着修改这一行前面的缩进,例如将Tab改成空白键。

 

如果没有报错,接下来就可以运行nemu:

make run

得到如下输出:

标红的“Welcome to riscv32-NEMU!”提示我们,当前模拟的是RISC-V32指令集。

 

这句话的下面还有个报错:它提到,在src/monitor/monitor.c的第36行,插了句断言。打开此文件:

vim src/monitor/monitor.c

删除第36行(第35行的Log(XXX)也可以删去)。

提示

assert(expr)中的exprfalse时,将终止程序。

之后重新编译:

make clean
make run

OK,一切顺利!可以看到最后一行有个(nemu)

光标闪烁,似乎在等你输入些什么。输入q, 程序终止:

最后,将pa0分支的修改合并到master分支:

make clean
git checkout master
git merge pa0

至此,PA0大功告成!

posted @ 2024-09-21 10:59  overxus  阅读(90)  评论(0编辑  收藏  举报