
深入理解计算机系统
文章平均质量分 96
本专栏主要记录分享学习深入理解计算机系统过程中的感悟和笔记
嵌入式与Linux那些事
这个作者很懒,什么都没留下…
展开
-
《深入理解计算机系统》(CSAPP)实验七 —— Malloc Lab
文章目录隐式空闲链表分离的空闲链表显示空闲链表1. 实验目的2. 背景知识3. Implicit listmm_initextend_heapmm_mallocfind_fitplacemm_freecoalescemm_realloc4. explicit listmm_initallocate_from_heapextend_heapinsert_to_free_listmm_mallocfind_fitplacedelete_from_free_listmm_freecoalescecase1case转载 2021-08-11 07:58:12 · 6524 阅读 · 1 评论 -
【硬核】MMU是如何完成地址翻译的
文章目录1. 什么是虚拟内存?2. 虚拟内存的作用3. 虚拟内存与物理内存3.1 CPU存取数据3.2 物理地址常用术语3.3 虚拟地址常用术语3.4 页表常用术语3.5 页命中/缺页4. 为什么有了高速缓存,还需要TLB呢?5. MMU是如何完成地址翻译的?5.1 准备工作5.1.1 内存系统的基本条件5.1.2 TLB5.1.3 页表5.2 产生虚拟地址5.3 构造物理地址5.4 遍历高速缓存5.5 缺页处理6. 总结虚拟内存是现代操作系统中最伟大的发明之一。它为每个进程提供了一个一致的、私有的地址原创 2021-08-03 22:18:35 · 2628 阅读 · 7 评论 -
扒一扒ELF文件
ELF文件(Executable Linkable Format)是一种文件存储格式。Linux下的目标文件和可执行文件都按照该格式进行存储,有必要做个总结。文章目录1. 链接举例2. ELF文件类型2.1 可重定位目标文件(.o文件)2.2 可执行目标文件(a.out文件)2.3 共享对象文件(.so文件)3. ELF文件作用4. ELF文件格式4.1 从编译和链接角度看ELF文件(可重定位目标文件)4.2 从程序执行角度看ELF文件(可执行文件)5.总结1. 链接举例 在介绍ELF文件之前,.原创 2021-01-30 22:46:47 · 2141 阅读 · 0 评论 -
《深入理解计算机系统》(CSAPP)读书笔记 —— 第七章 链接
链接( Clinking)是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载(复制)到内存并执行。链接可以执行于编译时( compile time),也就是在源代码被翻译成机器代码时;也可以执行于加载时( load time),也就是在程序被加载器(lad er)加载到内存并执行时;甚至执行于运行时( run time),也就是由应用程序来执行。在早期的计算机系统中,链接是手动执行的。在现代系统中,链接是由叫做链接器( linker)的程序自动执行的文章目录为什么需要了解链接器?.原创 2021-01-29 16:58:15 · 2017 阅读 · 1 评论 -
《深入理解计算机系统》(CSAPP)实验六 —— Cache Lab
这是CSAPP的第6个实验,本实验将帮助我们了解缓存对C语言性能的影响。而且,这个实验比前几个难度都加大了,做实验前建议先去看下(),理解下Cache的基本原理。1. 实验目的 本次实验室由两部分组成。第一部分是要模拟Cahce的行为,理解Cache的原理。第二部分将优化一个小的矩阵转置功能,目的是最大程度地减少高速缓存未命中的次数。2. 实验准备 实验用到的所有文件在CSAPP官网都可以找到。我的运行环境Ubuntu 16.04,Gcc 5.4.0。2.1 参考跟踪文件 讲义目录的t.原创 2021-01-20 12:17:01 · 9060 阅读 · 6 评论 -
24张图7000字详解计算机中的高速缓存
什么是缓存 缓存又叫高速缓存,是计算机存储器中的一种,本质上和硬盘是一样的,都是用来存储数据和指令的。它们最大的区别在于读取速度的不同。程序一般是放在内存中的,当CPU执行程序的时候,执行完一条指令需要从内存中读取下一条指令,读取内存中的指令要花费100000个时钟周期(缓存读取速度为200个时钟周期,相差500倍),如果每次都从内存中取指令,CPU运行时将花费大量的时间在读取指令上。这显然是一种资源浪费。 如何解决这个问题呢?有人肯定会问,直接把程序存储在缓存中不行吗? 答案是可以的。但是原创 2020-12-30 22:32:52 · 4787 阅读 · 14 评论 -
9个提高代码运行效率的小技巧你知道几个?
我们写程序的目的就是使它在任何情况下都可以稳定工作。一个运行的很快但是结果错误的程序并没有任何用处。在程序开发和优化的过程中,我们必须考虑代码使用的方式,以及影响它的关键因素。通常,我们必须在程序的简洁性与它的运行速度之间做出权衡。今天我们就来聊一聊如何优化程序的性能。原创 2021-01-10 17:28:38 · 3848 阅读 · 3 评论 -
《深入理解计算机系统》(CSAPP)读书笔记 —— 第六章 存储器层次结构
在计算机系统模型中,CPU执行指令,而存储器系统为CPU存放指令和数据。实际上,存储器系统是一个具有**不同容量、成本和访问时间的存储设备的层次结构原创 2020-12-31 10:12:27 · 3532 阅读 · 1 评论 -
《深入理解计算机系统》(CSAPP)实验四 —— Attack Lab
实验目的 本实验要求在两个有着不同安全漏洞的程序上实现五种攻击。通过完成本实验达到:深入理解当程序没有对缓冲区溢出做足够防范时,攻击者可能会如何利用这些安全漏洞。深入理解x86-64机器代码的栈和参数传递机制。深入理解x86-64指令的编码方式。熟练使用gdb和objdump等调试工具。更好地理解写出安全的程序的重要性,了解到一些编译器和操作系统提供的帮助改善程序安全性的特性。做本次实验之前,建议好好阅读下本篇博文 面试官不讲武德,居然让我讲讲蠕虫和金丝雀!,理解缓冲区原创 2020-12-11 21:14:16 · 5889 阅读 · 0 评论 -
《深入理解计算机系统》(CSAPP)实验五 —— Perfom Lab
本次实验是CSAPP的第5个实验,这次实验主要是让我们熟悉如何优化程序,如何写出更具有效率的代码。通过这次实验,我们可以更好的理解计算机的工作原理,在以后编写代码时,具有能结合软硬件思考的能力。原创 2020-12-23 23:26:10 · 3950 阅读 · 2 评论 -
《深入理解计算机系统》(CSAPP)读书笔记 —— 第五章 优化程序性能
写程序最主要的目标就是使它在所有可能的情况下都正确工作。一个运行得很快但是给出错误结果的程序没有任何用处。程序员必须写出清晰简洁的代码,这样做不仅是为了自己能够看懂代码,也是为了在检査代码和今后需要修改代码时,其他人能够读懂和理解代码。另一方面,在很多情况下,让程序运行得快也是一个重要的考虑因素。本章主要介绍了循环展开,减小过程调用,消除不必要的内存引用等优化代码的方法,有助于我们写出高效的代码,提高代码的性能。原创 2020-12-16 23:21:08 · 3648 阅读 · 5 评论 -
《深入理解计算机系统》(CSAPP)实验三 —— Buf Lab
这是CSAPP的第三个实验,主要让我们熟悉GDB的使用,理解程序栈帧的结构和缓冲区溢出的原理。实验目的 本实验的目的在于加深对IA-32函数调用规则和栈结构的具体理解。实验的主要内容是对一个可执行程序“bufbomb”实施一系列缓冲区溢出攻击(buffer overflow attacks),也就是设法通过造成缓冲区溢出来改变该可执行程序的运行内存映像,继而执行一些原来程序中没有的行为,例如将给定的字节序列插入到其本不应出现的内存位置等。本次实验需要你熟练运用gdb、objdump、gcc等工具完.原创 2020-11-30 22:37:25 · 10721 阅读 · 2 评论 -
《深入理解计算机系统》(CSAPP)实验二 —— Bomb Lab
本次实验中的bomb文件中共有7个炸弹问题(6个显式的和1个隐藏的),每条问题只有输入正确的答案才能进入下一题,否则则会触发爆炸。通过阅读bomb文件的汇编代码理解各个问题的运作方式,推出正确的输入答案。隐藏的问题需要通过gdb直接调用解决。 我的编译环境:Ubuntu 16.04,gcc 5.4.0。准备工作 从官网下载到实验,解压后一共三个文件,具体如下图所示。 readme中没写什么有用的内容,bomb文件是编译完成的文件,bomb.c是本次实验的源码,打开看下,大概浏览了一遍,一原创 2020-11-25 22:36:02 · 7924 阅读 · 4 评论 -
多图详解缓冲区溢出问题
蠕虫病毒是一种常见的利用Unix系统中的缺点来进行攻击的病毒。缓冲区溢出一个常见的后果是:黑客利用函数调用过程中程序的返回地址,将存放这块地址的指针精准指向计算机中存放攻击代码的位置,造成程序异常中止。为了防止发生严重的后果,计算机会采用栈随机化,利用金丝雀值检查破坏栈,限制代码可执行区域等方法来尽量避免被攻击。虽然,现代计算机已经可以“智能”查错了,但是我们还是要养成良好的编程习惯,尽量避免写出有漏洞的代码,以节省宝贵的时间!原创 2020-11-18 23:43:21 · 19031 阅读 · 27 评论 -
《深入理解计算机系统》(CSAPP)读书笔记 —— 第三章 程序的机器级表示
本章主要介绍了计算机中的机器代码——汇编语言。当我们使用高级语言(C、Java等)编程时,代码会屏蔽机器级的细节,我们无法了解到机器级的代码实现。学习程序的机器级实现,可以让我们了解程序是如何运行的,哪些部分是可以优化的;当程序受到攻击(漏洞)时,都会涉及到程序运行时控制信息的细节(蠕虫病毒就是利用了gets函数的漏洞)。特别是作为一名嵌入式软件开发的从业人员,会经常接触到底层的代码实现。虽然不要求我们使用汇编语言写复杂的程序,但是要求我们要能够阅读和理解编译器产生的汇编代码。原创 2020-11-10 23:23:37 · 8036 阅读 · 15 评论 -
《深入理解计算机系统》(CSAPP)实验一 —— Data Lab
本文是CSAPP第二章的配套实验,通过使用有限的运算符来实现正数,负数,浮点数的位级表示。通过完成这13个函数,可以使我们更好的理解计算机中数据的编码方式。准备工作 首先去官网Lab Assignments获得实验相关的文件(也可以加我QQ获取教学视频、PPT等内容)在每个实验文件的README中都详细介绍了如何修改程序,编译程序等。建议仔细阅读,有不明白的可以留言,看到后会及时回复。 我的编译环境:Ubuntu 16.04,gcc 5.4.0。 编译时会报如下错误。 执行以下命令,.原创 2020-10-28 22:54:41 · 7374 阅读 · 28 评论 -
《深入理解计算机系统》(CSAPP)读书笔记 —— 第二章 信息的表示和处理
本章主要研究了计算机中无符号数,补码,浮点数的编码方式,通过研究数字的实际编码方式,我们能够了解计算机中不同类型的数据可表示的值的范围,不同算术运算的属性,可以知道计算机是如何处理数据溢出的。了解计算机的编码方式,对于我们写出可以跨越不同机器,不同操作系统和编译器组合的代码具有重要的帮助。文章目录信息存储为什么会有二进制?二进制有什么含义和优势?计算机的三种编码方式整数&浮点数虚拟内存&虚拟地址空间二进制&十进制&十六进制二进制转十六进制(分组转换)十进制转十六进制虚拟.原创 2020-10-24 14:51:30 · 9020 阅读 · 31 评论 -
《深入理解计算机系统》(CSAPP)读书笔记 —— 第一章 计算机系统漫游
本章通过跟踪hello程序的生命周期来开始对计算机系统进行学习。一个源程序从它被程序员创建开始,到在系统上运行,输出简单的消息,然后终止。我们将沿着这个程序的生命周期,简要地介绍一些逐步出现的关键概念、专业术语和组成部分。原创 2020-10-19 23:38:42 · 29650 阅读 · 40 评论