【无标题】

make流程梳理:

首先,我们

nemu流程梳理:

1、 从nemu-main.c开始,如果我们定义了CONFIG_TARGET_AM,那么我们就am_init_monitor,然后我们通过srand生成一个真正的随机数,MUXDEF的作用可以观看具体实现,但作用是看如果macro是1,则返回x,否则返回y,因此该函数返回0或者time(0),根据其是否定义

2、下一步初始化内存,过程是如果定义了CONFIG_PMEM_MALLOC,则malloc一个0x80000000(暂未实现),之后assert(),否则如果定义了CONFIG_MEM_RANDOM,指向pmem,其中pmem是一个static uint8_t pmem[CONFIG_MSIZE] PG_ALIGN = {};也就是一个物理内存起始地址的,最小对齐单位为4096个字节的数组作为内存,该内存(这里的内存转化没懂),之后通过内存的大小除以单个内存块大小即内存块数,给每一个内存块都设置一个rand,那么这有什么意义呢,然后Log一个物理地址区域为所有的物理区域的映射,注意的是这里PRIx64 是__PRI64_PREFIX "x",也就是lx,所以是以0x%016"l""x"的方式?我们得挨个分析,0x是因为前边我们需要一个0x标识这是一个16进制数字,但是这不会让结果转为16进制,只会让前边多一个0x,足够了,之后呢,我们%016说明其数据宽度为16,然后lx分别表示其他内容,l表示其为long类型,而x则表示为16进制

3、之后我们init了isa,所谓isa即为指令集格式,我们首先将向guest_to_host的RESET_VECTOR中写入img,这里重点是什么是img,这是一些基本的指令,基本上代表的就是我们启动时的基本指令,之后呢,我们会从RESET_VECTOR开始,之后我们就会进入restart,这是什么呢,首先我们的pc会指向RESET_VECTOR,然后将gpr中的s0定义为0。

4、之后我们会进入load_img,首先我们得到bin_start和bin_end,于是我们的size就为end-start,之后我们将其输出,然后什么是guest_to_host呢,其通过将pmem加上paddr,pmem-paddr可以看做是偏移值,偏移值加上内存初始地址,就有了我们现在的地址的模拟器中的地址。

5、之后我们启动的是engine,也就是引擎

首先我们调用的是cpu_exec(-1),也就是说,首先获得现在的g_print的step,也就是看是否现在的传入的n小于最大运行指令数,之后我们看状态state,是end或者abort就报错,否则就给state赋值为running,然后我们就开始看运行时间了, 我们先通过execute指令进行执行,过程中我们要看到下一步是先对n进行递减,之后进行n次exec_once,过程中每次都进行isa_exec_once,其结果是让pc和snpc都置为pc,其中s为我们刚定义的一个指令。然后我们会调用isa_exec_once,这个过程中我们会inst_fetch,这样的时候我们会使用pc进行vaddr_ifetch,这时,我们会将pc中一条len长的指令读取出来,然后pc加上指令长度,之后我们将指令返回,然后我们又将g_nr_guest_inst加一表示执行了一条了,其只是标识作用,然后我们进入trace_and_difftest的函数,这个函数首先看打印的步骤,然后我们将结果放到了inst.val中,然后我们就进入了decode_operand过程中了,其中我们将s->val放入了i中,这样我们就有指令了,下一步就是解码了。最后我们返回了,并将pc的值变为了dnpc的值,之后我们获得了logbuf,p是什么,然后我们这条指令的长度是dnpc-pc,然后我们通过,而指令就是我们前边已经存下的通过ifetch获得的指令,p+是什么,之后我们看max_ilen,这是因为我们因为不是x86,所以长度是4,于是空格的长度就是最大的长度-长度,于是空格就是空格*3+1,这是什么,然后我们就使用了memcpy令p加上ilen,然后我们就有了ifdef,所谓ifdef就是如果macro是1,则输出所有后边的参数,否则什么也不输出,此时我们定义了CONFIG_DEVICE,因此会变成device_update,然后我们看这一步会发生什么,首先我们看我们是不是批处理,然后我们我们cmd_c,在这一过程中,我们还是cpu_exec(-1),不同的是,我们同时还

strcpy之段错误 - xiangzi888 - 博客园 (cnblogs.com)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值