一生一芯 预学习阶段 PA1--RTFSC中“make menuconfig”

Enable debug information

问题如上。

在menuconfig将 Enable debug information 选项打开,编译时会产生什么变化?

从选项上看是打开了支持调试的选项,编译时应该是添加了支持编译的参数,具体看代码。

首先,我们先看 make menuconfig 这条命令做了什么?

找到 scripts/config.mk 文件,看到如下:

menuconfig: $(MCONF) $(CONF) $(FIXDEP)
	$(Q)$(MCONF) $(Kconfig)
	$(Q)$(CONF) $(silent) --syncconfig $(Kconfig)

这部分的作用:

1、首先生成conf、mconf、fixdep文件;

2、运行 mconf 程序,传入 $(Kconfig) 文件;

3、运行 conf 程序根据用户在 menuconfig 中的选择,同步 .config 文件,生成auto.conf文件

接下来在 tools 文件夹下的 .config 文件,include 下的 auto.conf文件,以及可以看到:

CONFIG_CC_DEBUG=y

可以看到DEBUG选项被置成y;

这时就可以知道在make时是将该选项加入了编译。

因此在nemu的文件夹下找到Makefile文件,有如下:

.
.
.
-include $(NEMU_HOME)/include/config/auto.conf
-include $(NEMU_HOME)/include/config/auto.conf.cmd
.
.
.
CFLAGS_BUILD += $(if $(CONFIG_CC_DEBUG),-Og -ggdb3,)
.
.
.

得知首先是载入了auto.conf文件,之后判断 CONFIG_CC_DEBUG ,如果为y则将 -Og -ggdb3 加入到 CFLAGS_BUILD 中,即加入到编译选项中,打开了调试支持的选项。

键入q退出

首先,看源代码能看出以下的函数调用顺序:

main();[nemu_main.c]  →  engine_start();[ src/engine/interpreter/init.c ]  → sdb_mainloop();[src/monitor/sdb.c]  →  cmd_q();[src/monitor/sdb.c]

然后倒过来一步一步往上看:

cmd_q();

static int cmd_q(char *args) {
  return -1;
}

cmd_q 就是直接返回“-1”;

sdb_mainloop();

int i;
    for (i = 0; i < NR_CMD; i ++) {
        if (strcmp(cmd, cmd_table[i].name) == 0) {
            if (cmd_table[i].handler(args) < 0) { return; }
            break;
        }
    }

当 cmd 与 cmd_table[i].name 匹配时,执行 cmd_table[i].handler(args) 函数,即 cmd_q 函数;有上面可知 cmd_q 返回“-1”,即 cmd_table[i].handler(args) < 0 成立;然后return到调用它的函数engine_start(),

void engine_start() {
#ifdef CONFIG_TARGET_AM
  cpu_exec(-1);
#else
  /* Receive commands from user. */
  sdb_mainloop();
#endif

接着返回到main()函数。

int main(int argc, char *argv[]) {
  /* Initialize the monitor. */
#ifdef CONFIG_TARGET_AM
  am_init_monitor();
#else
  init_monitor(argc, argv);
#endif

  /* Start engine. */
  engine_start();

  return is_exit_status_bad();
}

而main函数返回了is_exit_status_bad();函数

再打开is_exit_status_bad();函数

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

这是nemu的退出状态的判断;

运行程序时,nemu_state的状态是NEMU_END且程序正常结束halt_ret = 0时,或者没有运行程序时nemu_state = NEMU_QUIT时表示程序需要退出,此时good = 1,表示程序正常退出。

当good = 0时,程序就是非正常退出。

当我们在终端输入q时,因为没有运行程序无法改变nemu_state的状态为NEMU_END且无法将halt_ret置零。

我们在终端输入q时属于没有运行程序,应该将nemu_state的状态变为NEMU_QUIT即可正常退出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值