CS:APP Chapter 3 程序的机器级表示-读书笔记
2021/9/23 1:11:01
本文主要是介绍CS:APP Chapter 3 程序的机器级表示-读书笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
3.1 程序的机器级表示
发展历史
Intel,AMD,ARM 等企业各有又是,CPU 从 8 位发展到 16 位,再到 32 位,近几年发展到 64 位,当下的 CPU 体系被称为 x86-64 体系结构,主要是 Intel 和 AMD 两家的产品。
IA32 处理器体系结构是 32 位芯片。
CPU 的微观视图架构
当下的计算机大多是采用冯诺伊曼体系结构,计算机由存储器,运算器,控制器,输入设备,输出设备组成。
IA32 的寄存器
通用寄存器的特殊用法
-
EAX:扩展累加寄存器。在乘法和除法指令中被自动使用;
-
ECX:循环计数器。
-
ESI和EDI:扩展源指针寄存器和扩展目的指针寄存器。用于内存数据的存取;
-
ESP:扩展堆栈指针寄存器。一般不用于算术运算和数据传送,而用于寻址堆栈上的数据。
-
EBP:扩展帧指针寄存器。用于引用堆栈上的函数参数和局部变量;
特殊寄存器的用法
指令指针寄存器 EIP 也被称为程序计数器,Program Counter 也就是简称 PC。
PC 存放着下一条要执行的指令的地址,如果遇到了跳转,返回之类的指令,就会改变 PC 寄存器中存储的值,使之指向下一个目的地。
32 位的标志寄存器也就是 EFLAGS 寄存器,E 代表这个寄存器是 32 位的,FLAGS 代表里面存放的是有关程序状态的信息,有些指令将会改变这个状态信息,而有的指令则会根据这类状态信息执行不同的分支操作。
系统寄存器
只允许在最高特权级别下的程序进行访问的寄存器(例如操作系统内核),除此以外禁止应用程序访问。
-
中断描述符表寄存器IDTR:保存中断描述符表的地址。
-
全局描述符表寄存器GDTR:保存全局描述符表的地址,全局段描述符表包含了任务状态段和局部描述符表的指针。
-
局部描述符表寄存器LDTR:保存当前正在运行的程序的代码段、数据段和堆栈段的指针。
-
任务寄存器:保存当前执行任务的任务状态段的地址。
-
调试寄存器:用于调试程序时设置断点(breakpoint)。
IA32 的内存管理
实地址模式
在实地址模式下,处理器可以使用 20 位的地址总线,因此就可以访问多达 \(2^{20}\) 大小的内存,也就是 1MB,而 8086 的 CPU 只有 16 位的地址总线,因而不能直接使用 20 位的内存地址,需要进行一种映射变换,让 20 位的地址映射到 16 位的地址空间上。
为了实现这种映射,我们可以先考虑将多出来的 4 位作为内存的分段数量,而分出来的每一段都代表一个 16 位的地址空间,这样只能控制 16 位物理内存的 8086CPU 也就可以处理高达 20 位的地址了,这是一种较为普遍而简单的做法。
其中的段首地址不一定是整数,也有可能是一个比较不那么凑整的数字。
\[08F1:0100 \\ 08F1*10H+0100H=09010H \]可见段首地址可以是任意的地址,这个段也就是以前汇编中学到的代码段,数据段等的地址。
分页模式
-
将内存分割成4KB大小的页面,同时将程序段的地址空间按内存页的大小进行划分。
- 页面的大小往往是固定的
-
分页模式的基本思想:当任务运行时,当前活跃的执行代码保留在内存中,而程序中当前未使用的部分,将继续保存在磁盘上。当CPU需要执行的当前代码存储在磁盘上时,产生一个缺页错误(也就是缺页中断),引起所需页面的换进(从磁盘载入内存)。
-
通过分页以及页面的换进、换出,一台内存有限的计算机上可以同时运行多个大程序,让人感觉这台机器的内存无限大,因此称为虚拟内存。
在系统的内存金字塔中,所有的下层存储都是上层存储的缓存,下层的速度更慢,但是成本低廉所以容量较大,上层速度更快但是更加昂贵因此容量也相对下一层要小得多。使用缓存可以让跨层的数据读写更加快速,因为高层的时间往往更加宝贵,相同的时间堵塞,层次越高,性能影响越大。
这篇关于CS:APP Chapter 3 程序的机器级表示-读书笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享