CSAPP:计算机系统漫游

关键点:上下文、程序运行、计算机系统抽象。

信息就是位+上下文一个程序的运行过程系统的硬件组成编译系统是如何工作的?一个程序的运行过程(c语言举例)计算机系统中的抽象

信息就是位+上下文

  所谓信息(包括磁盘文件、内存中的程序、内存中存放的用户数据、以及网络上传输的数据),都是由一串比特(bit)表示的,区分不通数据对象的唯一方法是我们读到数据对象时的上下文。
  这里的上下文,可以理解为一个”标志“,用于区分不通的数据对象,或者进入不同的状态,在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。
  信息就是位组成,通过上下文来区分不通的数据对象,即位+上下文。

一个程序的运行过程

系统的硬件组成

一个典型的硬件组成

  • 总线
      负责在各个部件间传输信息。
  • I/O设备
      I/O(输入/输出)设备是系统与外部世界的联系通道。一般包括:用户输入的鼠标键盘,用户输出的显示器、用于存储数据和程序的磁盘,每个I/O设备都通过一个控制器或者适配器与I/O总线相连。
  • 主存(DRAM)
      主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。
  • 处理器
      执行存储在主存指令中的引擎。
编译系统是如何工作的?
  • 用户输入./hello。通过键盘输入./hello,shell将字符逐一读入寄存器,在将它存放到内存中。
  • 执行./hello。当结束输入,执行程序时,将存储到磁盘上的可执行文件hello复制到主存,最终执行结果通过显示器输出。
    从磁盘读取hello命令

从磁盘加载可执行文件到主存
将输出字符串从存储器写到显示器

一个程序的运行过程(c语言举例)

  一个编译系统一般由预处理器、编译器、汇编器和链接器组成,分别包含预处理、编译、汇编和链接四个阶段。

编译系统

  • 预处理(将宏定义展开插入到源文件 -E)
    gcc -E -o hello.i hello.c //得到hello.i
 1      1 # 1 "hello.c"
2      2 # 1 "<built-in>"
3      3 # 1 "<command-line>"
4      4 # 1 "/usr/include/stdc-predef.h" 1 3 4
5      5 # 1 "<command-line>" 2
6      6 # 1 "hello.c"
7      7 # 1 "/usr/include/stdio.h" 1 3 4
8      8 # 27 "/usr/include/stdio.h" 3 4
9      9 # 1 "/usr/include/features.h" 1 3 4
10     10 # 367 "/usr/include/features.h" 3 4
11     11 # 1 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 1 3 4
12     12 # 410 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 3 4
13     13 # 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
14     14 # 411 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 2 3 4
15     15 # 368 "/usr/include/features.h" 2 3 4
16     16 # 391 "/usr/include/features.h" 3 4
17     17 # 1 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 1 3 4
18     18 # 10 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 3 4
19     19 # 1 "/usr/include/x86_64-linux-gnu/gnu/stubs-64.h" 1 3 4
20     20 # 11 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 2 3 4
21     21 # 392 "/usr/include/features.h" 2 3 4
22     22 # 28 "/usr/include/stdio.h" 2 3 4
23     23 
24     24 
25     25 
26     26 
27     27 
28     28 # 1 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h" 1 3 4
29     29 # 216 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h" 3 4
30     30 
31     31 # 216 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h" 3 4
32     32 typedef long unsigned int size_t;
33     33 # 34 "/usr/include/stdio.h" 2 3 4
34     34 
35     35 # 1 "/usr/include/x86_64-linux-gnu/bits/types.h" 1 3 4
36     36 # 27 "/usr/include/x86_64-linux-gnu/bits/types.h" 3 4
37     37 # 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
38     38 # 28 "/usr/include/x86_64-linux-gnu/bits/types.h" 2 3 4
39     39 
40     40 
41     41 typedef unsigned char __u_char;
42     42 typedef unsigned short int __u_short;
43     43 typedef unsigned int __u_int;
44     44 typedef unsigned long int __u_long;
45     45 
  • 编译(将预处理的.i文件翻译成汇编 -S)
    gcc -S -o hello.s hello.i //只编译不汇编和链接
 1      1     .file   "hello.c"
2      2     .section    .rodata  #只读数据段
3      3 .LC0:
4      4     .string "hello, world"
5      5     .text
6      6     .globl  main
7      7     .type   main, @function
8      8 main:
9      9 .LFB0:
10     10     .cfi_startproc
11     11     pushq   %rbp
12     12     .cfi_def_cfa_offset 16
13     13     .cfi_offset 6, -16
14     14     movq    %rsp, %rbp
15     15     .cfi_def_cfa_register 6
16     16     movl    $.LC0, %edi
17     17     call    puts
18     18     movl    $0, %eax
19     19     popq    %rbp
20     20     .cfi_def_cfa 7, 8
21     21     ret
22     22     .cfi_endproc
23     23 .LFE0:
24     24     .size   main, .-main
25     25     .ident  "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609"
26     26     .section    .note.GNU-stack,"",@progbits
  • 汇编(将.S翻译成机器码,linux是elf格式 -c)
    gcc -c -o hello.o hello.s //得到hello.o
 1      1 00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000  .ELF............
2      2 00000010: 0100 3e00 0100 0000 0000 0000 0000 0000  ..>.............
3      3 00000020: 0000 0000 0000 0000 a002 0000 0000 0000  ................
4      4 00000030: 0000 0000 4000 0000 0000 4000 0d00 0a00  ....@.....@.....
5      5 00000040: 5548 89e5 bf00 0000 00e8 0000 0000 b800  UH..............
6      6 00000050: 0000 005d c368 656c 6c6f 2c20 776f 726c  ...].hello, worl
7      7 00000060: 6400 0047 4343 3a20 2855 6275 6e74 7520  d..GCC: (Ubuntu 
8      8 00000070: 352e 342e 302d 3675 6275 6e74 7531 7e31  5.4.0-6ubuntu1~1
9      9 00000080: 362e 3034 2e31 3029 2035 2e34 2e30 2032  6.04.10) 5.4.0 2
10     10 00000090: 3031 3630 3630 3900 1400 0000 0000 0000  0160609.........
11     11 000000a0: 017a 5200 0178 1001 1b0c 0708 9001 0000  .zR..x..........
12     12 000000b0: 1c00 0000 1c00 0000 0000 0000 1500 0000  ................
13     13 000000c0: 0041 0e10 8602 430d 0650 0c07 0800 0000  .A....C..P......
14
15..............................截取部分.....................................
  • 链接(将obj等文件链接起来,生成可执行文件 -o)
    gcc -o hello hello.o
 1      1 00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000  .ELF............
2      2 00000010: 0200 3e00 0100 0000 3004 4000 0000 0000  ..>.....0.@.....
3      3 00000020: 4000 0000 0000 0000 d819 0000 0000 0000  @...............
4      4 00000030: 0000 0000 4000 3800 0900 4000 1f00 1c00  ....@.8...@.....
5      5 00000040: 0600 0000 0500 0000 4000 0000 0000 0000  ........@.......
6      6 00000050: 4000 4000 0000 0000 4000 4000 0000 0000  @.@.....@.@.....
7      7 00000060: f801 0000 0000 0000 f801 0000 0000 0000  ................
8      8 00000070: 0800 0000 0000 0000 0300 0000 0400 0000  ................
9      9 00000080: 3802 0000 0000 0000 3802 4000 0000 0000  8.......8.@.....
10     10 00000090: 3802 4000 0000 0000 1c00 0000 0000 0000  8.@.............
11..............................截取部分.....................................

计算机系统中的抽象

计算机系统的抽象

  • 文件是对I/O设备的抽象
  • 虚拟内存是对程序存储器的抽象
  • 进程是对一个正在运行程序的抽象

CSAPP:第一章计算机系统漫游的更多相关文章

  1. CSAPP 第一章 计算机系统漫游

    第一章 计算机系统漫游 C语言的起源:(系统级编程的首选) C语言与Unix操作系统关系密切 C语言小而简单:其设计由一个人掌控 C语言是为实践目的设计的:其设计用来实现Unix操作系统 C语言程序编 ...

  2. [CSAPP笔记][第一章计算机系统漫游]

    计算机系统漫游 我们通过追踪hello程序的生命周期来开始对系统的学习—–从它被程序员创建,到系统上运行,输出简单的消息,然后终止.我们沿着这个程序的生命周期,简要介绍一些逐步出现的概念,专业术语和组 ...

  3. 《深入理解计算机系统》(CSAPP)读书笔记 —— 第一章 计算机系统漫游

    本章通过跟踪hello程序的生命周期来开始对计算机系统进行学习.一个源程序从它被程序员创建开始,到在系统上运行,输出简单的消息,然后终止.我们将沿着这个程序的生命周期,简要地介绍一些逐步出现的关键概念 ...

  4. CSAPP学习笔记 第一章 计算机系统漫游

    Ch 1.0 1.计算机系统是由硬件和系统软件组成的 2.本书阐述了计算机组件是如何工作的以及执行组件是如何影响程序正确性和性能的. 3.通过跟踪hello程序的生命周期来开始对系统的学习. #inc ...

  5. CSAPP - Ch 1 - 计算机系统漫游

    目录 0 序言及摘要 1 信息就是位+上下文 2 程序被其他程序翻译成不同的格式 3 了解编译系统如何工作是大有益处的 0 序言及摘要 (1) 序言: CS:APP -- Computer Syste ...

  6. 读CSAPP第一章的收获

    这个系列只写了CSAPP第三版对于我的收获. 里面的内容很多,我只写我以前不知道的,然后现在又觉得挺有用的内容. 没有很好的排版,将就看. Amadhl定律:主要观点,想要显著加速整个系统,必须提升全 ...

  7. CSAPP之阅读笔记-计算机系统漫游(1)

    最近在看CSAPP(深入理解计算机系统第二版),其实最新版是第三版.但是,我看了一下价格100多大洋,于是去老夫子旧书网上买了本第二版的,花了30多块钱.哈哈. 网上看了一些关于此书的书评,都说是本好 ...

  8. CSAPP =1= 计算机系统漫游

    思维导图 预计阅读时间:15min 阅读书籍 <深入理解计算机系统> 参考视频 [精校中英字幕]2015 CMU 15-213 CSAPP 深入理解计算机系统 课程视频 参考文章 < ...

  9. 深入理解计算机系统 Start && 第一章要点

    对此书已经慕名已久了,抽空看了第1,2,3,5章,其他章节等有空闲继续看吧. 我的许多博客是给自己快速复习使用的,比如此读书后感,你可以根据我下面的建议读完原书几章再回来复习一下(或许那时候就没必要回 ...

随机推荐

  1. js 做账单处理

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  2. 2016年 CodePen 最热门的前端代码 Top 100

    每年 Codepen 都会公布年度最热门的代码片段,这些片段有的技术超弦,有的超实用.有的超有创意,有空看看都能给我们带来灵感. 同时从 Codepen 的代码上也能学习一些牛人的写法,不管是设[…… ...

  3. JS之表单提交时编码类型enctype详解

    简介 form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x- ...

  4. win7下利用ftp实现华为路由器的配置文件上传和下载

    win7下利用ftp实现华为路由器的配置文件上传和下载 1.  Win7下ftp的安装和配置 (1)开始—>控制面板—>程序—>程序和功能—>打开或关闭Windows功能 (2 ...

  5. Python 一键拉取Git分支源码自动解析并执行SQL语句

    基于Python实现自动拉取Git分支源码自动解析并执行SQL语句 by:授客 QQ:1033553122 1.代码用途 开发过程中,研发人员会提交SQL更新脚本到Git源码库,然后测试负责去拉取这些 ...

  6. 深入理解Java虚拟机04--类结构文件

    一.程序存储格式 统一的程序存储格式:不同平台的虚拟机于所有平台都统一使用程序存储格式——字节码(ByteCode); Java 虚拟机不关心 Class 文件的来源,而只和“Class文件" ...

  7. python--线程同步原语

    Threading模块是python3里面的多线程模块,模块内集成了许多的类,其中包括Thread,Condition,Event,Lock,Rlock,Semaphore,Timer等等.下面这篇文 ...

  8. AIOps 平台的误解,挑战及建议(中)— AIOps常见的误解

    本文篇幅较长,分为上,中,下,三个部分进行连载.内容分别为:AIOps 背景/所应具备技术能力分析(上),AIOps 常见的误解(中),挑战及建议(下). 前言 我大概是 5,6 年前开始接触 ITO ...

  9. NFV一种提高进程消息高可用性的方法

    1.背景及概述 1.1 背景 在做NFV的过程中,由于控制面进程被放置到不同虚拟机中,中间可能跨越路由器,因此期间网络有可能震荡,这种情况下保证高可用性就必须有保护机制,本文正是在这种背景下的考虑. ...

  10. 远程连接MySQL数据库问题总结

    远程连接MySQL数据库时,陆陆续续遇到了一些杂七杂八的问题,相信很多人也曾经遇到过这类问题,下面总结归纳在下面,方便以后直接查找. 1:出现ERROR 2003 (HY000): Can't con ...