首页 > 其他分享 >PA1:nemu相关讲义

PA1:nemu相关讲义

时间:2024-02-01 17:55:06浏览次数:44  
标签:PA1 编译 src make nemu 报错 文件 讲义

编译中出错:提示没有 <SDL2/SDL.h>头文件

查看错误信息,出错的文件在abstract-machine文件夹里,叫input.c,里面引用了SDL2/SDL.h  这个头文件,但是我只在fceux文件夹里搜到了sdl.h,考虑到linux区分大小写,搜索以后,我觉得我应该是系统缺少了SDL库。

sudo apt install libsdl2-dev   安装以后编译通过,和fc文件夹的sdl.h没有关系。

然后运行make ARCH=native mainargs=k run,经过检查,按键没有问题。

 

在架构选择这一块,我倾向于x86和RISCV-64。时间有限的话,我更倾向于riscv.

ysyx项目文件架构:框架 官方文档 (oscc.cc)

 

nemu/include/generated/autoconf.h  这个文件是一些宏定义相关,nemu/include/config/auto.conf 这个文件是一些配置参数,大致是编译时要选择的编译参数。

make menuconfig打开完整选项

----------------------

插入一下编译c/c++的过程:

1. 预编译,ifdef这样的语句在这一步会被处理,头文件也会被引入。c++的话,constexpr标记的函数也会在这一步处理,生成.i文件

2. 编译  生成.s文件 ,对应即将代码变成汇编文件

3. 汇编 将上一步得到的汇编文件变为二进制文件  对应.o后缀

4. 链接 将.o文件与库链接,生成可执行的.exe文件

------------------

讲义里给出了makefile的规则:

$(OBJ_DIR)/%.o: %.c
  @echo + CC $<
  @mkdir -p $(dir $@)
  @$(CC) $(CFLAGS) -c -o $@ $<
  $(call call_fixdep, $(@:.o=.d), $@)

第一行表示 obj_dir  这个变量对应的目录下,每个.o文件都依赖于同名.c文件

第二行表示命令行输出+CC 和第一个依赖文件的名字  $<表示第一个依赖文件

第三行表示创建目标文件的所在目录  $@表示目标文件  dir $@就是目标文件所在目录

第四行是规则,表示gcc 以CFLAGS参数编译第一个依赖文件,生成目标文件

这三行前面有@,表示这三行不显示出来

最后一行则是调用自定义函数,同时传入两个参数,一个是.o文件对应的.d文件,一个是目标文件

终端会显示的内容:(也就是第四行指令对应内容)

gcc -O2 -MMD -Wall -Werror -I/home/user/ics2023/nemu/include
-I/home/user/ics2023/nemu/src/engine/interpreter -I/home/use
r/ics2023/nemu/src/isa/riscv32/include -O2    -D__GUEST_ISA__
=riscv32  -c -o /home/user/ics2023/nemu/build/obj-riscv32-nem
u-interpreter/src/utils/timer.o src/utils/timer.c

$@ -> /home/user/ics2023/nemu/build/obj-riscv32-nemu-interpreter/src/utils/timer.o
$< -> src/utils/timer.c    剩下的都是CFLAGS

-o表示要指定生成的文件的名字 它和后面紧挨的参数是一起的

----------------------------------

init_monitor这个函数里调用别的函数而不是直接把代码展开,可以让函数看起来更简洁,此外被调用的函数在其他地方也可以进行二次利用。

此外,对于nemu/src/monitor/monitor.c这个文件,针对不同架构,通过宏决定了哪些需要进行编译。

 

检查发现src/isa下根本没有x86这个架构对应文件夹.

在nemu目录下make run以后,报错信息同讲义,提示monitor.c:36:welcome:assertion '0' failed。同时make指令会提示scripts/native.mk:38:run 会提示core dumped

检查montitor.c,发现这一行是assert(0)  断言这么用似乎没什么意义,所以我屏蔽了。

  nemu按q退出。

cpu_exec()这个函数的参数是无符号整数,传入-1,实际上是传入int型最大值,大致相当于while(1)。  

 

关于程序的进入和退出。在进入时,系统会将pc寄存器的值设置为当前程序的首条指令地址。退出时,系统会检测退出码,0就是向系统回报正常退出的信号。然后系统释放掉这个进程,如果有父进程的话,向父进程发一个SIGCHLD信号量,通知子进程结束的消息。

 

假如make run以后,直接在nemu中输入q,那么native.mk:38会提示报错。打开这个mk文件,第38行对应NEMU_EXEC这个变量,这个变量对应 $(BINARY) $(ARGS) $(IMG)

直接退出报错,可能是因为当前还在执行make指令,但是直接退出相当于指令执行失败,导致返回非0值,make报错。   我把这一行变量后面加了个  ||true,这样最终这行返回一定是零值。加上以后,确实不再报错。

 

----------------------------------

makefile的工作原理(个人理解):make指令运行到程序开始运行,并不代表make已经运行结束。nemu里直接退出,导致程序在退出时没有正确返回值,所以make的这一行指令也没有对应到零,进而报错。如果想要不报错,要么用 }}true,要么在这一行指令前加  -   ,表示忽略错误继续执行。

标签:PA1,编译,src,make,nemu,报错,文件,讲义
From: https://www.cnblogs.com/namezhyp/p/17999830

相关文章

  • 《数学分析习题课讲义2.1-2.2》
    ......
  • 我的日立10TB氦气企业盘(序列号:7JH3PA1C)
    日立10TB氦气企业盘(序列号:7JH3PA1C)Disk/dev/sda:9.1TiB,10000831348736bytes,19532873728sectorsDiskmodel:HUH721010ALE601Units:sectorsof1*512=512bytesSectorsize(logical/physical):512bytes/4096bytesI/Osize(minimum/optimal):4096bytes......
  • 新东方在线视频课程资料下载工具,如何在电脑端下载新东方在线视频讲义到本地
    一.安装新东方在线下载器1.获取学无止下载器https://www.xuewuzhi.cn/koolearn_downloader?from=cnblogs2.下载安装后,然后点击桌面快捷方式运行即可。注意:杀毒软件可能会阻止外部exe文件运行,并将其当做成病毒,直接添加信任即可,本软件绝对没有木马病毒。二.使用说明1.学无止......
  • STM32F103:SWJ调试接口设置成普通的IO口——PA13,PA14,PA15,PB3,PB4
    一、STM32调试端口STM32有两种程序调试接口,具体如下:SWD调试接口: PA13、PA14共两个引脚。JTAG调试接口: PA13、PA14、PA15、PB3、PB4共五个引脚。 单片机启动后,初始状态这五个引脚就默认是调试接口。而实际使用中,一般只使用SWCLK、SWDIO这两个引脚用做S......
  • MyCat课程讲义
    1.Mycat概述如今随着互联网的发展,数据的量级也是成指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这个时候NoSQL的出现暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的......
  • 数学最终讲义答案8-16章
    格式:练习题所在页-答案所在页。227-465:235-466:248-466:答案466:255-466:255-467:263-467:279-467:286-468:287-468:294-468:309-468:311-469:315-469:319-469:319-469:320-469:326-470:330-470:330-470:334-470:345-470:356-471:366-471:......
  • 数学最终讲义答案1-8章
    格式:练习题所在页-答案所在页12-454:15-454:24-455:26-455:答案455页笔误:41-456:42-456:59-457:65-458:答案458页笔误:答案458页笔误:86-459:98-459:106-460:118-461:141-462:158-462:答案462页笔误:158-463:182-464:188-464:202-465: ......
  • 前端讲义10_HTTP Request header
    前端讲义10_HTTPRequestheader把Requestheader进行分类,比较清晰记忆。监控打开URLhttps://blog.csdn.net/msh2016Cache头域If-Modified-Since作用:把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。......
  • 数学最终讲义8-17章
    第8章第179页:第8章第180页:第8章第193页:第8章第194页:第8章第211页:第8章第215页:第11章第244页:第11章第247页:第11章第249页:第11章第250页:第11章第257页:第11章第269页:第12章第289页:第13章第304页:第13章第306页:第13章第317页:第14章第325页:第15章第350......
  • 1:疯狂python讲义
    一:用户输入一个字符串和一个子串,程序打印出子串在字符串中出现的次数(从左到右),例如给定'abcdcdc'和'cdc',cdc出现2次a,b=input('请输入字符串:'),input('请输入字符子串:')a_len=len(a)b_len=len(b)count=0foriinrange(a_len):ifa[i:i+b_len]==b:count+=1print(......