Lab5实验报告
思考题Thinking 5.1 引发问题:外设数据更新在缓存写入之后,因此若通过kseg0读入,会导致缓存部分数据在外设数据更新之后写入,导致数据丢失。 设备区别:串口设备访问频繁,IDE磁盘访问频率低,更像cache和内存的区别。 Thinking 5.2 文件结构体的定义: 12345678910struct File { char f_name[MAXNAMELEN]; // filename uint32_t f_size; // file size in bytes uint32_t f_type; // file type uint32_t f_direct[NDIRECT]; uint32_t f_indirect; struct File *f_dir; // the pointer to the dir where this file is in, valid only in memory. char f_pad[FILE_STRUCT_SIZE - MAXNAMELEN - (3 + NDIRECT) * 4 - sizeof(void *)];}...
Lab4实验报告
思考题Thinking 4.1 进入内核态时首先使用SAVE_ALL函数将sp寄存器数据存入k0、k1中,同时使用sp的数据将通用寄存器数据压栈,存入环境控制块中,再次使用时将其出栈即可。 不可以,在调用过程中,将系统调用号存入了a0,因此寄存器中数据发生了改变。a1-a3寄存器没有显式改变,但也未规定不可以发生改变,因此出于正确性考虑,最优方法通过栈中数据使用。 函数中所有数据来源均是环境的数据栈,而数据栈中的数据均是在调用时传入的,因此sys函数与msyscall中参数相同。 修改了Trapframe->epc += 4,保证返回用户态时可以执行下一条指令;修改了Trapframe->regs[2] = returnRes,保证v0寄存器中存储返回结果。 Thinking 4.2 在设定env的各项参数时有可能出现错误,导致未正确设定env_id,这种env是不可以使用的。该函数在构建进程和查询使用进程的过程中均有使用。如果缺少判断,在实际使用时有可能出现通过envid寻找不到相应env的情况。 Thinking 4.3 (++i) << (1...
Lab3实验报告
思考题Thinking 3.1 UVPT是kuseg保存用户当前进程页表信息的虚拟地址区,e->env_pgdir是进程页目录对应的物理地址。PADDR(e->env_pgdir) | PTE_V将对应页目录物理地址转换为页表项物理地址并赋予页表有效性信息,存入当前进程对应的pgdir中。 Thinking 3.2 void *data主要在函数load_icode_mapper、load_icode、load_elf中直接使用或间接涉及。这个参数不可以去除,在产生mapper的时候,可能需要多种额外数据辅助映射,因此需要添加。 Thinking 3.3 从binary无法获得ehdr 从binary + ph_off无法获得ph或获得的ph->p_type是PT_LOAD Thinking 3.4 虚拟地址 Thinking 3.5 0,1,2,3号异常函数均在/kern/genex.S文件中实现 0号异常使用汇编程序,1,2,3号异常函数均使用宏定义进行描述 Thinking...
Lab2实验报告
思考题Thinking 2.1 编写c程序时,指针变量存储的地址是虚拟地址; 编写汇编程序时,lw、sw指令使用的是虚拟地址。 Thinking 2.2 链表操作多项操作具有重复性,使用宏定义封装部分代码,并在链表操作时多次使用,可以大大提高可重用性和简便性。 不同链表比较: 单向链表:可以很好的顺序进行,但是不可以访问当前元素之前的元素; 双向链表:既可以正向进行,也可以逆向进行,可以直接访问当前元素之前的和之后的元素,性能较好; 循环链表:可以很好的顺序进行,但是不可以直接访问当前元素之前的元素,需要循环查找(单向循环列表,双向循环列表性能与普通双向链表相当); 本实验中设计的双向链表与经典双向链表不同,本实验中链表不能访问上一个元素,只能访问上一个元素的next指针;即本实验中链表无法访问上一个元素,只能改变上一个元素的连接关系。 Thinking 2.3按照实验设计,选择C选项设计方案最佳: 123456789101112struct Page_list{ struct { struct { ...
Lab1实验报告
思考题Thinking 1.1 x86原生工具链和mips交叉编译工具链对比: x86原生工具链: 编译但未链接文件x86程序: 链接后文件x86程序: mips交叉编译工具链: 编译但未链接mips程序: 链接后mips程序: objdump传入参数: -d:—disassemble[=symbol],反汇编特定指令机器码的节; -D:—disassemble-all,反汇编全部节代码; -S:—source,代码段反汇编同时,将反汇编代码和源代码交替显示; -g:—debugging,显示调试信息; -l:—line-numbers,代码段反汇编同时,显示反汇编代码行数。 Thinking 1.2 解析/target/mos: readelf解析readelf文件和hello文件:可见有多项因素会影响文件是否会被自定义readelf解析,如是大端项还是小端项,如文件位数(32位或64位) Thinking...
Lab0实验报告
思考题Thinking 0.1 git commit -m "22373347" 不一样,第一次执行命令之前README.txt文件是新增文件,执行之后暂存区以含有该文件,所以再次执行会显示为修改后文件。 Thinking 0.2 add the file对应git add stage the file对应git add commit对应git commit Thinking 0.3 git checkout -- print.c git reset HEAD print.c + git checkout -- print.c git rm --cached hello.txt Thinking 0.4git reset --hard HEAD^和git reset --hard <hash>两条命令都可以进行回溯,其中HEAD^会回溯到上一条提交记录,<hash>会回溯到哈希值所指的提交记录;使用哈希值可以回溯到老版本,也可以在回溯到老版本之后重新回溯到新版本。 Thinking 0.5 Thinking...
面向对象课程总结
架构设计思维演进经过整个课程四个单元迭代式的学习演进,笔者在架构设计方面学到了很多,最重要的应该是分离式、模块化、层次化、安全性设计。现进行一定的记录: 第一单元 字符串解析的简单计算器实现 递归下降法设计:递归下降法是将原对象分为多个层次,每个层次相互独立处理,将本层次划分为多个下一层次的元素,并进入下一个层次进行处理。在第一单元中表现为原式分为多项式、单项式、因子,按照+/-将多项式拆分为单项式,按照*将单项式分为因子,在因子层面,如果因子带有()则按照多项式处理(这就会出现多项式类继承因子类的行为)。 分离式设计:分离式设计应该是面向对象设计思想中极为重要的一点。这种思想有多种含义,包括程序功能模块化设计(如本单元中字符串解析为各个元素与字符串中元素计算功能分离)、层次化设计(如本单元中分为多项式、单项式、因子,后面可能还有更多层次,各个层次相互分离)等。 第二单元...