南京大学-软件分析(PA)

前言

这个课程据说挺不错的,于是慕名而来,这里作为后续学习解答的传送门(会做吗?会做的!QAQ)

资源索引

B站-合集·南京大学《软件分析》课程2020
南京大学 计算机科学与技术系 计算机系统基础 课程实验 (PA)(这个是近几年的课程,我选的是2024年)
GDB调试工具深入指南:从基础到高级

PA-0

Installing GNU/Linux

虽然要求的是物理机,但是我用的是wsl2

First Exploration with GNU/Linux

打开终端和关闭还是比较简单的,故直接跳过

Installing Tools

第一个步骤是换源(这里采用的是清华源),然后再更新,这些网络上都有相应教程,再安装必需的工具,还是比较简单的。

Configuring vim

vim我在之前并没有掌握,因此在这次PA课程里我也会尽量采用vim来编写。
part2讲的是vim的语法高亮和一些个性化设置,我试着自己配置了一下,效果还不错。剩下的得等以后开发时再配置了。

More Exploration

让我用vim写一个helloworld和Makefile,还能接受,gdb的使用确实不会,得赶紧看书。。。。剩下的就只是配置tmux了,他是用来调多个终端的。
测试效果
结果还是挺不错的

Getting Source Code for PAs

clone完仓库是一系列配置信息,但是我不是nju的学生,所以我就跳过了这一部分(然而又回来完成了。。。),在编译nemu中遇到了好多问题
fish状态下不能执行source /.bashrc
make menuconfig后执行make报错
显示没有readline.h,处理中结果github端口22又不能用,去改了配置。。
最终结果发现是因为我之前的依赖没有安装完

sudo apt-get install libreadline-dev

输入这个就好了

PA1

配置ccache,就是简单在bashrc里面写

export PATH=/usr/lib/ccache$PATH

选用的是risv32,下一个任务就是去删代码了
这里我是把整个welcome()函数给删了,值得注意的是下面的代码段落有调用两次welcome()函数,所以我一并给它删减了

修复q

RTFSC,关闭nemu是与nemu_state.state NEMU_QUIT这个式子有关系即

int is_exit_status_bad() {
        printf("nemu_state =
  int good = (nemu_state.state == NEMU_END && nemu_state.halt_ret == 0) ||
    (nemu_state.state == NEMU_QUIT);
  return !good;
}

所以我们在cmd_q里面加一句

nemu_state.state == NEMU_QUIT;

就可以了

si指令实现

采用的是strtok函数进行分词,用atoi进行字符串向整型的转化(需要<stdlib.h>库的支持)最后丢给cpu_exec函数来模拟运行。

static int cmd_si(char *args){
    char *arg=strtok(NULL," ");
    int si_number;
    if(arg == NULL) {si_number=1; }
    else {si_number=atoi(arg);}
    cpu_exec(si_number);
    return 0;
  }

然而这个代码太丑了,接下来是高手的美丽代码:

static int cmd_si(char *args){
    int step = 0;
    if(args == NULL)
        step = 1;
    else
        sscanf(args,
    cpu_exec(step);
    return 0;
}

《南京大学-软件分析(PA)》有2条评论

发表评论