3.1 程序的机器级表示

发展历史

Intel,AMD,ARM 等企业各有又是,CPU 从 8 位发展到 16 位,再到 32 位,近几年发展到 64 位,当下的 CPU 体系被称为 x86-64 体系结构,主要是 Intel 和 AMD 两家的产品。


IA32 处理器体系结构是 32 位芯片。

CPU 的微观视图架构

当下的计算机大多是采用冯诺伊曼体系结构,计算机由存储器,运算器,控制器,输入设备,输出设备组成。

IA32 的寄存器

通用寄存器的特殊用法

  • EAX:扩展累加寄存器。在乘法和除法指令中被自动使用;

  • ECX:循环计数器。

  • ESIEDI:扩展源指针寄存器和扩展目的指针寄存器。用于内存数据的存取;

  • 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 程序的机器级表示-读书笔记的更多相关文章

  1. CSAPP:第三章程序的机器级表示3

    程序的机器级表示3 关键点:过程.调试.指针 过程1.运行时栈2.转移控制3.数据传递4.栈上的局部存储5.寄存器中的局部存储空间理解指针使用GDB调试器 过程 1.运行时栈   x86-64的栈向低 ...

  2. CSAPP:第三章程序的机器级表示2

    CSAPP:程序的机器级表示2 关键点:算术.逻辑操作 算术逻辑操作1.加载有效地址2.一元二元操作3.移位操作 算术逻辑操作   如图列出了x86-64的一些整数和逻辑操作,大多数操作分成了指令类( ...

  3. CSAPP:第三章程序的机器级表示1

    CSAPP:程序的机器级表示1 关键点:数据格式.操作数指示符. 数据格式访问信息操作数指示符举例说明 数据格式   术语字(word)表示16位数据类型,32位数为双字(double words), ...

  4. Linux下程序的机器级表示学习心得

    Linux下程序的机器级表示学习心得 上周学习完Linux程序的机器级表示后,对于其中有些还是掌握的不太透彻.对于老师提出的关于本章一些细节的问题还是有不会,所以又重新温习了一下上周的学习内容,以下为 ...

  5. 《程序员思维修炼》读书笔记——week4

    <程序员思维修炼>读书笔记——week4 PB16061441 陈昶金 这周读的是Andy Hunt的著作<程序员思维修炼>,这本书对于我这种刚刚入门的新手很友好,大多是讲一些 ...

  6. 六星经典CSAPP-笔记(3)程序的机器级表示

    1.前言 IA32机器码以及汇编代码都与原始的C代码有很大不同,因为一些状态对于C程序员来说是隐藏的.例如包含下一条要执行代码的内存位置的程序指针(program counter or PC)以及8个 ...

  7. 【CSAPP】三、程序的机器级表示

    本章基于两种相关的机器语言:Intel IA32和x86-64,前者注重32位,后者注重64位. 本章脉络:c\汇编\机器码之间的关系,数据的表示,控制结构如何实现.运行栈,局部变量的存储,数据结构. ...

  8. 深入理解计算机系统 第三章 程序的机器级表示 Part2 第二遍

    第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9943779.html 本章汇编代码中常出现的几个指令及其含义 1.push 操作数的个数:1 将操作数(一般 ...

  9. 深入理解计算机系统 第三章 程序的机器级表示 Part1 第二遍

    第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9905345.html 机器级代码 计算机系统使用了多种不同形式的抽象,利用更简单的抽象模型来隐藏实现的细节. ...

随机推荐

  1. How to name a slf4j logger

    Use logger in a non-static context: Logger logger = LoggerFactory.getLogger(this.getClass().getName( ...

  2. JVM钩子函数的使用

    一.问题引入 背景 在编写一个需要持续在后台运行的程序的时候遇到了这样的场景:我的程序在主函数中创建了一个线程池周期性地执行任务,我希望主线程和线程池都持续运行,但如果收到外部的关闭信号时,主线程和线 ...

  3. DVWA靶场之SQL injection(blind)通关

    盲注,顾名思义,无法从界面上直接查看到执行结果,一般的SQL注入基本绝迹,最多的就是盲注 基本步骤:(由于没有回显了,相比一般的SQL注入,也就不需要确定查询字段数.判断回显位置了) 判断注入类型 破 ...

  4. springboot整合多数据源解决分布式事务

    一.前言        springboot整合多数据源解决分布式事务.             1.多数据源采用分包策略              2.全局分布式事务管理:jta-atomikos. ...

  5. nodejs 更改项目端口号的 方法

    我这里是 koa2 项目 1.项目目录 serverConf.js 这里面配置端口 代码如下: const ServerConf= { ServicePort: 3036 }; module.expo ...

  6. SpringCloud bootstrap.yml 和application.yml 加载原理

    Spring Cloud 官方文档:https://cloud.spring.io/spring-cloud-static/spring-cloud.html 一个Spring Cloud的操作是通过 ...

  7. TortoiseGit冲突和解决冲突

    产生冲突原因 产生:多个开发者同时使用或者操作git中的同一个文件,最后在依次提交commit和推送push的时候,第一个操作的是可以正常提交的,而之后的开发者想要执行pull(拉)和pull(推)操 ...

  8. UWP - 介绍App Service 与新功能

    App Service 是一种背景工作运行的服务,提供给其他Apps 使用就像Web Service.它本身无使用介面(UI-less),允许Apps 在同一个设备被引用,甚至Windows 10 1 ...

  9. Quartz任务调度(6)schedulerListener分版本超详细解析

    schedulerListener 在我们的监听器实现类中,这个类中需实现的方法很多,不需要的可以给出空实现,下面是一些常用的用法: 方法 说明 jobScheduled() Scheduler 在有 ...

  10. 在localStorage中存储对象数组并读取

    频繁ajax请求导致页面响应变慢. 于是考虑将数据存储在window.storage中,这样只请求一次ajax,而不需要频繁请求. 鉴于localstorage中只能存储字符串,所以我们要借助于JSO ...