#
思考题
Thinking 2.1
在C程序中,指针变量存储的地址是虚拟地址。MIPS汇编程序中lw和sw使用的是虚拟地址。
Thinking 2.2
1.
用宏实现链表的好处:可重用度高,避免了重复编写,使得源程序更加简洁、易读,便于重复利用。
2.
插入:
单向列表在链表中插入只需要修改两个指针。在链表头和链表尾插入,只需要修改一个指针
循环列表需要修改无论何处插入,都需要修改两个指针。
双向链表,在链表中插入需要修改四个指针,在头尾插入需要修改2两个指针。
Thinking 2.3
C为正确的
Thinking 2.4
1.
引用自网络上对ASID的解释:ASID唯一标识每个进程,并用于为该进程提供地址空间保护,当TLB尝试解析虚拟页码时,它确保当前正在运行的进程的ASID与与虚拟页面关联的ASID匹配。 如果ASID不匹配,则将该尝试视为TLB未命中 。
对于不同的进程,其相同的虚拟地址可能对应不同的空间,因此对于不同程序,TLB需要进行区分。因此引入ASIAD,在查找TLB,需要传入虚地址和对应的ASID,这样才能正确查找到对应的物理地址。因此ASID是必不可缺的。
2.
ASID 为11-6位,共6位,故能容纳不同地址空间的最大数量为64。
Thinking 2.5
1.
tlb_invalidate调用了tlb_out
2.
根据当前进程的状态,以虚拟地址和进程的ASID
值为参数调用tlb_out
完成对TLB
对应内容的清除
3.
LEAF(tlb_out) .set noreorder mfc0 t0, CP0_ENTRYHI //$t0 = $$EntryHi mtc0 a0, CP0_ENTRYHI //$EntryHi = $a0 nop /* Step 1: Use 'tlbp' to probe TLB entry */ /* Exercise 2.8: Your code here. (1/2) */ tlbp //利用EntryHi寄存器中值查找对应表项入口,并存入index寄存器 nop /* Step 2: Fetch the probe result from CP0.Index */ mfc0 t1, CP0_INDEX... read more
Lab1 实验报告
一、思考问题
Thinking 1.1
Thinking 1.1 请阅读附录中的编译链接详解,尝试分别使用实验环境中的原生 x86 工具 链(gcc、ld、readelf、objdump 等)和 MIPS 交叉编译工具链(带有 mips-linux-gnu前缀),重复其中的编译和解析过程,观察相应的结果,并解释其中向 objdump 传入的参 数的含义。
readelf读取目标文件相关信息。
x86下解析结果(main函数)
hello1.o: 文件格式 elf64-x86-64 Disassembly of section .text: 0000000000000000 <main>: 0: f3 0f 1e fa endbr64 4: 55 push %rbp 5: 48 89 e5 mov %rsp,%rbp 8: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # f <main+0xf> f: 48 89 c7 mov %rax,%rdi 12: e8 00 00 00 00 call 17 <main+0x17> 17: b8 00 00 00 00 mov $0x0,%eax 1c: 5d pop %rbp 1d: c3 ret
Lab0 实验报告
Thinking 0.1
Untracked.txt
Staged.txt
Modified.txt
三个文件如上图所示。
对于Modified.txt,结果与第一次执行add命令之前的status完全不一样。未执行add之前,README位于未追踪Untracker区域。而add且commit之后再次修改,README处于未暂存的Modified区域。
Thinking 0.2
add the file:对应git add 命令,可以文件提交到暂存区
stage the file:也对于git add,但是针对于Modified区域文件
commit:对应git commit命令,提交修改。
Thinking 0.3
1.
使用
git checkout -- print.c
将print.c从暂存区恢复到工作区
2.
使用
git checkout HEAD print.c
将print.c从HEAD恢复到暂存区和工作区
3.
使用
git rm --cached print.c
Thinking 0.4
三次提交后的说明:
reset后的log:
执行