「深入理解计算系统」从Hello World开始
从 hello world 开始
Table of Contents
1 程序源文件
#include <stdio.h> int main() {
printf ("hello, world\n");
return 0;
}
2 程序源文件是什么
程序以0,1串的形式存储在磁盘上,每一个字符有对应的ascii码,每一个ascill码有对应 的0,1串
使用od命令查看源程序ascii码,十进制形式
$ od -Ax -tcd1 hello.c
000000 # i n c l u d e < s t d i o .
35 105 110 99 108 117 100 101 32 60 115 116 100 105 111 46
000010 h > \n \n i n t m a i n ( ) {
104 62 10 10 105 110 116 32 109 97 105 110 40 41 32 123
000020 \n p r i n t f ( " h e
10 32 32 32 32 112 114 105 110 116 102 32 40 34 104 101
000030 l l o , w o r l d \ n " ) ; \n
108 108 111 44 32 119 111 114 108 100 92 110 34 41 59 10
000040 r e t u r n 0 ; \n } \n
32 32 32 32 114 101 116 117 114 110 32 48 59 10 125 10
000050
3 程序被编译
程序要被机器读懂,需要转换成机器可以读懂的过程,这个过程叫做编译,编译的过程如下
- 预处理
gcc -E hello.c -o hello.i
这一步实际上将include指令,宏指令等展开
- 编译
gcc -S hello.i -o hello.s
这一步将宏展开后的文件编译成汇编文件
- 汇编
gcc -c hello.s -o hello.o
这一步将汇编文件编译成二进制文件
- 链接
gcc hello.o -o hello
这一步将一些库包含进来,例如我们没有编写printf函数的库,但是却可以使用它的功能。 就是在这一步将其信息包含进来。
4 程序运行
4.1 读取命令
在shell中键入 ./hello 时,首先hello这个字符串要到达内存,这样shell才知道你要执行 什么程序,这个过程有两种方式实现,一个是从键盘到CPU寄存器再到内存的过程,另外一个 是通过直接存储器存取(DMA),不经过CPU直接进入内存。两种方式如下图所示:
4.2 读取指令内容
hello进入内存后,shell知道我们要执行./hello程序,就将磁盘上的hello文件中以二进制 形式存储的机器指令取到内存,再送入CPU执行。
4.3 执行过程
执行的过程是显示"hello world", 这个过程是将这个字符串从内存复制到CPU寄存器,再从 CPU寄存器到达显示设备的过程。
5 进程
5.1 进程切换
操作系统对所有正在运行的程序作了抽象,这种抽象就叫进程。每一个进程都好像是只有 它自己在使用操作系统。而事实上操作系统控制各个进程不停地切换,让每个进程看起来 同时在运行,例如shell与hello两个程序切换过程。
5.2 虚拟地址空间
之所以提出虚拟地址空间的概念是为了简化编程,使得程序看起来独占了整个内存。例如 hello程序的虚拟地址空间如下所示:
Execuable file 区域对应原来磁盘上的二进制hello文件(注意不是源程序,是编译后 的二进制文件),它被完整地映射到了代码和数据区。 Run-time heap 区域是程序运行时动态管理的内存区域,像malloc分配的内存空间就在这一块。 Shared libraries 区域存放的是共享库代码,想一想你同时运行多个程序,它们都包含了 printf函数,这时候printf函数代码就可以被多个程序共享。 User stack 区域用于函数调用,每次调用一个函数时,就把这个函数相关的信息压入栈中, 等函数退出时再弹出栈。 最上面的 Kernel virtual memory区域是内核代码,也为所有程序共享。
特别注意这是一个虚拟地址空间,这些区域在这里看起来是连续的,但是实际在物理内存中 可能就不是连续的了。这只是提供了一种抽象,使得进程之间相互独立,又可以共享一些共 有的东西,操作系统负责将这些虚拟地址映射到实际的物理地址,而程序不直接接触物理 地址,只需要关心虚拟地址就好了。
参考:《深入理解计算机系统》
图片均来自此书电子版。
「深入理解计算系统」从Hello World开始的更多相关文章
- 【Java】「深入理解Java虚拟机」学习笔记(1) - Java语言发展趋势
0.前言 从这篇随笔开始记录Java虚拟机的内容,以前只是对Java的应用,聚焦的是业务,了解的只是语言层面,现在想深入学习一下. 对JVM的学习肯定不是看一遍书就能掌握的,在今后的学习和实践中如果有 ...
- 「每日一题」面试官问你对Promise的理解?可能是需要你能手动实现各个特性
关注「松宝写代码」,精选好文,每日一题 加入我们一起学习,day day up 作者:saucxs | songEagle 来源:原创 一.前言 2020.12.23日刚立的flag,每日一题,题目类 ...
- 对于前端,「微信小程序」其实不美好
微信小程序开放公测了,9月底我曾经写过一篇 「微信小程序」来了,其中最后一句:"谢天谢地,我居然还是个前端". 这种火爆的新事物总是令人激动,感谢这个时代. 但是,当我真作为开发者 ...
- 企业运营对 DevOps 的「傲慢与偏见」
摘要:出于各种原因,并非所有人都信任 DevOps .有些人觉得 DevOps 只不过给开发者改善产品提供了一个途径而已,还有的人觉得 DevOps 是一堆悦耳的空头支票,甚至有人认为 DevOps ...
- 「前端开发者」如何把握住「微信小程序」这波红利?
由于前两周一直在老家处理重要事情,虽然朋友圈被「微信小程序」刷爆了,但并没有时间深入了解. 昨天回广州之后,第一件事情就是把「微信小程序」相关的文章.开发文档.设计规范全部看了一遍,基本上明白了「微信 ...
- Objective-C 实用关键字详解1「面试、工作」看我就 🐒 了 ^_^.
在写项目 或 阅读别人的代码(一些优秀的源码)中,总能发现一些常见的关键字,随着编程经验的积累大部分还是知道是什么意思 的. 相信很多开发者跟我当初一样,只是基本的常用关键字定义属性会使用,但在关键字 ...
- Linux 小知识翻译 - 「编译器和解释器」
这次聊聊「编译器和解释器」. 编程语言中,有以C为代表的编译型语言和以Perl为代表的解释型语言.不管是哪种,程序都是以人类能够理解的形式记录的,这种形式计算机是无法理解的. 因此,才会有编译器和解释 ...
- Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流)
Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流) Description 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,-,N).餐厅可以从三种途径获得餐巾. ...
- Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流)
Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流) Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从 ...
随机推荐
- Android03-Activity生命周期及启动模式
1.返回栈概念 2.生命周期 1. onCreate() 这个方法你已经看到过很多次了,每个活动中我们都重写了这个方法,它会在活动 第一次被创建的时候调用.你应该在这个方法中完成活动的初始化操作,比如 ...
- [Django] html 前端页面jQuery、图片等路径加载问题
严格的说这个话题应该属于一个html前端路径加载问题.为了实现一个局部更新页面的功能,简单了解了一下Ajax.Ajax是一个为了实现浏览器和服务器异步通信功能的模块.严格来说不是一个新的语言,只是JS ...
- PMC
PMC = Production Material Control 生产及物料控制,通常分为两个部分: PC:生产控制或生产管制(台.日资公司俗称手配)主要职能是生产的计划与生产的进度控制 : MC: ...
- Cortex-M3和Cortex-M4 Fault异常应用之一 ----- 基础知识
1. 摘要 Cortex-M内核实现了一个高效异常处理模块,可以捕获非法内存访问和数个程序错误条件.本应用笔记从程序员角度描述Cortex-M Fault异常,并且讲述在软件开发周期中的Fault用法 ...
- Delphi实现全局鼠标钩子
其中涉及到的一些API,网上均能查到详细的解释,这里不再熬述.源码下载 因为是全局钩子,所以要用dll注入.用到的鼠标消息结构如下: PMouseHookStruct = ^TMouseHookStr ...
- 计算机专业-世界大学学术排名,QS排名,U.S.NEWS排名
2015年美国大学计算机专业排名 计算机专业介绍:计算机涉及的领域非常广泛,其分支学科也是非常多.所以在美国将主要的专业方向分为人工智能,程序应用,计算机系统(Systems)以及计算机理论(theo ...
- 谷歌page speed 安装使用及页面问题详解
原文地址:http://wenku.baidu.com/view/b0a61f3ebcd126fff7050b40.html 谷歌page speed 安装使用及页面问题详解 谷歌page speed ...
- poj - 4045 - Power Station
题意:一棵有n个结点的树,要取其中的一个结点,使得该结点到其他所有结点的距离和dis最小,即损耗I * I * R * dis最小,输出最小损耗和该结点(有多个的话按结点编号从小到大输出)(3 < ...
- Ubuntu Android Studio 无法通过起动器开启
问题: 1.可以通过终端开启 2.通过Android-Studio建立的Application无法启动, 提示 No JDK found. Please validate either STUDIO_ ...
- [转载自 文顶顶]iOS开发UI篇—程序启动原理和UIApplication
一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序. (2)每一个应用都有自己的UIApplica ...