体系结构从入门到入土(一) -- CPU 是如何工作的
感觉标题有点太大了,但是先这样定着吧,后面看看要如何修改。
CPU 是计算机的核心组件,想必会阅读这篇文章的或许都是计算机专业的学生,计算机组织结构里应该对 CPU 有过一定的了解,但是根据笔者的经验,教学阶段的 CPU 更多是停留在一个相对简化的模型,通常到多周期 CPU/五级流水线就结束了,对于现代的高性能处理器并不会有太多的涉及。本文将从 CPU 的基本工作原理开始,逐步深入到现代 CPU 的复杂结构和优化技术。在讲解之前,需要建立一套对 CPU 性能的评价指标体系。
性能评价指标
对于 CPU 来说,对于其性能评估就是能够更快的完成我们的计算任务,我们可以这样来计算一个程序的执行时间:
1time = inst_cnt * CPI * \frac{1}{freq}
其中,CPI 为每条指令的平均时钟周期数,即 IPC 的倒数;freq 为 CPU 的时钟频率;inst_cnt 为程序执行的指令数。通过分析这个公式,我们可以看到提升 CPU 性能的三个主要途径:
减少指令数(inst_cnt):通过优化编译器和指令集设计,减少程序执行 ...
交叉编译踩坑
本文假定所使用的是 Debian 系的系统,且使用 apt 作为包管理器。对于其他的系统/其他的包管理器,可能需要做相应的调整。
Always remember: Google is your best friend!
1. 交叉编译的基本概念
通常我们写的程序是在本机上编译运行的,这样的程序称为本地程序。而在开发嵌入式系统,或者运行平台和本地不一致的时,我们需要将程序编译成目标平台上可以运行的程序,这样的程序称为交叉编译程序。
一般来说,编译器识别平台所用的是一个三元组,即 arch-vendor-os,例如我们通常的 x86,我们可以使用 clang -v 来查看
123456789$ clang -vDebian clang version 14.0.6Target: x86_64-pc-linux-gnuThread model: posixInstalledDir: /usr/binFound candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/12Selected GCC installati ...
论文阅读笔记-GiantSan: Efficient Memory Sanitization with Segment Folding
文章发表于 ASPLOS’24,
相关背景
内存安全是程序安全的基础,为了能够方便的检测内存出错,通常我们会使用内存检测工具,例如 AddressSanitizer(ASAN),但是此类工具存在一个问题,其为了能够检测内存出错,会在进行访存等内存操作时,进行运行时检测,这样会导致程序的性能下降,因此,如何在尽可能小的影响程序性能的情况下,进行内存检测就成为了一个重要的问题。
本文的工作
基于 ASan 的原理,对其进行了改进,提出了 GiantSan,其主要的改进点在于,将连续的内存块进行合并,从而减少了运行时内存检测的开销,并对内存检测结果进行了缓存,使其能够在后续的访存中,直接从缓存中读取结果,从而减少了运行时的开销。通过和 ASan 以及 ASan-- 的对比,证明了 GiantSan 在性能上的优势。
ASan 的原理
在开始介绍 GiantSan 之前,我们先来了解下 ASan 的原理,正如前文所说,ASan 是一种内存检测工具,其工作涉及到编译时以及运行时两个阶段。
编译时主要的工作是在栈对象以及全局对象前后插入一些特殊的内存区域,称之为 poisoned redzon ...
