TOC
Open TOC
ICS PA 0
环境配置
Ubuntu
安装中的分区不太明白。
- 安装了中文输入法和
Typora
。
- 虚拟机与主机使用 Gitee 互联。
工具的使用及相关资源
主要修改一下配置文件,先进行备份:
然后回到家目录:
添加如下内容:
基本的操作如下:
在 hello.c
所在目录下新建一个文件 Makefile
,输入以下内容并保存:
返回命令行,键入 make
,你会发现 make
程序调用了 gcc
进行编译。
若连续多次执行 make
,会得到 make: 'hello' is up to date.
的提示信息。
其中 .PHONY: clean
这一行的作用是防止同目录下的 clean
文件影响 Makefile
的执行。
The workflow above shows how you will use branch in PAs:
- before starting a new PA, new a branch
pa?
and check out to it
- coding in the branch
pa?
(this will introduce lot of modifications)
- after finish the PA, merge the branch
pa?
into master
, and check out back to master
Access GitHub
修改 /etc/hosts
文件如下:
其中 10.0.2.15
通过 ifconfig
命令查看
Compiling and Running NEMU
在 nemu/
文件夹中,我们需要进行 NEMU 项目中的配置系统和项目构建(更多内容详见 PA1 RTFSC)。
执行这一步前,需要先安装 bison
和 flex
NEMU 中的配置系统为于 nemu/tools/kconfig
,它来源于 GNU / Linux 项目中的 kconfig。
kconfig 定义了一套简单的语言,开发者可以使用这套语言来编写“配置描述文件”。
在 NEMU 项目中,“配置描述文件”的文件名都为 Kconfig
,如 nemu/Kconfig
。
当键入 make menuconfig
的时候,背后其实发生了如下事件:
- 检查
nemu/tools/kconfig/build/mconf
程序是否存在,若不存在,则编译并生成 mconf
- 检查
nemu/tools/kconfig/build/conf
程序是否存在,若不存在,则编译并生成 conf
- 运行命令
mconf nemu/Kconfig
,此时 mconf
将会解析 nemu/Kconfig
中的描述,以菜单树的形式展示各种配置选项,供开发者进行选择
- 退出菜单时,
mconf
会把开发者选择的结果记录到 nemu/.config
文件中
- 运行命令
conf --syncconfig nemu/Kconfig
,此时 conf
将会解析 nemu/Kconfig
中的描述,并读取选择结果 nemu/.config
,结合两者来生成如下文件:
- 可以被包含到 C 代码中的宏定义 (
nemu/include/generated/autoconf.h
),这些宏的名称都是形如 CONFIG_xxx
的形式
- 可以被包含到 Makefile 中的变量定义 (
nemu/include/config/auto.conf
)
- ……
项目构建 make
下面是 Makefile
文件的内容,我们对其进行解读:
通过包含 nemu/include/config/auto.conf
,与 kconfig 生成的变量进行关联。
在 nemu/src
及其子目录下存在一些名为 filelist.mk
的文件:
它们会根据 menuconfig 的配置对如下 4 个变量进行维护:
SRCS-y
- 参与编译的源文件的候选集合
SRCS-BLACKLIST-y
- 不参与编译的源文件的黑名单集合
DIRS-y
- 参与编译的目录集合,该目录下的所有文件都会被加入到 SRCS-y
中
DIRS-BLACKLIST-y
- 不参与编译的目录集合,该目录下的所有文件都会被加入到 SRCS-BLACKLIST-y
中
Makefile 会包含项目中的所有 filelist.mk
文件,对上述 4 个变量的追加定义进行汇总,最终会过滤出在 SRCS-y
中但不在 SRCS-BLACKLIST-y
中的源文件,来作为最终参与编译的源文件的集合。
Makefile 的编译规则在 nemu/scripts/build.mk
中定义,见 # Compilation patterns
后的部分:
$@
表示所有参数列表,$<
表示第一个依赖文件,call_fixdep
的调用用于生成更合理的依赖关系(先忽略)。
可以通过输入 make -nB
让 make
程序以“只输出命令但不执行”的方式强制构建目标。
我们截取最开始的一段输出分析,中间用空行分隔开:
对比可知,我们可以了解到 $<
为 src/nemu-main.c
,$@
为 /home/vgalaxy/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/nemu-main.o
,$(CC)
为 gcc
等。
可以根据上述输出结果和 Makefile 反推 $(CFLAGS)
的值是如何形成的。
编译之后是一系列 git
操作,规则在 nemu/scripts/git.mk
中定义。下面是输出:
最后是链接操作:
运行与调试
To run NEMU, type
To debug NEMU with gdb, type
submit
终于收到了 jyy 的 TOKEN。环境变量在 ~/.bashrc
中设置,另外还需要修改 nemu/scripts/git.mk
中的学号和姓名,并安装 curl 🤣。