CSAPP:第一章计算机系统漫游

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 410     10 # 367 "/usr/include/features.h" 3 411     11 # 1 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 1 3 412     12 # 410 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 3 413     13 # 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 414     14 # 411 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 2 3 415     15 # 368 "/usr/include/features.h" 2 3 416     16 # 391 "/usr/include/features.h" 3 417     17 # 1 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 1 3 418     18 # 10 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 3 419     19 # 1 "/usr/include/x86_64-linux-gnu/gnu/stubs-64.h" 1 3 420     20 # 11 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 2 3 421     21 # 392 "/usr/include/features.h" 2 3 422     22 # 28 "/usr/include/stdio.h" 2 3 423     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 429     29 # 216 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h" 3 430     30 31     31 # 216 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h" 3 432     32 typedef long unsigned int size_t;33     33 # 34 "/usr/include/stdio.h" 2 3 434     34 35     35 # 1 "/usr/include/x86_64-linux-gnu/bits/types.h" 1 3 436     36 # 27 "/usr/include/x86_64-linux-gnu/bits/types.h" 3 437     37 # 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 438     38 # 28 "/usr/include/x86_64-linux-gnu/bits/types.h" 2 3 439     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_startproc11     11     pushq   %rbp12     12     .cfi_def_cfa_offset 1613     13     .cfi_offset 6, -1614     14     movq    %rsp, %rbp15     15     .cfi_def_cfa_register 616     16     movl    $.LC0, %edi17     17     call    puts18     18     movl    $0, %eax19     19     popq    %rbp20     20     .cfi_def_cfa 7, 821     21     ret22     22     .cfi_endproc23     23 .LFE0:24     24     .size   main, .-main25     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  [email protected]@..... 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 210     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......1415..............................截取部分.....................................
  • 链接(将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[email protected] 3      3 00000020: 4000 0000 0000 0000 d819 0000 0000 0000  @............... 4      4 00000030: 0000 0000 4000 3800 0900 4000 1f00 1c00  [email protected]8[email protected] 5      5 00000040: 0600 0000 0500 0000 4000 0000 0000 0000  [email protected] 6      6 00000050: 4000 4000 0000 0000 4000 4000 0000 0000  @[email protected]@[email protected] 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[email protected]10     10 00000090: 3802 4000 0000 0000 1c00 0000 0000 0000  8[email protected]11..............................截取部分.....................................

计算机系统中的抽象

计算机系统的抽象

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

原文地址:https://www.cnblogs.com/ywx123/p/9780391.html

时间: 2024-10-12 06:26:05

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

《深入理解计算机系统》第一章计算机系统漫游

信息就是位+上下文 系统中所有信息都是由一串位表示的.区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文. 程序被其他程序翻译成不同的格式     范例代码 1 #include <stdio.h> 2 3 4 5 int main() 6 7 { 8 9 printf("hello world\n"); 10 11 } 每条C语言都必须被其他程序转化为机器指令,以可执行目标程序的格式打包好,以二进制文件形式存放 转化过程分为: 预处理阶段:读取系统头文件stdio

第一章 计算机系统漫游

1.1信息就是上下文 源程序实际上就是由值0和1组成的位(bit),一个字节为8个位. 系统中所有的信息-包括磁盘文件,存储器中的程序,存储器中存放的用户数据以及网络上传送的数据,都是由一串位表示的.区分不同数据对象的唯一方法就是我们读到这些数据对象时的上下文. 1.2程序被其他程序翻译成不同的格式 unix系统上源文件通过编译系统(预处理器,编译器,汇编器,链接器)转换为可执行目标文件 汇编语言是非常有用的,因为它为不同高级语言的不同编译器提供的通用的输出语言 1.3了解编译系统如何工作是大有

《深入学习计算机系统(C语言)》学习进程之开篇第一章计算机系统漫游

1.1  信息就是位 + 上下文 程序的生命周期从源程序开始——这是一个有着某种扩展名(比如C源程序的文件扩展名为.c,java源程序的文件扩展名为.java,c++源程序的扩展名为.cpp等等)的文本文件.这些文本文件由一个个文本字符构成,而每个文本字符又由8个bit来构成. 数据有不同的数据对象,即不同的由bit组成的“实体”. 1.2  程序被其他程序翻译成不同的格式 为了在(操作)系统上运行程序,每条源程序上的语句都被其他程序转化为机器语言指令.然后将这些指令以可执行目标程序的格式打好包

第一章——计算机系统漫游

1.1 信息就是位+上下文 程序员通过编辑器创建并保存的文本文件hello.c是以字节序列的方式储存在文件中(源文件也叫源程序),大部分现代计算机系统都使用ASCII标准来表示文本字符,像hello.c这样只由ASCII字符构成的文件称为文本文件,所有其他文件都称为二进制文件, ASCII表 https://baike.baidu.com/item/ASCII/309296?fr=aladdin unicode,utf-16,utf-8概念区分 http://blog.sina.com.cn/s

第一章 计算机系统概论

计算机组成原理POCC review 第一章 计算机系统概论 这一章,相信老师都是略讲的,但是很重要. 计算机分类 电子计算机: 1.模拟计算机:数值由连续量表示,运算过程也连续 2.数字计算机: 按位运算,不连续跳动计算 通用计算机:超级计算机.大型机.服务器.PC机.单片机.多核机 计算机发展史 计算机五代变化 电子管 晶体管 中小规模集成电路 大规模(LSI)和超大规模集成电路 巨大规模集成电路 半导体存储器:速度快.容量大.价格低 计算机性能指标: 吞吐量:单位时间处理信息量 响应时间:

深入理解计算机系统读书笔记之第一章:漫游

我是从豆瓣上看到好多人都在推荐这本书,于是就去借来读一读,昨天晚上用了好长时间来读这本书的第一章节,感觉这本书比较符合我(有些基础还不太明白,这本书详细的进行了讲解,很好). 下面写一下我的理解(顺便回顾一下知识) 第一节主要讲的是: A Tour of Computer Systems 以hello.c为例进行讲解,介绍这个程序如何从一个源程序变成可执行程序,再到执行,显示屏上出现“hello,world” ···········································

深入理解计算机系统,第一章:漫游

计算机系统漫游 1.1 信息就是位+上下文 先看一个简单的Hello World C程序. 1 #include <stdio.h> 2 3 void main() 4 { 5 printf("Hello World!\n"); 6 } 这个程序的源文件是文本格式,以字节序列的方式存储在文件中,由一种叫ASCII码的方式编码.除了文本文件之外的其它文件都是二进制文件. 由HelloWorld程序的存储方式可以猜测,信息,包括磁盘文件.内存中运行的程序.内存中储存的用户数据以

Part I: 第 1 章 计算机系统漫游(阅读笔记)

这一章我阅读下来,个人感觉是对于整本书的整体概括和介绍.从最基本的信息位开始介绍,然后介绍到编译器,计算机硬件以及计算机操作系统和网络通信.其中让我比较印象深刻的就是这本书对于编译器以及不同编译阶段的介绍以及进程.线程并发的一些理念的介绍. 关于编译器,我之前对此知之甚少,因为在学习编程刚开始的时候,都是用集成开发工具来完成的,集成开发工具屏蔽了很多复杂的关于编译器,编辑器的联动操作,并且提供了方便的调试工具,所以作为学习者,我对于程序的编译执行的一些中间过程处于一无所知的状态,在阅读次数之后才

第一章 计算系统漫游

1.文本字符: 使用ASCII标准来表示[以一个唯一的单字节大小的整数值来表示每个字符] 大多数计算机系统中是使用ASCII标准来表示文本字符的,如hello.c程序在系统中以ASCII值序列表示的(这是程序在计算机系统的最初表示形式). 2.操作系统提供的三个基本的抽象概念: 文件:字节序列,对I/O设备抽象为文件这一概念.(包括磁盘.键盘.显示器.网络等都可以视为文件),这一抽象概念向应用程序提供一个统一的视角. 虚拟存储器:是对主存和磁盘的抽象. 进程:是操作系统对一个正在运行的程序的一种