南京大学计算机课程基础实验-PA1笔记-2022-08-10
PA0比较简单,就不再重复说明。
从图上可以知道,我们的关键是要从Mon读取Mem和Reg的信息
PA1.RTFSC
apt-get install ccache
which gcc
可以把gcc编译结果缓存,可跳过重复的编译过程
make -nB
, 它会让 make
程序以"只输出命令但不执行"的方式强制构建目标
llvm推荐用PA里面说到的11先试试看,实在不行想要升级可参考:https://blog.csdn.net/weixin_44200757/article/details/122725577
最简单的计算机称为"图灵机"(Turing Machine, TRM)
- 结构上, TRM有存储器, 有PC, 有寄存器, 有加法器
- 工作方式上, TRM不断地重复以下过程: 从PC指示的存储器位置取出指令, 执行指令, 然后更新PC
BIOS是固化在ROM/Flash中的, 它们都是非易失性的存储介质, BIOS中的内容不会因为断电而丢失.
因此在真实的计算机系统中, 计算机启动后首先会把控制权交给BIOS, BIOS经过一系列初始化工作之后, 再从磁盘中将有意义的程序读入内存中执行. 对这个过程的模拟需要了解很多超出本课程范围的细节, 我们在PA中做了简化: 采取约定的方式让CPU直接从约定的内存位置开始执行.
在GNU/Linux中, 你可以很容易得知操作系统在背后做了些什么. 键入 sudo dmesg
, 就可以输出操作系统的启动日志, 操作系统的行为一览无余.
你需要结合PA1 RTFSC内容来NEMU的框架代码.
如果你不知道"怎么才算是看懂了框架代码", 你可以先尝试进行后面的任务. 如果发现不知道如何下手, 再回来仔细阅读这一节
cpu
先驱为CPU创造了一个特殊的计数器, 叫"程序计数器"(Program Counter, PC). 在x86中, 它有一个特殊的名字, 叫 EIP
(Extended Instruction Pointer).
while (1) {
从PC指示的存储器位置取出指令;
执行指令;
更新PC;
}
第一项工作就是将一个内置的客户程序读入到内存中
先打开:nemu/src/isa/$ISA/init.c
monitor会调用 init_isa()
函数(在 nemu/src/isa/$ISA/init.c
中定义), 来进行一些ISA相关的初始化工作.
第一项工作就是将一个内置的客户程序读入到内存中.
- 内存是什么?C语言中我们就很自然地使用一个
uint8_t
类型的数组来对内存进行模拟. NEMU默认为客户计算机提供128MB的物理内存(见nemu/src/memory/paddr.c
中定义的pmem
(如果找不到看看.h内有128*1024*1024) - 需要将客户程序读入到内存的什么位置?我们需要一种方式让客户计算机的CPU知道客户程序的位置. 我们采取一种最简单的方式: 约定. 具体地, 我们让monitor直接把客户程序读入到一个固定的内存位置