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

PA0

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

PA1

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)