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. @Valid和@Validated 区别

    Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR- ...

  2. Golang语言系列-08-结构体

    结构体 自定义类型和类型别名的区别 package main import "fmt" // 自定义类型和类型别名的区别 // type后面跟的是类型 type myInt int ...

  3. 【原创】oracle提权执行命令工具oracleShell v0.1

    帮一个兄弟渗透的过程中在内网搜集到了不少oracle连接密码,oracle这么一款强大的数据库,找了一圈发现没有一个方便的工具可以直接通过用户名密码来提权的.想起来自己之前写过一个oracle的连接工 ...

  4. pikachu Over Permission

    Over Permission 如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作. 越权漏洞形成的原因是后台使用了 不合理的权限校验规则导致的. 一般越 ...

  5. miniFTP项目实战六

    项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...

  6. 为何要打印日志?C++在高并发下如何写日志文件(附源码)?

    为何要打印日志?让程序裸奔不是一件很快乐的事么? 有些BUG就像薛定谔的猫,具有波粒二象性,当你试图去观察它时它就消失了,当你不去观察它时,它又会出现.当你在测试人员面前赌咒发誓,亲自路演把程序跑一遍 ...

  7. 题解 P3943 星空

    题解 一道思维量巨大的题,很烧脑 考虑异或差分,设 \(d_i=a_i\;\;xor\;\;a_{i-1}\),那么对于翻转 \(a_i\sim a_j\) 就相当于 \(b_i\) 和 \(b_{j ...

  8. wpf 中的矩形的歪斜

    <Grid> <Rectangle x:Name="rect12" Width="100" Opacity="1" Hei ...

  9. 在C#中使用C++编写的类——用托管C++进行封装

    现在在Windows下的应用程序开发,VS.Net占据了绝大多数的份额.因此很多以前搞VC++开发的人都转向用更强大的VS.Net.在这种情况下,有很多开发人员就面临了如何在C#中使用C++开发好的类 ...

  10. 基于mysql和Java Swing的简单课程设计

    摘要 现代化的酒店组织庞大.服务项目多.信息量大.要想提高效率.降低成本.提高服务质量和管理水平,进而促进经济效益,必须利用电脑网络技术处理宾馆酒店经营数据,实现酒店现代化的信息管理.本次课程设计运用 ...