Update chapter3_traps.md

pull/1/head
Zhiyuan Shao 4 years ago
parent 5082e214d6
commit 5b6385ab7f

@ -447,26 +447,26 @@ Disassembly of section .text:
...
```
通过阅读该文件我们看到构建过程的最终目标是第115行的all而它有两个依赖目标$(KERNEL_TARGET)和$(USER_TARGET)。我们从右往左看,$(USER_TARGET)的定义在72行对应的是$(OBJ_DIR)/app_helloworld (即./obj/app_helloworld。构建$(USER_TARGET)的规则在第105--108行其中第105行说明$(USER_TARGET)的构建依赖$(OBJ_DIR)$(UTIL_LIB)$(USER_OBJS)以及$(USER_LDS)这4个目标。
通过阅读该文件我们看到构建过程的最终目标是第115行的all而它有两个依赖目标`$(KERNEL_TARGET)``$(USER_TARGET)`。我们从右往左看,`$(USER_TARGET)`的定义在72行对应的是`$(OBJ_DIR)/app_helloworld` (即./obj/app_helloworld。构建`$(USER_TARGET)`的规则在第105--108行其中第105行说明`$(USER_TARGET)`的构建依赖`$(OBJ_DIR)``$(UTIL_LIB)``$(USER_OBJS)`以及`$(USER_LDS)`这4个目标。
- $(OBJ_DIR)它对应的动作是建立5个目录第75--80行./obj./obj/util./obj/spike_interface./obj/user以及./obj/kernel
- $(UTIL_LIB)它的定义在第33行它对应的是$(OBJ_DIR)/util.a而它的编译规则在第90行--第93行依赖$(UTIL_OBJS)的处理。而后者的定义在第30行对应`$(addprefix $(OBJ_DIR)/, $(patsubst %.c,%.o,$(UTIL_CPPS)))` ,需要将$(UTIL_CPPS)也就是util/*.c见第27行全部编译成.o文件并链接为静态库第92行的动作
- $(USER_OBJS)它对应第70行的是`$(addprefix $(OBJ_DIR)/, $(patsubst %.c,%.o,$(USER_CPPS)))`,需要将$(USER_CPPS)也就是user/*.c都编译为.o文件具体的编译动作由82--84行完成
- $(USER_LDS)它对应见第66行user/user.lds由于后者已经存在于源代码树中所以不会导致任何动作。
- `$(OBJ_DIR)`它对应的动作是建立5个目录第75--80行./obj./obj/util./obj/spike_interface./obj/user以及./obj/kernel
- `$(UTIL_LIB)`它的定义在第33行它对应的是`$(OBJ_DIR)/util.a`而它的编译规则在第90行--第93行依赖`$(UTIL_OBJS)`的处理。而后者的定义在第30行对应`$(addprefix $(OBJ_DIR)/, $(patsubst %.c,%.o,$(UTIL_CPPS)))` ,需要将`$(UTIL_CPPS)`也就是util/*.c见第27行全部编译成.o文件并链接为静态库第92行的动作
- `$(USER_OBJS)`它对应第70行的是`$(addprefix $(OBJ_DIR)/, $(patsubst %.c,%.o,$(USER_CPPS)))`,需要将`$(USER_CPPS)`也就是user/*.c都编译为.o文件具体的编译动作由82--84行完成
- `$(USER_LDS)`它对应见第66行user/user.lds由于后者已经存在于源代码树中所以不会导致任何动作。
以上构造$(USER_TARGET)所依赖的目标全部完成后构造过程将执行第105--108行的动作即将user/目录下通过编译出来的.o文件与util中编译和链接出来的静态库文件一起链接生成采用RISC-V指令集的可执行文件。同时链接过程采用user/user.lds脚本以指定生成的可执行文件中的符号所对应的逻辑地址。
以上构造`$(USER_TARGET)`所依赖的目标全部完成后构造过程将执行第105--108行的动作即将user/目录下通过编译出来的.o文件与util中编译和链接出来的静态库文件一起链接生成采用RISC-V指令集的可执行文件。同时链接过程采用user/user.lds脚本以指定生成的可执行文件中的符号所对应的逻辑地址。
完成$(USER_TARGET)的构造后我们回到第115行继续$(KERNEL_TARGET)目标的构造。它的定义在100-103行可以看到它又有5个依赖目标$(OBJ_DIR)$(UTIL_LIB)$(SPIKE_INF_LIB)$(KERNEL_OBJS)和$(KERNEL_LDS)。其中$(OBJ_DIR)、$(UTIL_LIB)在构造$(USER_TARGET)目标时就已经顺带地实现了,剩下的$(KERNEL_LDS)也是已经存在的文件。这样,就剩下两个“新”目标:
完成`$(USER_TARGET)`的构造后我们回到第115行继续$(KERNEL_TARGET)目标的构造。它的定义在100-103行可以看到它又有5个依赖目标`$(OBJ_DIR)``$(UTIL_LIB)``$(SPIKE_INF_LIB)``$(KERNEL_OBJS)``$(KERNEL_LDS)`。其中`$(OBJ_DIR)``$(UTIL_LIB)`在构造`$(USER_TARGET)`目标时就已经顺带地实现了,剩下的`$(KERNEL_LDS)`也是已经存在的文件。这样,就剩下两个“新”目标:
- $(SPIKE_INF_LIB)它的定义在第62行对应$(OBJ_DIR)/spike_interface.a文件对应的构造动作在第95--98行又依赖$(OBJ_DIR)、$(UTIL_OBJS)和$(SPIKE_INF_OBJS)这3个目标。其中$(OBJ_DIR)和$(UTIL_OBJS)两个目标我们在之前构造$(USER_TARGET)时已经解决,剩下的$(SPIKE_INF_OBJS)目标对应的是`$(addprefix $(OBJ_DIR)/, $(patsubst %.c,%.o,$(SPIKE_INF_CPPS)))`将导致$(SPIKE_INF_CPPS)也就是spike_interface/*.c被对应地编译成.o文件。最后第96--98行的动作会将编译spike_interface目录下文件生成的.o文件链接为静态库$(OBJ_DIR)/spike_interface.a文件
- $(KERNEL_OBJS)它对应的定义在第49--50行内容很简单就是kernel下的所有汇编.S文件和所有的.c文件。处理该依赖构造目标会将kernel子目录下的所有汇编和C源文件编译成对应的.o文件。
- `$(SPIKE_INF_LIB)`它的定义在第62行对应`$(OBJ_DIR)/spike_interface.a`文件对应的构造动作在第95--98行又依赖`$(OBJ_DIR)``$(UTIL_OBJS)``$(SPIKE_INF_OBJS)`这3个目标。其中`$(OBJ_DIR)``$(UTIL_OBJS)`两个目标我们在之前构造`$(USER_TARGET)`时已经解决,剩下的`$(SPIKE_INF_OBJS)`目标对应的是`$(addprefix $(OBJ_DIR)/, $(patsubst %.c,%.o,$(SPIKE_INF_CPPS)))`将导致`$(SPIKE_INF_CPPS)`也就是spike_interface/*.c被对应地编译成.o文件。最后第96--98行的动作会将编译spike_interface目录下文件生成的.o文件链接为静态库`$(OBJ_DIR)/spike_interface.a`)文件;
- `$(KERNEL_OBJS)`它对应的定义在第49--50行内容很简单就是kernel下的所有汇编.S文件和所有的.c文件。处理该依赖构造目标会将kernel子目录下的所有汇编和C源文件编译成对应的.o文件。
以上依赖目标全部构造完毕后回到第101--103行的$(KERNEL_TARGET)目标所对应的动作将编译kernel目录下的源文件所得到的.o文件与$(OBJ_DIR)/spike_interface.a进行链接并最终生成我们的代理内核$(OBJ_DIR)/riscv-pke。至此PKE实验所需要的代码构造完毕。总结一下这个构造过程是
以上依赖目标全部构造完毕后回到第101--103行的`$(KERNEL_TARGET)`目标所对应的动作将编译kernel目录下的源文件所得到的.o文件与`$(OBJ_DIR)/spike_interface.a`进行链接,并最终生成我们的代理内核`$(OBJ_DIR)/riscv-pke`。至此PKE实验所需要的代码构造完毕。总结一下这个构造过程是
- 1构造util目录下的静态库文件$(OBJ_DIR)/util.a
- 2构造应用程序得到$(OBJ_DIR)/app_helloworld
- 3构造$(OBJ_DIR)/spike_interface.a即spike所提供的工具库文件
- 4最后构造代理内核$(OBJ_DIR)/riscv-pke。
- 1构造util目录下的静态库文件`$(OBJ_DIR)/util.a`
- 2构造应用程序得到`$(OBJ_DIR)/app_helloworld`
- 3构造`$(OBJ_DIR)/spike_interface.a`即spike所提供的工具库文件
- 4最后构造代理内核`$(OBJ_DIR)/riscv-pke`

Loading…
Cancel
Save