wheatfox 2024.11
https://nju-projectn.github.io/ics-pa-gitbook/ics2024/
实验环境:
Linux debian 6.1.0-23-arm64 #1 SMP Debian 6.1.99-1 (2024-07-15) aarch64 GNU/Linux
host: macOS 15 Parallels Desktop Debian 虚拟机 ARM64 架构
guest: NEMU目标架构为 riscv64
ssh部分:
ssh-keygen -t ed25519 -C "[email protected]"
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
然后在github添加这个新的ssh key即可通过git拉取pa仓库
git clone -b 2024 [email protected]:NJU-ProjectN/ics-pa.git ics2024
cd ics2024
git branch -m master
bash init.sh nemu
bash init.sh abstract-machine
git config --global core.editor vim
git config --global color.ui true
git remote set-url origin [email protected]:enkerewpo/ics-pa2024.git # using ssh :)
git push origin --all
https://jyywiki.cn/ICS/2021/labs/PA1.html
make menuconfig编译nemu
$(OBJ_DIR)/%.o: %.c
@echo + CC $<
@mkdir -p $(dir $@) // 其中 $< 是一个自动变量,表示第一个依赖文件,即原始的 .c 源文件, $(dir $@) 取 $@(即目标文件)的目录部分
@$(CC) $(CFLAGS) -c -o $@ $<
$(call call_fixdep, $(@:.o=.d), $@) // $(@:.o=.d) 将 .o 文件名替换为 .d 文件名,生成相应的依赖文件,用于记录源文件的依赖关系(例如头文件)
$<:表示第一个依赖文件(即规则冒号右边的第一个文件),通常用于获取当前被处理的源文件。例如在编译 .c 文件时,它指代 .c 文件的路径。$(word 2, $^):提取第二个依赖文件,以此类推。
$@:表示当前的目标文件(即规则冒号左边的文件),通常用于获取当前生成的目标文件名。例如在编译 .c 文件到 .o 文件时,$@ 指代生成的 .o 文件路径。
$^:所有依赖文件,表示规则中冒号右侧列出的所有依赖文件,去重处理。
// Macro testing
// See <https://stackoverflow.com/questions/26099745/test-if-preprocessor-symbol-is-defined-inside-macro>
#define concat_temp(x, y) x ## y
#define concat(x, y) concat_temp(x, y)
// Select the second argument from the parameter list
#define CHOOSE2nd(a, b, ...) b
// Conditional selection based on whether a comma exists
#define MUX_WITH_COMMA(contain_comma, a, b) CHOOSE2nd(contain_comma a, b)
// Macro property selector using concatenation
#define MUX_MACRO_PROPERTY(p, macro, a, b) MUX_WITH_COMMA(concat(p, macro), a, b)
// Define placeholders for properties of macros
#define __P_DEF_0 X, // 如果macro=1,则会被替换为带逗号的'X,',在之后被choose2nd选中X,如果没匹配上则直接变成__P_DEF_macro,没有逗号所以选择Y
#define __P_DEF_1 X,
#define __P_ONE_1 X,
#define __P_ZERO_0 X,
// Define selection functions based on macro properties
#define MUXDEF(macro, X, Y) MUX_MACRO_PROPERTY(__P_DEF_, macro, X, Y)
#define MUXNDEF(macro, X, Y) MUX_MACRO_PROPERTY(__P_DEF_, macro, Y, X)
#define MUXONE(macro, X, Y) MUX_MACRO_PROPERTY(__P_ONE_, macro, X, Y)
#define MUXZERO(macro, X, Y) MUX_MACRO_PROPERTY(__P_ZERO_, macro, X, Y)