注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mihooke's blog

IT之恋

 
 
 

日志

 
 

《深入理解计算机系统》笔记(一)  

2014-09-06 21:32:45|  分类: 学习录 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、计算机系统漫游

1、 只由ASCII字符构成的文件称为文本文件,所有其他文件称为二进制文件

2、 编译系统由执行4个阶段的程序组成:预处理器、编译器、汇编器、链接器。

 《深入理解计算机系统》笔记(一) - mihooke - mihooke的博客

3、 操作系统有两个基本功能:防止硬件被失控的应用程序滥用;向应用程序提供简单一致的机制来控制复杂的低级硬件设备。操作系统中文件是对I/O设备的抽象。虚拟存储器是对主存(DRAM)和磁盘I/O设备的抽象。 进程是对处理器、主存和I/O设备的抽象表示。

进程是操作系统对一个正在运行的程序的一种抽象,可以同时运行多个进程,每个进程都好像在独占使用硬件。一个进程实际上由多个线程组成,每个线程都运行在进程的上下文中,线程比进程更高效。

进程的虚拟地址空间:

 《深入理解计算机系统》笔记(一) - mihooke - mihooke的博客

二、程序结构和执行

1、 机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器vitrual memory)。存储器的每个字节都由惟一的地址标识。所有可能的地址集合叫虚拟地址空间

2、 对于32位机器,由8个十六进制数字组成的,而且开始的那个数字在8~F之间的任意值,都是一个负数

强制类型转换的结果保持位值不变,只是改变了解释这些位的方式。

3、C中处理包含有符号和无符号的表达式:隐式地将有符号参数强制类型转换为无符号数,并假设这两个数都是非负的。Eg. -1<0u   ===>   先将-1转换为-1的补码,再做比较,假设是32位机器,那么便是4294967295u<0u,显然是不成立的。

4、零扩展:将一个无符号数转换为一个更大的数据类型,在表示的开头添加0

   符号扩展:将一个补码数字转换为一个更大的数据类型,在表示中添加最高有效位的值的副本。一个负数的补码表示中,在前面加上n1,它的值都不变。

5、逻辑右移和算术右移:无符号数是逻辑右移;有符号数两者都可以,但是几乎所有的编译器都是算术右移。负数右移,左边用1填充。

三、程序的机器级表示

1、整数寄存器文件包含8个命名的位置,分别存储32位的值,这些寄存器可以存储地址或整数数据。某些重要的程序状态、临时数据等。

   程序存储器包含:程序的可执行机器代码,OS需要的一些信息,用来管理过程调用和返回的运行时栈,用户分配的存储块。

2、机器代码和它的反汇编表示IA32指令长度从1-15字节不等;设计指令的方式,从某个指定的位置开始,将字节唯一地解码成机器指令;反汇编器只是基于机器代码文件中的字节序列来确定汇编代码;反汇编器使用的指令命名规则和GCC 生成的汇编代码使用有细微的差别。

3、操作数指示符:操作数有三种类型,立即数(Imm,$后面是立即数的值)寄存器(Ea表示任一寄存器aR[Ea]表示它的值)存储器引用(把寄存器看作是很大的数组,对其中值的引用用Mb[Addr]表示---从地址Addr开始的b个字节)

《深入理解计算机系统》笔记(一) - mihooke - mihooke的博客

4、IA32中的8个寄存器:前3个(%eax%ecx%edx),中间3个(%ebx%edi%esi),后2个(%ebp%esp)指向栈的位置。C中间接引用指针就是将该指针放在一个寄存器中,然后在寄存器引用中使用这个寄存器,局部变量就是保存在寄存器中的。

5数据传送指令: movb:传送字节;movw:传送字;movl:传送双字。

   加载有效地址leal指令,它是movl的变形,leal S,D ----> &S->D ,实际上没有引用存储器;如果寄存器%eax的值为x,那么leal 7(%eax,%eax,4),%edx 将设置%edx的值为4x+x+77是偏移量。

6、有符号除法指令idivl将寄存器%edx(高32位)和%eax(低32位)中的64位数作为除数,除数作为指令的操作数给出,指令将商存储在寄存器%eax中,将余数存在%edx中。

7、条件码CF:进位标志;ZF:零标志;SF:符号标志;OF:溢出标志;,有两类指令只设置条件码而不改变任何其他寄存器,是CMP:根据它们的两个操作数之差来设置条件码;TEST:两个操作数是一样的(testl %eax,%eax   用来检查%eax是负数还是正数或零 ),或者其中一个操作数是一个掩码,用来指示哪些位应该被测试。

8、跳转指令的目标编码(第二个字节) 加上 下一条指令的地址,就是跳转目标地址。

9、栈帧的最顶端是由两个指针界定的,寄存器%ebp为帧指针,寄存器%esp为栈指针,当程序执行时,栈指针可以移动,大多数信息的访问都是相对于帧指针的。Leave指令用在ret指令前,既重置了栈指针,右重置了帧指针。

10、编译器根据一组简单的惯例来产生管理栈结构的代码,参数在栈上传递给函数,可以从栈中用相对于%ebp的正偏移量来访问它们,可以用push指令或是从栈指针减去偏移量来在栈上分配空间,在返回前,函数必须将栈恢复到原始条件。

11、联合(union)的典型应用,事先知道一个数据结构中的两个不同字段的使用时互斥的,那么将这两个字段声明为联合的一部分,而不是结构的一部分,以减小分配空间的总量。

12、防止缓冲区溢出攻击措施,系统下的机制:一、栈随机化,linux下的一个变量的存储位置是随机改变的。  二、栈破坏检测,在栈帧中任何局部缓冲区与栈状态之间存储一个哨值,哨值也是随机产生的,检查哨值是否被修改过。三、限制可执行代码区。

13、 x86-64IA32数据类型比较,只有长整形和指针不一样,64位下都是8个字节表示。

14、 X86-64浮点表示:,64位指令集用r替换了e,还增加了8个寄存器,命名为%r8~%r15,后缀q用于整数指令表明是64位操作。浮点数据表示在一组XMM寄存器中,命名为%xmm0~%xmm15,每个寄存器都是128位,可以存放floatdouble

 

  评论这张
 
阅读(75)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017