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
下载nemu
和abstract-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-lite
和navy-apps
(bash init.sh XXX
即可).
根据教程提示,脚本init.sh
在配置文件.bashrc
里添加了变量NEMU_HOME
和AM_HOME
, 分别是nemu
和abstract-machine
这两个目录的绝对路径。因此,之后不要随便移动项目的位置。
如果安装了诸如
zsh
之类的终端配置,写入到.bashrc
的配置不一定会起作用。此时需要将NEMU_HOME
和AM_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)
中的expr
为false
时,将终止程序。
之后重新编译:
make clean
make run
OK,一切顺利!可以看到最后一行有个(nemu)
:
光标闪烁,似乎在等你输入些什么。输入q
, 程序终止:
最后,将pa0
分支的修改合并到master
分支:
make clean
git checkout master
git merge pa0
至此,PA0大功告成!