1 - NoraLigithub/NEMU GitHub Wiki

PA1实验报告

(一) 实验流程及错误思考 (二) 讲义问题思考 (三) 实验反思总结 (四) 手册目录翻译

##(一) 实验流程及错误思考

  1. RTFSC

    • 不知代码从哪读起。在视频的指导下,回忆程序设计课程的知识,从main.c开始,再到main.c中找到初始化,载入,进入主循环。找不到主循环的位置,想到了可以利用正则表达式,如:

        find . -name '*.[ch]' | xargs grep -n --color 'main_loop'
      

      经过查找进入ui.c主循环。 查找对PA1接下来的工作起到重要作用,启示是大型程序中适当运用查找帮助我们熟悉代码。

最初完全不懂怎么看。后来反复观看视频,逐渐理解框架代码,make run后,程序对一些数据初始化,将测试程序载入,进入ui主循环,用户选择执行功能,读取字符,根据用户的选择进入cpu-exec(意为执行一次操作),并且可能修改nemu_state以显示当前情况。

  1. 寄存器结构体

    两个理解错误(如上图示):

    • 一个union类型的数组是不是共用内存的?初有惑,想到数组的存储方式,本质是从首地址开始的连续空间,每一个成员都会继续分配空间,并非数组所有成员都共用同一空间。

    • 寄存器eip为什么不包含在数组中?一度将8改为9.后意识到,eip存储的内容与其余寄存器不同,且eip 不存在类似于ax,ah,al的访问方式,故不需要包含在数组中。

  2. 解析命令

    发现atoi,sscanf的功能,在解析命令中作用很大,我主要用来输出16进制数。

    int sscanf( string str, string fmt, mixed var1, mixed var2 ... );说明:
    

  sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。   其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号} 4. 打印寄存器

此部分输出的顺序以及输出的格式的变化并非很整齐,这是因为根据gdb调试的结果来看,它的输出情况即如此。说明,要结合已有的调试器来分析我们所需要完成的功能。
  1. 设置断点

    • 读取断点设置位置时,出现错误。当时用的是sscanf语句,但参数位置写的是q,而非q+3,导致读取位置出错,后修正。

    • 这里位置的读取是错误的,是因为表达式中的计算某一步,没有取地址! 表达式求值

    此处原先使用“/d”,后发现不可,故放弃,使用目前的写法。该部分实验框架比较清楚。未遇到较大问题。

(二) 讲义问题思考

(三) 温故而知新

opcode_table到底是个什么类型的数组?

这里的opcode_table存储的是函数指针,函数有一个参数(swaddr_t即int类型),返回值为int。因此,表中的所有操作码都代表一个函数指针,调用相应的函数就可以执行相应的指令。 究竟要执行多久? 在cmd_c()函数中, 调用cpu_exec()的时候传入了-1的参数, 你知道这是什么意思吗? 查找cpu_exec函数,发现函数的形参为uint32_t即unsigned int,-1的机器数为0xFFFFFFFF,强制类型转换为unsigned int后,是最大的数。进入cpu_exec函数后发现,这意味着,满足循环体中的某些条件,才能结束执行,否则指令将不断执行。

谁来指示程序的结束?

凭什么程序执行到main函数的返回处就结束了? 换句话说, 程序究竟是怎样结束的? 如果有人告诉你, 程序设计课上老师的说法是错的, 你有办法来证明/反驳吗? 如果你对此感兴趣, 请在互联网上搜索相关内容. main中的return语句是在告诉操作系统命令是否成功执行,Return的值作为exit函数的参数,如果传递给exit的参数为宏定义的EXIT_FAILURE,程序就会被操作系统解释为执行错误。 此外,有一些进程A会开启另一个进程B。当B退出时,经常会存储一种“退出状态”(即main的返回值会传递给exit函数)。进程A会读取这个值,并作出相应的操作。 真正指示程序结束的是return语句传递给exit函数的参数,根据传递是EXIT_FAILURE还是EXIT_SUCCESS来确定程序是否正常结束。

什么是内存?

阅读框架代码, 代码最终是使用什么结构来模拟内存的? 为什么可以用这种结构来模拟内存? 它们之间有什么相似之处? 内存就是存储空间,我们只需要知道一个空间的地址,以及地址中的内容,对应这两方面就形成了内存空间。 NEMU通过数组实现,如memory/dram.c文件中的实现,数组恰好符合有地址(和数组下标相关),有内容(和数组元素相关)的条件,便于写入,分析,读取。 天知道的指令 其实要知道那是什么指令也是有办法的, 因为至少CPU知道! 如果问你, 你会怎么办? 查找NEMU的exec.c文件,寻找对相应指令的定义即可判断。

一点也不能长?

我们知道int3指令不带任何操作数, 操作码为1个字节, 因此指令的长度是1个字节, 这是必须的吗? 假设有一种IA-32体系结构的变种my-IA-32, 除了int3指令的长度变成了2个字节之外, 其余指令和IA-32相同. 在my-IA-32中, 上述的断点机制还可以正常工作吗? 为什么? 不能。因为上述机制,int3指令覆盖的是操作码指令,只有一个字节,运行过程中,按每个字节的内容来解读,这样该指令就会被分开,可能不能正确解读指令。

如果把断点设置在指令的非首字节(中间或末尾), 会发生什么? 思考并解释其中的缘由。 发现出现了段错误。 若断点设在非首字节,则会改变断点所在指令内容,断点之前的指令应该会正常执行,而该执行断点所在指令时,可能不存在相应的指令,就发生段错误。也有可能因为执行了未知的命令。同时,由于中断指令修改的不是指令开头,并不会执行中断指令,也就不会打印触发断点的信息。

温故而知新(2)

框架代码中定义bp_pool等变量的时候使用了关键字static, static在此处的含义是什么? 为什么要在此处使用它? 含义是该变量只能在本文件中使用修改,不能让其他文件使用修改,这是为了防止断点池被未知的命令修改,造成不知所以的错误,简单说,是为了更加稳定安全的程序。 和代码玩游戏

代码究竟是什么? 代码和数据之间的区别究竟在哪里?

代码是可执行的一些指令,对寄存器,内存识别修改,进行一些操作完成功能。代码的编写体现了数据结构,抽象为操作。数据的运算可以通过代码来规定,抽象为信息。(暂时的个人理解)

(五) 实验反思总结

  1. 合理安排时间
  2. 仔细阅读PA给出的框架和思路,并且学习。比如表达式求值的思路是非常清楚的,先利用正则表达式定义用于匹配字符的数组,一个元素包含数据类型的标识,并储存读取的字符段。再建一个数组用于存放待处理的字符。开头结尾,识别操作符,不断分割字串,递归求值。

##(四)手册目录翻译

intel 80386 程序员使用手册 1986

目录

客户支持........................................................................................................................................ 2 第一章 关于 38386.............................................................................................. 15 1.1 手册结构 .................................................................................................................15 1.1.1 第一部分──应用编程........................................................ 16 1.1.2 第二部分──系统编程...................................................................... 17 1.1.3 第三部分──兼容性........................................................................... 18 1.1.4 第四部分──指令集...................................................... 18 1.1.5第五部分──补充说明.................................................................................18 1.2相关文献............................................................................................................ 19 1.3符号约定............................................................................................................ 19 1.3.1 数据结构的格式.................................................................19 1.3.2 未定义比特和软件的兼容性............................................................................ 19 1.3.3指令的操作数.................................................................................... 20 1.3.4十六进制数...................................................................................21 1.3.5子和超级脚本................................................................................................... 21 第二章 基本的编程模型........................................................................................... 22 2.1存储器组织和分段.............................................................................22 2.1.1“标记”模版……………………………………………………………………….. 23 2.1.2分段模式.........................................................................................................23 2.2数据类型...................................................................................24 2.3寄存器……………………………………………………………………………………….29 2.3.1通用寄存器........................................................................................ 29 2.3.2段寄存器...............................................................................30 2.3.3栈的实现.................................................................... 32 2.3.4标志寄存器..........................................................................33 2.3.4.1状态寄存器....................................................34 2.3.4.2控制标志……………………………………………………………..34 2.3.4.3指令指针......................................................................35 2.4指令格式............................................................................................. 35 2.5操作数的选择........................................................................................... 36 2.5.1 立即操作数....................................................................................... 37 2.5.2寄存器操作数.................................................................................. 38 2.5.3存储器操作数................................................................................. 38 2.5.3.1段选择.................................................................39 2.5.3.2有效地址的计算..................................................................40 2.6中断和异常........................................................................... 42 第三章 应用指令集.................................................................... 45 3.1移动数据的结构变化.............................................45 3.1.1通用数据移动指令................................................. 45 3.1.2栈操作指令......................................................................................... 46 3.1.3类型转换指令............................................................... 48 3.2二进制算数指令....................................................................................... 50 3.2.1加法和减法指令.......................................................................... 51 3.2.2比较和符号变化的指令................................................................. 51 3.2.3乘法指令................................................................................. 51 3.2.4除法指令............................................................................... 52 3.3十进制算数指令............................................................................................ 53 3.3.1压缩BCD码调整指令........................................................................... 53 3.3.2解压BCD码调整指令............................................................. 54 3.4逻辑指令...........................................................................54 3.4.1布尔操作指令............................................................................................ 54 3.4.2位测试和修改指令............................................................................... 55 3.4.3位扫描指令........................................................................................55 3.4.4移位及旋转.................................................................. 56 3.4.4.1移位指令..........................................................................56 3.4.4.2双转移指令.........................................................................58 3.4.4.3旋转指令.....................................................................59 3.4.4.4 使用两次转移以实现快速位块转移.......................................... 61 3.4.4.5快速的字符串插入和提取................................................... 61 3.4.5字节集条件指令.................................................................... 64 3.4.6测试指令............................................................................. 64 3.5控制转移指令................................................................................ 65 3.5.1无条件转移指令.............................................................................. 65 3.5.1.1跳转指令...............................................................65 3.5.1.2调用指令.......................................................................66 3.5.1.3返回以及从中断返回............................................................. 66 3.5.2条件转移指令......................................................................... 66 3.5.2.1条件跳转指令.......................................................... 67 3.5.2.2循环指令.......................................................67 3.5.2.3执行循环或重复零次.............................................................68 3.5.3软件产生的中断........................................................................ 68 3.6字符串和字符转换指令...................................................................... 69 3.6.1重复前缀...................................................................................... 70 3.6.2索引和方向标志控制.......................................................... 71 3.6.3字符串指令...................................................................................... 71 3.7块结构指令语言.................................................................................72 3.8标志控制指令............................................................................................. 79 3.8.1携带和方向标志控制指令.......................................................... 79 3.8.2标志传送指令.......................................................................... 79 3.9协处理器接口说明............................................................ 80 3.10段寄存器指令.......................................................................... 81 3.10.1段处理器转移指令............................................................................. 82 3.10.2目前控制转移指令................................................................. 82 3.10.3数据指针的指示......................................................................... 82 3.11杂项指示................................................................................. 83 3.11.1地址计算指令.................................................................. 83 3.11.2无操作指令........................................................................................ 84 3.11.3翻译命令................................................................................................. 84 第四章 体系架构....................................................................................................85 4.1系统寄存器........................................................................................................... 85 4.1.1体统标志............................................................................. 85 4.1.2内存管理寄存器............................................................................. 87 4.1.3控制寄存器................................................................................ 87 4.1.4调试寄存器.................................................................................. 88 4.1.5测试寄存器................................................................................89 4.2系统指令...................................................................................................... 89 第五章 内存管理......................................................................................91 5.1段翻译..................................................................................... 92 5.1.1描述符........................................................................ 92 5.1.2描述符表.................................................................... 94 5.1.3选择器...................................................................................... 96 5.1.4段寄存器...................................................................................................97 5.2网页翻译................................................................................................... 98 5.2.1网络框架.............................................................................................. 98 5.2.2线性地址.....................................................................................98 5.2.3页表...................................................................................... 99 5.2.4页表条目................................................................................ 99 5.2.4.1页面地址..............................................................................100 5.2.4.2当前位..................................................................................100 5.2.4.3访问和页面重写标志位........................................ 101 5.2.4.4读/写和用户/主管位…………………………… 101 5.2.5页面翻译缓存.................................................................................. 101 5.3结合段和网页翻译........................................................................... 102 5.3.1 “标记”的构建.............................................................. 102 5.3.2跨多个页面片段............................................................................. 102 5.3.3跨多个段页......................................................................... 103 5.3.4非对齐页面和段边界.......................................................... 104 5.3.5对齐页面和段边界....................................................................... 104 5.3.6页面继承段.........................................................104 第六章 保护.................................................................................................................106 6.1为什么保护................................................................................106 6.2关于80386保护机制概论............................................................... 106 6.3段级保护....................................................107 6.3.1描述符存储保护参数................................................. 107 6.3.1.1类型检查.......................................................................109 6.3.1.2限制检查......................................................... 110 6.3.1.3权限检查.....................................................112 6.3.2限制对数据的访问..................................................................... 113 6.3.2.1代码段中的数据访问............................................................... 114 6.3.3限制控制转移............................................................................. 115 6.3.4门描述符维护程序的入口点................................................... 116 6.3.4.1栈切换............................................................. 119 6.3.4.2过程返回..........................................122 6.3.5保留给操作系统的指令.................................................. 122 6.3.5.1权限指令................................................................... 123 6.3.5.2敏感指令........................................................... 124 6.3.6指针验证指令............................................................................ 124 6.3.6.1描述符的验证..............................................................125 6.3.6.2指针的完整性和RPL................................................... 126 6.4页级保护........................................................................ 126 6.4.1页表条目入口持有保护参数................................................. 126 6.4.1.1限制可寻址域.................................................127 6.4.1.2类型检查.....................................................................127 6.4.2页表的两级保护相结合......................... 127 6.4.3重写页面保护....................................................... 128 6.5页段混合保护........................................................................... 128 第七章 多任务................................................................................................................130 7.1任务状态段.................................................................................................. 130 7.2 TSS 描述符........................................................................................................... 133 7.3任务寄存器..............................................................................................134 7.4任务门描述符.........................................................................................135 7.5任务切换................................................................................................... 137 7.6任务链接......................................................................................141 7.6.1忙碌位避免循环....................................................... 141 7.6.2修改任务链接关系........................................ 142 7.7任务地址空间.................................................................................. 142 7.7.1任务线性物理空间的映射...................................................... 143 7.7.2任务逻辑地址空间....................................................... 143 第八章 输入/输出........................................................................................ 145 8.1 I/O 寻址............................................................................. 145 8.1.1 I/O 地址空间.............................................................................. 145 8.1.2 存储器映射I/O........................................................................ 146 8.2 I/O 指令……………………………………………………………………………..146 8.2.1 寄存器的 I/O 指令................................................... 146 8.2.2 块 I/O 指令........................................................147 8.3 保护和I/O ............................................................................. 148 8.3.1 I/O优先级.................................................................................. 149 8.3.2 I/O 位映射准许..................................................................... 149 第九章 异常与中断......................................................... 152 9.1识别中断................................................................................. 152 9.2启用与禁用中断............................................................................... 153 9.2.1不可屏蔽中断层的进一步讨论....................................................... 154 9.2.2 IF层介绍................................................................................. 154 9.2.3 通用寄存器堆层的调试失败......................................... 154 9.2.4 MOV或 POP操作下的SS 层的中断与异常............ 154 9.3同时中断和异常的优先级......................................................... 155 9.4中断描述符表.......................................................................... 155 9.5 IDT描述符.............................................................................157 9.6中断任务和中断程序.......................................... 157 9.6.1中断程序........................................................................ 158 9.6.1.1中断栈程序.............................................. 158 9.6.1.2从中断程序返回................................................ 159 9.6.1.3标记使用的中断程序........................................................ 160 9.6.1.4中断程序的维护.................................................160 9.6.2中断任务..........................................................160 9.7错误代码.................................................................................... 161 9.8异常条件........................................................................ 162 9.8.1中断 0 ──划分异常.............................................................. 162 9.8.2中断 1 ──调试异常................................................ 163 9.8.3 中断 3 ──断点中断................................................ 163 9.8.4 中断 4 ──溢出中断.................................................. 163 9.8.5 中断 5 ──边界检查................................................... 163 9.8.6 中断 6 ──无效的操作码.............................................. 164 9.8.7 中断 7 ──协处理器不可用................. 164 9.8.8 中断 8 ──双故障中断......................................... 164 9.8.9 中断 9 ──协处理器段溢出中断............................................ 165 9.8.10 中断 10 ──无效的TSS............................................. 165 9.8.11 中断 11 ──段不存在.................................. 166 9.8.12 中断 12 ──栈异常中断........................................... 167 9.8.13 中断 13 ──保护异常中断.................................... 168 9.8.14 中断 14 ──页故障中断............................................... 169 9.8.14.1在任务切换页面错误...................................................... 170 9.8.14.2不匹配堆栈指针页面错误......................................... 171 9.8.15 中断 16 ──协处理器错误总结................................................ 171 9.9异常总结............................................................................................. 172 9.10错误代码汇总.......................................................................................... 173 第十章 初始化........................................................................................................174 10.1复位后处理器的状态.......................................................................... 174 10.2实际地址模块的软件初始化........................................................................... 175 10.2.1栈.................................................................................... 175 10.2.2中断表..............................................................................................175 10.2.3第一个指令........................................................................................... 176 10.3切换到保护模式.............................................................. 176 10.4保护模式的软件初始化.................................................................. 176 10.4.1中断描述符表............................................................................. 177 10.4.2栈...................................................................................................... 177 10.4.3全局描述符表............................................................................177 10.4.4页表................................................................................................ 177 10.4.5第一个任务....................................................................178 10.5初始化实例............................................................................ 178 10.6 TLB测试.................................................................185 10.6.1TLB的结构................................................................. 185 10.6.2测试寄存器.........................................................................185 10.6.3测试操作........................................................................... 188 第十一章 协同处理和多重处理........................................................... 189 11.1协同处理..............................................................................................189 11.1.1协处理器的研究............................................................... 189 11.1.2 ESC与等待指令................................................................. 189 11.1.3 EM 与MP层................................................................ 190 11.1.4任务切换的标志.................................................. 190 11.1.5协处理器异常.................................................................... 191 11.1.5.1 中断 7 ──协处理器不可用......................................... 191 11.1.5.2 中断 9 ──协处理器段溢出中断................................... 191 11.1.5.3 中断 16 ──协处理器错误中断............................................. 192 11.2通用多重处理............................................................192 11.2.1 锁与锁# 信号................................................... 192 11.2.2自动锁定.............................................................193 11.2.3缓存情况考虑....................................................................... 194 第十二章 调试...................................................................................................195 12.1体系体系的调试功能..................................... 195 12.2调试寄存器.............................................................................................. 196 12.2.1调试地址寄存器(DR0-DR3)................................................... 197 12.2.2调试控制寄存器(DR7) ................................................................... 198 12.2.3调试状态寄存器(DR6)..........................................198 12.2.4断点区域识别........................................................................................199 12.3调试异常...........................................................................................................200 12.3.1 中断 1 ──调试异常............................................................ 200 12.3.1.1指令地址断点........................................................ 201 12.3.1.2数据地址断点................................................ 202 12.3.1.3一般的故障检测............................................................... 202 12.3.1.4单步陷阱............................................................. 202 12.3.1.5任务切换断点..................................................... 203 12.3.2 中断 3 ──断电异常中断............................................ 203 第十三章执行80286保护模式....................................................... 204 13.1 80286 模版是80386模版的子集 ..................... 204 13.2两种方法执行任务的80286........................................................... 205 13.3 区别 80286......................................................................... 205 13.3.1概括的80286的24位物理地址空间........................................... 205 13.3.2广义的保留字......................................................................... 205 13.3.3新的描述符类型代码...................................................... 206 13.3.4锁的限制的语义.............................................................. 206 13.3.5额外的例外...........................................................................206 第十四章 8086的实际地址模块.................................................................................... 207 14.1物理地址的形成................................................................................................. 207 14.2寄存器和指令............................................................................................ 208 14.3 中断和异常处理.................................................................................................209 14.4 进入和离开实际地址模块..................................................................... 209 14.4.1切换到保护模式.......................................................................... 209 14.5 切换到实际地址模块 ............................................................................................ 210 14.6 实际地址模块异常................................................................. 210 14.7 区别8086................................................................................................... 211 14.8 80286 实际地址模块的差别........................................................................ 215 14.8.1总线锁定....................................................................................... 215 14.8.2第一个指令的位置...........................................................................216 14.8.3通用寄存器的初始化...................................................... 216 14.8.4 MSW初始化......................................................216 第十五章 虚拟8086模式............................................................................... 217 15.1执行8086代码........................................................................... 217 15.1.1寄存器和指令............................................................. 218 15.1.2线性地址的形成.................................................................218 15.2AV86 的任务结构.......................................................................................219 15.2.1V86使用寻址任务…………………………………………………….. 220 15.2.2V86的保护任务..................................................................... 221 15.3进入和离开AV86模式......................................................................................... 221 15.3.1通过开关转换任务......................................................................... 222 15.3.2转换通过陷阱门和中断门.............................................. 223 15.4额外的敏感指令................................................................................... 224 15.4.1仿真8086操作系统的系统调用.................................................... 225 15.4.2虚拟化中毒啊............................................................ 225 15.5 虚拟I/O....................................................................................... 225 15.5.1 I/O-映射I/O ............................................................... 226 1 5.5.2内存映射 I/O..................................................................... 226 15.5.3 I/O缓冲区........................................................................... 227 15.6区别8086........................................................................................ 227 15.780286 实际地址模块的差别..................................................................... 229 第十六章 16位与32位编码的混合.......................................... 231 16.180386工具32位与16位的特点.................................... 232 16.2混合32位和16位的操作..................................................................................... 232 16.4传输可控制的混合代码段....................................................... 234 16.4.1 代码段指针的类型.................................................................................... 235 16.4.2用于控制传输的栈的管理.................................................. 235 16.4.2.1控制操作数类型的调用.................................................. 237 16.4.2.2改变调用类型..................................................................... 237 16.4.3 中断控制转移............................................................................... 237 16.4.4参数的翻译......................................................................... 238 16.4.5 接口程序............................................................................... 238 第十七章 8086指令集...................................................................................................... 239 17.1操作数大小和地址大小的属性...................................................... 239 17.1.1默认段属性......................................................... 239 17.1.2操作数的大小和尺寸的指令地址的前缀..................................... 239 17.1.3栈地址大小属性...................................................................... 240 17.2指令格式............................................................................................. 240 17.2.1 ModR/MandSIBBytes............................................................241 17.2.2如何阅读说明中的设置................................................................... 246 17.2.2.1操作码...............................................................................246 17.2.2.2指令.......................................................................................247 17.2.2.3时钟.................................................................................248 17.2.2.4描述..................................................................................249 17.2.2.5操作 17.2.2.6描述 17.2.2.7影响标志 17.2.2.8保护异常模式 17.2.2.9实际地址模式异常 17.2.2.10 Virtual-8086模式异常........................................................................ 255 17.2.2.11 指令体系细节

附录A操作码图............................................................................... 412 附录B......................................................... 417 附录C............................................................................................... 419 附录D条件码.............................................................................................................. 421