《深入理解计算机系统》学习(3):程序编译和处理器

编译过程

假设一个C程序有两个文件p1.c、p2.c,我们用Unix命令行编译这些代码:

linux>gcc  -o p p1.c p2.c

gcc命令指的就是GCC C编译器,因为这是Linux上默认的编译器,gcc命令调用了一整套程序,将源代码转化为可执行代码。

  1. 首先,C预处理器扩展源代码,插入所有用#include命令指定的文件,并拓展所有用#define申明指定的宏。
  2. 其次,编译器产生两个源文件的汇编代码,名字分别为p1.s和p2.s。
  3. 接下来,汇编器会将汇编代码转化为二进制目标代码文件p1.o、p2.o。目标代码是机器代码的一种形式,包含所有指令的二进制表示,但是还没有填入全局值的地址。
  4. 最后,连接器将两个目标文件与实现库函数的代码合并,并产生最终的可执行代码文件p。可执行代码是机器代码的第二种形式,也就是处理器执行的代码格式。

在整个编译系统中,编译器会完成大部分的工作,将把用C语言提供的相对比较抽象的执行模型表示的程序转化为处理器执行的非常基本的指令。汇编代码表示非常接近机器代码。与机器代码的二进制格式相比,汇编代码使用文本格式表示,可读性更好,更容易理解汇编代码和原始C代码的联系。

虽然C语言提供了一种模型,可以在内存中声明和分配各种类型的对象,但是机器代码只是简单地将内存看作一个很大的、按字节寻址的数组,汇编代码不区分有符号或无符号整数,不区分各种类型的指针,甚至于不区分指针和整数。

计算机执行机器代码,用字节序列编码低级的操作,包括处理数据、管理内存、读写存储设备上的数据,以及利用网络通信。编译器基于编程语言的规则、目标机器的指令集和操作系统遵循的惯例,经过一系列的阶段生成机器代码。

处理器

处理器即CPU,Central Processing Unit。一般家用电脑的主板上只有一个CPU,在服务器上需要多个CPU。一个CPU由控制器、运算器、寄存器和缓存等物理单元组成。

随着多核技术的发展,CPU的概念转变为了一个容器,而CPU中的core才是真正的物理处理单元。core是相互独立的,都有自己单独的控制器、运算器、寄存器和缓存等物理单元。

同时多线程技术和超线程技术可以在一个物理核心core上同时运行两个线程,但这两个线程共享核心的资源。

Intel处理器系列俗称x86,x86一开始是第一代单芯片、16位微处理器之一。
一些Intel微处理器的模型如下:

  • 8086(1978年,29k个晶体管):第一代单芯片、16位微处理器之一。
  • i386(1985年,275k个晶体管):将体系结构扩展到32位,这是Intel系列中第一台全面支持Unix操作系统的机器。
  • Core 2(2006年,291M个晶体管):Intel第一个多核微处理器,多核在一个芯片上。
  • Core i7(2008年,781M个晶体管):最初的版本支持每个核上执行两个程序,每个芯片上最多四个核。

Intel处理器系列有好几个名字,包括IA32,也就是“Intel 32位体系结构”,以及最新的Intel64,即IA32的64位拓展,也称为x86-64。最常用的名字是“x86”,代指整个系列,也反映了直到i486处理器命名的惯例。

机器级编程的两种抽象

计算机系统使用多种形式的抽象,利用更简单的抽象模型来隐藏实现的细节。对于机器级编程来说,两种抽象尤为重要。

  • 第一种是指令集架构(比如x86-64)来定义机器级程序的格式和行为,定义了处理器的状态、指令的格式、以及每条指令对状态的影响(指令集决定了处理器的架构,在处理器基础上决定了操作系统和编译器的实现)。
  • 第二种抽象是机器级程序使用的内存地址是虚拟地址(堆、栈等),提供的内存模型看上去是一个非常大的字节数组。存储器系统实际上是将多个硬件存储器和操作系统软件组合起来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/227765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos安装docker显示 No Package Docker-Ce Available

安装docker 查看当前系统内核 查看方式 uname -r显示如下 [root@test ~]# uname -r 3.10.0-1127.19.1.el7.x86_64重要提示: docker内核版本必须是3.10+以上的版本 1、卸载老版本的 docker 及其相关依赖 yum remove docker docker-common container-selinux docker-selin…

WEB 3D技术 简述React Hook/Class 组件中使用three.js方式

之前 已经讲过了 用vue结合three.js进行开发 那么 自然是少不了react 我们 还是先创建一个文件夹 终端执行 npm init vitelatest输入一下项目名称 然后技术选择 react 也不太清楚大家的基础 那就选择最简单的js 然后 我们就创建完成了 然后 我们用编辑器打开创建好的项目目…

Angular中使用Intersection Observer API实现无限滚动

背景&#xff1a; 实现原理为 在data下面加一个loading元素 如果此元素进入视窗 则调用api获取新的数据加到原来的数据里面&#xff0c;这时loading就会被新数据顶下去&#xff0c;如此循环。 <div id"dataContainer"></div> <div id"loadingCo…

Java之方法引用

目录 一、什么是方法引用 二、方法引用的规则 三、方法引用的分类&#xff1a; &#xff08;一&#xff09;、引用静态方法 &#xff08;二&#xff09;、引用成员方法 1、引用其他类的成员方法 2、引用本类的成员方法 3、引用父类的成员方法 &#xff08;三&#xff…

Win7系统桌面出现白色透明框的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Vue3源码梳理:设计一个微型Vue的源码框架环境

目录结构设计 创建 vue-mini 目录在该目录中&#xff0c;初始化npm包&#xff1a;$ npm init -y创建package.json文件创建packages 目录&#xff0c;作为核心代码区域 在内创建vue目录&#xff1a;打包&#xff0c;测试实例&#xff0c;项目整体入口模块在内创建 shared 目录&…

高云GW1NSR-4C开发板M3核RT-Thread应用

1.仅提供RT-Thread的Nano版本 MCU工程在\EMPU(GW1NS-4C)_V1.2\ref_design\MCU_RefDesign\Keil_RefDesign\rt_thread_nano\PROJECT目录下&#xff0c;FPGA工程参考&#xff1a; 高云GW1NSR-4C开发板M3硬核应用-CSDN博客 特别注意&#xff0c;MCU主频&#xff08;即FPGA工程经P…

C#基础知识 - 变量、常量与数据类型篇

C#基础知识 - 变量、常量与数据类型篇 第3节 变量、常量与数据类型3.1 C#变量3.1.1 变量使用3.1.2 自定义变量3.1.2 接收用户输入 3.2 C#常量3.2.1 常量的使用 3.3 C#数据类型3.3.1 数据类型之值类型3.3.2 数据类型之引用类型 更多C#基础知识详解请查看&#xff1a;C#基础知识 …

Adaptive IBC :异构链互操作性的颠覆者

2024年第一季度&#xff0c;隐私协议 Secret Network 将会使用 Octopus Network 基于 Adaptive IBC 技术路线开发的 NEAR IBC&#xff0c;实现与 NEAR Protocol 之间将会实现首次跨链交互&#xff0c;这同样是 Cosmos 生态与 NEAR 之间的首次连接。整个加密世界正在成为一个越来…

ESP32网络编程实例-WebSocket服务器广播信息

WebSocket服务器广播信息 文章目录 WebSocket服务器广播信息1、软件准备2、硬件准备3、代码实现3.1 服务器代码实现3.2 客户端代码实现在本文中,我们将介绍如何向连接到 ESP32 服务器的所有 WebSocket 客户端广播消息。 1、软件准备 Arduino IDE在前面的文章中,如何搭建ESP32…

elasticsearch查询出现Limit of total fields 1000 has been exceeded

项目场景&#xff1a; 在项目中使用elasticsearch保存日志等相关数据&#xff0c;查询页面查询这些日志数据 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 今天在检查日志数据时&#xff0c;发现数据出不来&#xff0c;检查后端日志&#xff0c;发现一直…

【lesson14】MySQL表的基本查询retrieve(读取)1

文章目录 表的基本操作介绍retrieveselect列建表基本测试 where子句建表基本测试 表的基本操作介绍 CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; retrieve select列 建表 基本测试 插入数据 全列查询 …

深度学习记录--矩阵维数

如何识别矩阵的维数 如下图 矩阵的行列数容易在前向和后向传播过程中弄错&#xff0c;故写这篇文章来提醒易错点 顺便起到日后查表改错的作用 本文仅作本人查询参考(摘自吴恩达深度学习笔记)

C++标准模板(STL)- 算法库

算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操作。注意范围定义为 [first, last) &#xff0c;其中 last 指代要查询或修改的最后元素的后一个元素。 有制约算法 C20 在命名空间 std::ranges 中提供大多数算法的…

laravel5.5 里面如果想要使用自定义的数据库连接器

由于项目里面使用到了doris&#xff0c;虽然doris支持mysql协议&#xff0c;但是如果直接把他当mysql使用是行不通的&#xff0c;因为doris并不支持mysql的一些option和mode设置&#xff0c;然后就会一直报错&#xff1a; SQLSTATE[HY000]: General error: 2013 Lost connecti…

前端常用去重的几种方式

文章目录 方式1: ES6新语法方式2: 遍历 利用filter方式3: 使用 new Map() for循环方式4: 利用 hasOwnProperty总结 在github 查看该文章 方式1: ES6新语法 过滤出网页中不重复的html标签 结合去重知识点考查 […new Set([…document.querySelectorAll(‘*’)].map(v>v.t…

分布式锁,进程锁,线程锁

线程锁:大家都不陌生&#xff0c;主要用来给方法、代码块加锁。当某个方法或者代码块使用锁时&#xff0c;那么在同一时刻至多仅有有一个线程在执行该段代码。当有多个线程访问同一对象的加锁方法/代码块时&#xff0c;同一时间只有一个线程在执行&#xff0c;其余线程必须要等…

Vue使用Canvas实现电子签名功能示例

当使用Vue来实现电子签名功能时&#xff0c;可以结合Canvas元素和Vue的数据绑定功能来实现。下面是一个简单的示例&#xff0c;演示了如何在Vue中使用Canvas实现电子签名功能&#xff1a; <template><div><!-- Canvas元素用于绘制电子签名 --><canvasref…

bigdecimal比较大小

bigdecimal比较大小 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在日常的Java开发中&#xff0c;我们经常会涉及到对数字进行比较&#xff0c;而BigDecimal作为一种高精度的数值类型&#xff0c;其…

06 使用v-model实现双向数据绑定

概述 Vue achieves two-way data binding by creating a dedicated directive that watches a data property within your Vue component. The v-model directive triggers data updates when the target data property is modified on the UI. Vue 通过创建一个专用指令来观…