内核(Kernel) 一个计算机程序,用来管理软件发出的数据I/O(输入与输出)要求,将这些要求转译为数据处理的指令,交由中央处理器(CPU)及计算机中其他电子组件进行处理,是现代操作系统中最基本的部分...有高达256种不同的异常类型,如出发错误(0)、一般保护故障(13)、缺页(14)、机器检查(18)、操作系统定义的异常(32-127,129-255)、系统调用(0x80)。...如果两个流并发运行在不同的处理器或者计算机,称为并行流(parallel flow)。 私有地址空间(Private Address Space) 一般,进程间地址空间读写保护。...系统调用可以被中断。...PS:列出当前系统中的进程(包括僵尸进程)。 TOP:打印关于当前进程资源使用的信息。 PMAP:显示进程的存储器映射。 /proc:一个虚拟文件系统,以ASCII输出大量内核数据结构的内容。
操作系统原理是计算机行业基本功,想要成为一名计算机领域的专业人士,必不可少要打好基础。最近打算重点读一读《深入理解计算机系统》这本书,回顾和提升自己对计算机和操作系统的理解。...这是第一篇:【计算机系统漫游】。【计算机系统漫游】主要通过跟踪hello程序的生命周期来开始对系统的学习----从它被程序员创建开始,到在系统上运行,输出简单的消息,然后终止。...理解编译系统的四个阶段: (1)预处理阶段:读取系统头文件stdio.h的内容,并把它直接插人程序文本中,得到另一个.i结尾的c程序。...5 系统的硬件组成 为了理解运行hello程序时发生了什么,我们需要了解一个典型系统的硬件组成,如下图所示。 ?...通过理解和运用这种存储层次结构的知识,程序员可以优化C程序的性能。 (10)操作系统内核是应用程序和硬件之间的媒介。
《深入理解计算机系统》,这本书,我多次想要好好完整的读一遍,每次都是没有坚持下去,但是作为一个开发者,自己想要成为为数不多的大牛之一,所以打算这次把这本书完整的好好读一遍,并整理为相关的博客!...书的开头说了一句话:计算机系统是由硬件和系统软件组成,他们共同工作来运行应用程序。...我们通常接触更多的是应用程序级别的,很少关注系统以及系统和硬件的交互,但是如果自己能完全理解计算机系统以及它对应用程序的影响,那将会让我们在软件开发的路上走的更远,也同时可以避免很多问题的发生。...最终得到我们编译好的hello文件中或hello.exe 文件中,这就成了我们通常看到的可执行文件 了解这个编译过程对我们写代码来说的好处: 优化程序性能 理解链接时出现的错误 避免安全漏洞 系统硬件的组成...这里有几个关键词的概念需要理解: 进程:进程是操作系统对一个正在运行的程序的一种抽象。
上一章我们讲解了hello world 程序在计算机系统中是如何运行的。 ...因此如何将这些复制操作尽快完成则是系统设计者的一个主要目标。 1、从磁盘加载可执行文件到主存 ? 2、将输出字符串从内存写到显示器 ?...实际上,每个计算机系统中的存储设备都被组织成了一个存储器层次结构。如下图所示: ? ...正如可以运用不同的高速缓存的知识来提高程序性能一样,程序员同样可以利用对整个存储器层次结构的理解来提高程序性能。这个后面我们会详细讲解。 ...5、本章总结 本章主要介绍了高速缓存的产生的原理以及存储器设备的层次结构,如何理解整个存储器的层次结构,对于提高程序性能有很大的帮助。下一章将讲解操作系统的抽象概念。
博主昵称:一拳必胜客 博主主页面链接:博主主页传送门 博主专栏页面连接:专栏传送门–计算机考研 创作初心:本博客的初心是每天分享记录自己学习的脚步,和各位技术友探讨交流,同时给同样感兴趣的朋友以参考...IA-64是一种崭新的系统,和x86架构完全没有相似性;不应该把它与x86-64或x64弄混。
这就需要我们理解计算机中整数的运算原理。 1、计算机整数运算的局限 我们知道计算机是用二进制序列来表示数的。而二进制序列的长度是和计算机本身的字长有关。...本篇博客中程序运行环境都是在64位系统中进行。 ?...对于上面的程序,我们是在64位系统中进行运算。由上面给出的图片我们可以知道 unsigned short int 在计算机中占用 2 个字节。...这意味着计算机可以使用一个指令执行无符号和补码的乘法运算。下面我们来证明: 其中x’和y’分别代表x和y的补码编码。 那么: ?...而且计算机中也只有加法器,是没有减法器的。我们只需要将减法转换为加法运算即可。 整数的表示和运算结束了,下一篇博客我们将会讲解浮点数,也就是有小数的数。
这是CSAPP的第二个实验,主要让我们理解代码的机器级表示,最重要的是理解每个寄存器的作用以及如何使用这些寄存器。本次的实验内容有点晦涩难懂,对于这些内容多看下习惯就好了。 ...通过阅读bomb文件的汇编代码理解各个问题的运作方式,推出正确的输入答案。隐藏的问题需要通过gdb直接调用解决。 我的编译环境:Ubuntu 16.04,gcc 5.4.0。
而且,这个实验比前几个难度都加大了,做实验前建议先去看24张图7000字详解计算机中的高速缓存,理解下Cache的基本原理。 1. 实验目的 本次实验室由两部分组成。...第一部分是要模拟Cahce的行为,理解Cache的原理。第二部分将优化一个小的矩阵转置功能,目的是最大程度地减少高速缓存未命中的次数。 2.... cache的容量有限,当满的时候需要牺牲行(或者说驱逐某行),先遍历当前组,判断它满了没有,如何判断是否满,可以遍历所有的行,只要有一个有效位为0,(有效位的作用是说明该行是否存储了数据,通俗的理解就是是否为空...总结 整个实验难度确实提升不少,刚开始看完书发现对Cache缓存的过程还是不理解,又回去看了下才来做题。网上也看下其他大佬写的代码。
通过这次实验,我们可以更好的理解计算机的工作原理,在以后编写代码时,具有能结合软硬件思考的能力。 实验简介 本次实验主要处理优化内存密集型代码。图像处理提供了许多可以从优化中受益的功能示例。...代码剖析程序和相关的工具能帮助我们系统地评价和改进程序性能。我们描述了 GPROF,一个标准的Unix剖析工具。...还有更加复杂完善的剖析程序可用,例如 Intel的VTUNE程序开发系统,还有 Linux系统基本上都有的 VALGRIND。
为何要学习汇编语言 对于大部分猿友来说,平时写的都是一些高级程序设计语言,是计算机领域的诸多大神,经过几层的封装才让我们享有了这样的待遇。这样一来,我们在平时的开发过程中,可以省去很多底层的麻烦。...可是LZ想说的是,无论你处于什么样的一个岗位当中,只要你做的事是指挥计算机帮助你完成一些事情,那么你就必须了解计算机如何帮你完成这些事情,否则你就只会指挥,而不会懂得如何去做。...这点其实不难理解,试想一下,你都不知道你的程序实际上是如何运行的,你又怎么可能知道怎么写是更好的呢。...当然了,就算如此,LZ也不敢保证现在对3.X的内容已经了如指掌,因此如果文中有任何与各位猿友的理解不一致的地方,希望各位猿友尽管提出。不仅可以避免误导看博文的猿友,还可以帮助LZ纠正错误的认识。 ...接下来,我们将深入的讨论寄存器、数据格式以及一些汇编指令。
这其实理解起来并不困难,因为条件码寄存器是 1 位的,而我们的数据格式最低为 b,也就是 8 位,因此你无法使用任何数据传送指令去传送一个单个位的值。 ...有了前面小于的基础,这里就很容易理解了。SF^OF 代表小于,ZF 代表等于,因此两者的 “或运算” 则代表小于等于。 ...不过有了前面的铺垫,这个也非常好理解。...这个组合也是非常好理解的,CF 代表小于,则 CF 代表大于等于,ZF 代表不等于,因此 CF&~ZF 则代表大于等于且不等于,即大于。 ...相信看了前面几篇博客的相关指令介绍,这个汇编代码不难理解。
通过完成这13个函数,可以使我们更好的理解计算机中数据的编码方式。...参考上图理解下。...不理解的回去看下IEEE标准浮点数格式《深入理解计算机系统》(CSAPP)读书笔记 —— 第二章 信息的表示和处理 主要根据输入的数值,可以分为三种情况: 1.输入uf为无穷大和NaN,直接返回...总结 后面的几个题目还是很烧脑的,拿到题目不知所措,主要原因还是概念理解不到位。后来又去看书,理解了下基本概念,看了下其他人的解法,题目也可以慢慢理清楚了。
本文转载地址:http://www.cnblogs.com/zuoxiaolong/p/computer13.html 为何要学习汇编语言 对于大部分猿友来说,平时写的都是一些高级程序设计语言,是计算机领域的诸多大神...可是LZ想说的是,无论你处于什么样的一个岗位当中,只要你做的事是指挥计算机帮助你完成一些事情,那么你就必须了解计算机如何帮你完成这些事情,否则你就只会指挥,而不会懂得如何去做。...这点其实不难理解,试想一下,你都不知道你的程序实际上是如何运行的,你又怎么可能知道怎么写是更好的呢。...当然了,就算如此,LZ也不敢保证现在对3.X的内容已经了如指掌,因此如果文中有任何与各位猿友的理解不一致的地方,希望各位猿友尽管提出。不仅可以避免误导看博文的猿友,还可以帮助LZ纠正错误的认识。 ...接下来,我们将深入的讨论寄存器、数据格式以及一些汇编指令。
第二章 信息的表示和处理 无符号编码 基于传统的二进制表示法,表示大于或者等于零的数字 补码编码 表示有符号整数最常见的方式 浮点数编码 表示实数的科学计数法的以2为基数的版本 信息存储 大多数计算机使用...十进制与十六进制 同上例,800H = 8 16 ^ 2 + 0 16 ^ 1 + 0 * 16 ^ 0 字数据大小 字长 指明指针数据的标称大小,虚拟地址是以这样的一个字来编码的 字长决定的最重要的系统参数就是虚拟地址空间的最大大小...负数的补码,是能够和其相反数相加通过溢出从而使计算机内计算结果变为0的二进制码。这是补码设计的初衷,具体目标就是让1+(-1)=0,这利用原码是无法得到的。...0100110010000001110010000000000 对于2.49的注释 n + 1 位二进制的小数是 n 位,因此2 (n + 1) + 1 位不能表示 舍入 因为表示方法限制了浮点数的范围和精度,所以浮点运算只能近似的表示实数运算 因此采用一种系统的方法
上一篇博客 我们介绍了几种数据传送指令,包括MOV,MOVS,MOVZ,PUSH和POP等,理解起来也不算难。
这是CSAPP的第三个实验,主要让我们熟悉GDB的使用,理解程序栈帧的结构和缓冲区溢出的原理。 实验目的 本实验的目的在于加深对IA-32函数调用规则和栈结构的具体理解。...首先简单理解下函数调用过程中的栈帧结构。如上图所示,为函数P调用函数Q时,程序的栈帧结构。 当前正在执行的过程的帧总是在栈顶。...(结合栈帧的图理解) 由反汇编可得smoke函数的入口地址为0x08048c18。因此,我们需要做的就是把上面的44个字节随意填满(不要填换行),然后把原来的返回地址改为smoke函数的入口地址。...做完这些实验确实对于程序的栈帧结构有了更深的理解。更好地理解了C语言函数的汇编语言,和缓冲区溢出的原理。掌握缓冲区溢出攻击的设计方法,进一步熟悉了gdb的调试。
通过完成本实验达到: 深入理解当程序没有对缓冲区溢出做足够防范时,攻击者可能会如何利用这些安全漏洞。 深入理解x86-64机器代码的栈和参数传递机制。...深入理解x86-64指令的编码方式。 熟练使用gdb和objdump等调试工具。 更好地理解写出安全的程序的重要性,了解到一些编译器和操作系统提供的帮助改善程序安全性的特性。...,理解缓冲区溢出时函数的返回值是如何被修改和精准定位的。 准备工作 在官网下载得到实验所需文件解压后会得到五个不同的文件。对六个文件简要说明如下所示。 ...通过本次实验也加强了自己对函数调用栈,字节序,GDB,汇编的理解。X86有些指令用多了也就记住了,不需要刻意去记,熟能生巧!
第二点对于编程者则需要理解编译器的优化能力以及局限性,编写程序看上去只是一点小小的改动,可能都会引起编译器优化方式很大的变化;第三点技术主要这对运算量特别大的运算,我们将一个大的任务分成多个小任务,这些任务又可以在多核和多处理器的某种组合上并行的计算...例如,当表明一个系统有“4GHz”处理器,这表示处理器时钟运行频率为 4*109 千兆赫兹。每个时钟周期的时间是时钟频率的倒数。...与机器相关: ①、理解现代处理器 在代码级上,看上去似乎是一次执行条指令,每条指令都从寄存器或存储器中取值,执行一个操作后,并把结果存到一个寄存器或存储器位置。
领取专属 10元无门槛券
手把手带您无忧上云