《深入理解计算机系统》(一)计算机系统漫游

《深入理解计算机系统》(一)计算机系统漫游系统中所有的信息-包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上的数据,都是由一串比特表示的。区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。比如,在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令 优化程序性能。比如一个函…

全书讲的什么

全书讲的是当系统执行程序时,系统发生了什么并且为什么会这样

以hello.c为例

#include <sutdio.h>
int main() {
    printf("hello world\n")
    return 0;
}

计算机漫游-计算机系统总览

主要讲了计算机系统总体是怎么工作的

计算机中的信息是如何表示的

系统中所有的信息-包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上的数据,都是由一串比特表示的。区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。比如,在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令

程序是如何被编译的

预处理器、编译器、汇编器、链接器一起构成了编译系统

《深入理解计算机系统》(一)计算机系统漫游

程序由高级语言被编译系统编译为可以被机器读懂的低级语言(机器代码)

了解编译系统有什么好处

  • 优化程序性能。比如一个函数调用的开销有多大
  • 理解链接时出现的额错误。比如静态变量和全局变量的区别是什么
  • 避免安全漏洞。安全编程的第一步就是理解数据和控制信息存储在程序栈上的方式会引起的后果

处理器如何读并解释存储在内存中的指令

比如在Unix系统中,通过shell输入./hello,“hello world”是如何展示到屏幕上的呢

linux> ./hello
hello world
linux> 

要想了解其中原理,需要先知道计算机的硬件组成

1)总线

贯穿整个系统的电子通道,传输的是定长的字节块。而字节中的字长是一个系统参数,各系统不相同,现在通常是4字节(32位),8字节(64位)

2)I/O设备

I/O(输入/输出)设备是系统与外部世界的联系通道。键盘、鼠标、显示器、磁盘都输入I/O设备,并通过控制器或者适配器与I/O总线相连

3)主存

主存是一个临时存储设备,在处理器处理程序过程中,临时存储程序和数据,从物理上讲,是由一组动态随机存取存储器(DRAM)芯片组成的,从逻辑上讲,存储的是一个线性的字节数组,每个字节都有唯一的地址(数组索引)。

4)处理器

中央处理单元(CPU),简称处理器,是解释或执行存储在主存中指令的引擎。

信息的表示和处理

计算机存储和处理信息是通过二进制数来表示的,这些二进制数也成为(bit)

什么是浮点数

浮点数用来表示非常大的数字、非常小的接近于零的数字以及实数的近似值

C语言中的浮点数

用float(单精度)和double(双精度)表示

程序的机器级表示

计算机执行机器代码,就是用字节序列来编码低级的操作,包括处理数据、管理内存、读写存储设备上的数据以及网络通信。

如何利用汇编编码

C语言编译过程的中间产物,汇编,比二进制指令更容易理解,可以通过反汇编将二进制指令转为汇编

如何用数据格式表示

由于是由16位(bit)体系扩展到32位的,intel用“字”来表示16位,“双字”表示为32位。 标准的int为32位,具体如下图

《深入理解计算机系统》(一)计算机系统漫游

计算机如何访问信息

CPU通过寄存器来存储整数数据和指针,比如X86-64的CPU包含一组16个存储64位的通用目的寄存器,这16个寄存器各司其职,其中最特别的是栈指针%rsp,用来指明运行时栈的结束位置。更重要的是,有一组标准的编程规范控制着如何使用寄存器来管理栈、传递函数参数、函数的返回值、以及存储局部或临时变量。

什么是操作数指示符

大多数指令中有一个或多个“操作数”,指示出执行一个操作中的源数据以及放置结果的目标位置。操作数有三类

  • 立即数,用来表示常数值
  • 寄存器,用来表示某个寄存器的内容
  • 内存引用,根据计算出来的地址访问某个内容

如何传送数据

通过指令,可以实现寄存器和内存之间的数据传送

C语言中的“指针”指的是地址,间接引用指针就是将该指针放到一个寄存器中,然后在内存引用中使用这个寄存器

栈数据如何压入和弹出

因为栈和数据都是放到同一内存中的,可以通过内存寻址方法来访问栈内的任意位置,栈向地址方向增长,所以压栈是减少栈指针(寄存器%rsp的值),并将数据存放到内存中,而出栈是从内存中读数据,增加栈指针的值

如何进行算数和逻辑操作

也是通过指令,大多数操作分成了指令类,指令类有各种带不同大小操作数的变种,比如指令类ADD由四个加法指令组成:addb、addw、addl和addq,分别是字节加法、字加法、双字加法和四字加法。每个指令类都对应四个操作,分别是

  • 加载有效地址
  • 一元操作
  • 二元操作
  • 移位

其中一元操作有一个操作数、二元操作有两个操作数

什么是“加载有效地址”

加载有效地址指令leaq实际上是movq指令的变形,它的指令形式是从内存读数据到寄存器,但该指令并不是从内存位置读入数据,而是将有效地址写入目的操作数。

什么是一元和二元操作

  1. 一元操作只有一个操作数,即是源又是目的,可以是一个寄存器,也可以是一个内存位置,比如i++和i–
  2. 二元操作,第二个数即是源又是目的,比如x-=y,第一个数是源操作数,第二个数是目的操作数

移位操作

包括算数和逻辑右移

今天的文章《深入理解计算机系统》(一)计算机系统漫游分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/20608.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注