WeSeong 登录
← 返回文章列表
中央处理器

CPU 架构,内存架构

CPU 架构,内存架构

一、概述

CPU(中央处理器)架构我们来分析其结构。根据设计方式 CISC(复杂指令集计算机), RISC(精简指令集计算机)我们将探讨它们之间的差异。 介绍 CPU 架构中的寄存器概念及其类型。 内存架构我们来分析其结构。 内存管理单元 (MMU)以及它的作用 虚拟地址我们将研究其连接结构。 了解开发程序的运行方式。 调试器解释其概念以及在实践中获得的经验。 汇编语言按照他的指示 指令码,操作数讲述这件事。



Ⅱ. CPU 架构

  1. 中央处理器 (CPU)

中央处理器 (CPU)CPU是计算机的核心,负责存储、解释、运算和控制等重要功能。目前的学习重点在于理解CPU的工作原理,以及如何通过分析程序结构来理解其功能。因此,我们主要关注与CPU相关的知识,首先是: 存储程序概念我们需要理解这种概念。 我们可以认为,现代计算机都采用冯·诺依曼提出的这种方式。 这种方式就是,将应用程序存储在存储设备(内存)中,然后由CPU逐行执行指令。 每次执行后,结果会被再次记录到内存中,然后再次获取下一行的指令进行执行。 这种无限循环的过程,就是“存储程序”的概念。


  1. CISC(复杂指令集计算机),RISC(简化指令集计算机)


那么,CPU 如何实现“存储程序”的概念? 简单来说: CISC 和 RISC 两种计算机体系结构正如表格所示,CISC 是一种…… 虽然它可以执行复杂的指令和可变长度的指令,并且具有良好的兼容性,但它的速度较慢。 相对来说,价格较高,且性能较好。 在常见的台式电脑中,可以找到英特尔和AMD等品牌。RISC是 这类指令是简单的、固定长度的指令,执行速度快。 相对来说,它们成本较低,功耗也较小。 因此,我们常用的智能手机的主芯片通常包括ARM、Mips和GPU。


* 了解处理器和进程的区别是有帮助的。处理器指的是物理设备,例如CPU和GPU,而进程指的是正在运行的程序(应用程序)。


* 为了安装像 Windows 这样的操作系统,需要使用 CISC 架构的 CPU。然而,MacBook 使用 RISC 架构的 CPU,因此无法使用常规方法安装 Windows。


  1. 注册

前面提到,CPU 遵循存储程序的概念。那么,根据 CISC 和 RISC 的设计方式,CPU 的工作原理是什么?具体来说,如何存储程序,执行指令(数据),并再次存储结果?


这指的是CPU内部的 注册 因此,注册表是一个通用的存储空间。 通用寄存器,32位,共8个16位段寄存器,共6个, 程序状态和控制寄存器,32位,1个, 指令指针 32 位,1 个它由以下部分组成。


① 通用寄存器

作为通用的寄存器,它可以存储各种不同的值。

通用寄存器

可以保存的数值类型

EAX

算术运算的结果,以及函数的返回值

EBX

可以与ESI和EDI注册表结合,并存储内存地址。

ECX

在循环中,保存和执行循环次数(计数器)。

EDX

例如,EAX 寄存器常用于辅助算术运算,如符号扩展、大数的乘法和除法等。

ESI, EDI

在处理数据时,如果进行数据修改(例如字符串比较)或复制,ESI 会保存源数据的地址(原始数据地址),而 EDI 会保存目标地址(复制后将移动到的目标地址)。

ESP

堆栈(Stack)的最底层,存储最后一个地址。

证据支持的实践

堆栈(Stack)的最顶端,存储了第一个地址。

※ 稍后会详细介绍,但“堆栈”是一种 LIFO(后进先出)结构。数据会按照“后进先出”的原则进行添加和移除。


② 分段寄存

指示当前执行的指令的位置。 指示程序所使用的数据的内存地址。

分段寄存

可以保存的数值类型

CS

代码段,代码区域的起始地址

SS

堆叠区,堆叠区的起始地址

DS

数据段,数据区域的起始地址

ES、FS、GS

数据段:虽然是数据区域的起始地址,但在 ES 中,它存储的是字符串;在 FS 中,它存储的是额外的非关键数据;而在 GS 中,它存储的是用于各种应用程序的数据。

③ 程序的状态和控制寄存器

控制寄存器

可以保存的数值类型

举旗

当使用加法和减法进行借位时,设置为 1。

奇偶校验标志 (PF)

如果计算结果是偶数,则设置为 1;如果结果是奇数,则设置为 0。

辅助旗

16 (8) 位运算时,当出现借位时,设置为 1。

零旗 (ZF)

如果计算结果为 0(当结果相等时),则将其设置为 1。

标志旗 (SF)

如果计算结果为 1 (包括负数,符号位),则将其设置为 1。

溢出标志 (OF)

如果计算结果超过容量限制,则设置为 1。

* 对于“零标志 (ZF)”的情况,不仅进行标准的算术比较运算,还进行字符串比较运算。如果结果相同,则设置为 0;如果结果不同,则设置为 1。通过操作此寄存器,可以改变代码的条件。


④ 指导说明

类似于 IP 注册表,它告知程序要执行的代码(即要执行的指令)的地址。如果是 32 位,则使用 EIP;如果是 64 位,则使用 RIP。


* 通过修改IP注册,您可以自由地控制程序的运行。 逆向工程 (RCE): 这种技术被称为“反编译”,指的是通过分析已有的程序代码,将其恢复成原始源代码。这种技术常被用于恶意软件的开发和分析。


漏洞检测: 攻击者可以随意修改代码,从而制造出漏洞。这可能导致Windows出现蓝屏,或者普通应用程序出现错误提示。漏洞诊断就是识别出这些潜在的弱点,并了解如何应对。


* 在 CPU 运算过程中 大端字节序鸡蛋 小端序这种方式被称为大端序(Big-endian),其特点是从最高位开始进行计算。与之相对的是小端序(Little-endian),其特点是从最低位开始进行计算。虽然大端序更容易让人理解,但由于需要经过转换,因此在处理速度上不如小端序。通常,CPU 采用小端序的处理方式。



Ⅲ. 内存架构

  1. 记忆

通常,CPU 所在的区域是执行任务的场所。 随机存取存储器 (RAM)可以这样理解。它的速度比传统硬盘快,并且采用与CPU相同的冯·诺依曼架构。然而,由于资源有限,因此具有一定的局限性。 过去,由于只能进行单任务,因此效率较低,一个程序完成时,其他程序无法运行,导致处理器资源浪费。 但是,即使在单个CPU上 多任务处理通过一种能够实现多任务处理的调度技术,现在可以轻松地进行多任务处理。


* 适用于 Windows 系统的查看进程列表的命令 “任务列表”这个PID会在执行时随机变化。


据说通过调度,可以实现并行计算,但CPU和RAM都是有限的,这怎么可能呢?


立刻 虚拟内存 这是因为,首先我们需要创建一个虚拟的内存,就像照片中显示的那样。在这个虚拟内存中,程序(应用程序)会像照片中那样,分别占据一个内存空间。那么,实际的内存是如何使用的呢?

如图所示 内存管理单元 (MMU)这是因为MMU(内存管理单元)的功能是将虚拟内存映射到实际的物理内存。当CPU执行程序时,MMU负责 每次访问时,将虚拟内存地址映射到物理内存地址。我会告诉你。


※ 虽然最初可能只想到使用内存,但实际上,系统也会同时使用硬盘。在Windows中,您可以在“设置 - 系统 - 详细信息(最下方) - 高级系统设置(中间) - 高级选项 - 虚拟内存”中找到相关设置。


那么,现在我们来探讨实际的操作方式。通常情况下,人们会这样说: DRAM它是一个存储多个值的场所,包括 Stack、Heap、代码区域和数据区域,但与DRAM不同。 SRAM这里有。 SRAM(静态随机存取存储器)它是一种固态存储设备。 DRAM(动态随机存取存储器)假设存储在系统中的多个程序(如图片中的 A、B、C)中,程序 A 首先运行,那么首先为程序 A 分配 CPU 寄存器,然后在程序 B 运行时,将这些寄存器重新分配给程序 B。也就是说, 切换(上下文切换)SRAM 是一种速度快且价格较高的设备。因此,配备大量 SRAM 的 CPU 在多任务处理方面表现出色。 总结来说,运行在 DRAM 物理内存上的程序,都会被存储(并存储在多个虚拟内存中)。当需要执行这些程序时,SRAM 通过切换来支持同时(多任务)处理。


此外,为了完成这项多任务工作,如前所述 排程技术这种技术使用并行处理,即在一个处理器(CPU、GPU)上,轮流执行不同的程序(进程、应用程序)。 时分复用 (TDM)这里有。


TDM 随机决定每次在几秒内使用哪一个虚拟内存。 虚拟内存的执行顺序会随机变化,并且会隐藏实际运行的程序所使用的物理内存(虽然实际上已经分配给物理内存)。 页面这个虚拟内存地址空间,具有一定的独立性,并且大小固定。


如果,我们使用 C 语言开发应用程序, 编译 => 링커(目标代码 .obj)=> 文件系统(如可执行文件、.exe 等)=> 加载器(将内核和应用程序的可执行文件分配给内存) 按照一定的顺序执行。



通过这张图片,可能会更容易理解。C 语言是一种直接管理内存的语言,因此,理解内存空间是如何分配以及地址是如何映射的会更容易。 许多应用程序都是用 C 语言开发的,而 Windows 应用程序(如可执行文件 .exe)通过编译和链接过程,最终变成了我们使用的各种应用程序。 可执行文件的头部部分,将在稍后介绍 PEview,其中包含与程序运行相关的各种信息(如模块、IAT、EAT、内存等)。


※ 虽然主要使用C语言,但在编译过程中…该编译器会添加一些代码,例如:数据库连接、网络连接、测试、环境变量设置等。这些代码用于控制程序的执行流程,或者用于实现尚未实现的函数,或者用于控制硬件。



Ⅳ. 调试器

调试这可能已经 உங்களுக்கு 익숙,指的是计算机的运行错误,以及查找和修复这些错误的活动。例如,Windows 系统的可执行文件类型 EXE、SCR、DLL、SYS 它们都有背部。 PE (可移植可执行文件) 格式或结构它与PE结构相关。简单来说,PE结构定义了在Windows系统中,可执行文件是如何组织的,通常我们会看到大量的.exe文件。此外,看起来不太熟悉的.scr文件是屏幕保护程序的可执行文件,而.dll(动态链接库)则通常与内核相关。KERNEL32.dll)SYS 文件可以理解为与驱动程序相关的可执行文件。此外,Windows 平台上可以使用 BAT 和 PS1 格式的文件作为脚本。这些脚本文件通常通过自动化编程来实现。


* 在漏洞检测方面,通常使用与操作系统相关的脚本。例如,想象一下,是否需要在客户的服务器上安装额外的程序?显然,由于无法随意访问客户的计算机,因此这种方式是不可能的。虽然不一定如此,但通常是这样。


* KERNEL32.dll 包含了 Windows 应用程序接口的所有函数,因此许多应用程序会动态地引用这个内核。 详细信息请参见 Microsoft 网站。

Windows 内核模式:Windows 驱动程序

※ 运行 SYS 驱动程序的文件存在的原因是,Windows 无法直接访问驱动程序,必须通过驱动程序提供的 API 接口进行访问。


关于DLL文件,我们可以再进行一些解释:Windows可执行文件中, 导入地址表 (IAT)鸡蛋 出口地址表 (EAT)为了代码的维护,DLL 被设计成一个包含多个函数和类的模块。IAT 和 EAT 能够直接引用 DLL 文件,从而执行模块中的函数。在可执行文件中,IAT 记录了需要使用的哪些 Windows DLL 文件的函数,然后 EAT 引用这些函数,调用外部 DLL 文件的函数,并在使用后释放。


调试器有很多工具,这次我了解到一种新的工具: GHIDRA、Cheat Engine、HxD、OllyDbg、PEview、IDA 这些工具都有相应的功能。调试工具不仅可以用于调试,还可以作为黑客工具使用。例如,HxD可以显示PE文件,而OllyDbg则可以用于实践,学习如何分析代码。


虽然这些字可能因为太小而难以辨认。 红色部分是使用汇编语言编写的程序代码。这是一个可以欣赏到的地方。 右侧的黄色部分是注册区域。, 以下右侧的紫色区域,指的是堆栈(Stack)区域。最后, 左下方的紫色区域是内存快照。 是其中的一部分。


利用 PEview 软件 'IMAGE_OPTIONAL_HEADER', 'SECTION .rdata'可以通过这些信息了解程序运行的相关细节。 简单来说,在两种情况下, PE 头部其中包含与执行相关的各种信息(如驱动程序、DLL、内存地址等)。在“IMAGE_OPTIONAL_HEADER”中,需要特别关注的是: “入口地址”“图像基础”“入口地址”指的是程序在内存中被映射后,代码的起始位置。 “图像基址”是在内存中分配时,作为基准地址的数值。 通常情况下,对于 EXE 文件,图像基址是 0x0040000,对于 DLL 文件,则是 0x10000000。 因此,这两个数值相加,就代表了程序的起始位置。 此外, “代码基础”这指的是代码的起始位置,也就是代码段(整个代码)的起点。通常,“入口地址”和“代码基址”是相同的。最后 “数据目录数量”它表示数据目录的数量。 "SECTION .rdata" 包含前面提到的 IAT 信息。


此外,还有一些功能尚未尝试使用,需要进一步学习和了解。


为了使用这种调试工具来分析可执行文件 汇编语言了解这些信息很有帮助,但首先… 指令码操作数这些指令与实际的执行过程相关。OpCode 是一种实际执行指令的代码。



这些指令包括:操作数(操作码)表示操作的对象,可以是数据,也可以是不存在的。换句话说,操作数(参数)可以理解为操作的对象,例如寄存器、内存地址或引用值等。



评论

应用程序理解和应用的第一节课开始了。由于是线上课程,主要内容是理论讲解,但实际上,为了在短短一学期内掌握所有内容,课程内容被压缩了,因此,为了根据这个博客文章中提到的内容和关键词进行进一步学习,我花了超过3个小时。目前,我对这个应用程序的理解还不够深入,还需要更加努力地学习。