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 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:第一章计算机系统漫游的更多相关文章
- CSAPP 第一章 计算机系统漫游
第一章 计算机系统漫游 C语言的起源:(系统级编程的首选) C语言与Unix操作系统关系密切 C语言小而简单:其设计由一个人掌控 C语言是为实践目的设计的:其设计用来实现Unix操作系统 C语言程序编 ...
- [CSAPP笔记][第一章计算机系统漫游]
计算机系统漫游 我们通过追踪hello程序的生命周期来开始对系统的学习—–从它被程序员创建,到系统上运行,输出简单的消息,然后终止.我们沿着这个程序的生命周期,简要介绍一些逐步出现的概念,专业术语和组 ...
- 《深入理解计算机系统》(CSAPP)读书笔记 —— 第一章 计算机系统漫游
本章通过跟踪hello程序的生命周期来开始对计算机系统进行学习.一个源程序从它被程序员创建开始,到在系统上运行,输出简单的消息,然后终止.我们将沿着这个程序的生命周期,简要地介绍一些逐步出现的关键概念 ...
- CSAPP学习笔记 第一章 计算机系统漫游
Ch 1.0 1.计算机系统是由硬件和系统软件组成的 2.本书阐述了计算机组件是如何工作的以及执行组件是如何影响程序正确性和性能的. 3.通过跟踪hello程序的生命周期来开始对系统的学习. #inc ...
- CSAPP - Ch 1 - 计算机系统漫游
目录 0 序言及摘要 1 信息就是位+上下文 2 程序被其他程序翻译成不同的格式 3 了解编译系统如何工作是大有益处的 0 序言及摘要 (1) 序言: CS:APP -- Computer Syste ...
- 读CSAPP第一章的收获
这个系列只写了CSAPP第三版对于我的收获. 里面的内容很多,我只写我以前不知道的,然后现在又觉得挺有用的内容. 没有很好的排版,将就看. Amadhl定律:主要观点,想要显著加速整个系统,必须提升全 ...
- CSAPP之阅读笔记-计算机系统漫游(1)
最近在看CSAPP(深入理解计算机系统第二版),其实最新版是第三版.但是,我看了一下价格100多大洋,于是去老夫子旧书网上买了本第二版的,花了30多块钱.哈哈. 网上看了一些关于此书的书评,都说是本好 ...
- CSAPP =1= 计算机系统漫游
思维导图 预计阅读时间:15min 阅读书籍 <深入理解计算机系统> 参考视频 [精校中英字幕]2015 CMU 15-213 CSAPP 深入理解计算机系统 课程视频 参考文章 < ...
- 深入理解计算机系统 Start && 第一章要点
对此书已经慕名已久了,抽空看了第1,2,3,5章,其他章节等有空闲继续看吧. 我的许多博客是给自己快速复习使用的,比如此读书后感,你可以根据我下面的建议读完原书几章再回来复习一下(或许那时候就没必要回 ...
随机推荐
- netty入门demo(一)
目录 前言 正文 代码部分 服务端 客服端 测试结果一: 解决粘包,拆包的问题 总结 前言 最近做一个项目: 大概需求: 多个温度传感器不断向java服务发送温度数据,该传感器采用socket发送数据 ...
- 10个用Console来Debug的高级技巧
译者按: 我们往往会局限在自己熟悉的知识圈,但也应担偶尔拓展一下,使用一些不常见而又有用的技巧,扩大自己的舒适圈. 原文: 10 Tips for Javascript Debugging Like ...
- Kotlin入门(22)适配器的简单优化
列表视图 为实现各种排列组合类的视图(包括但不限于Spinner.ListView.GridView等等),Android提供了五花八门的适配器用于组装某个规格的数据,常见的适配器有:数组适配器Arr ...
- 【粗糙版】javascript的变量、数据类型、运算符、流程结构
本文内容: javascript的变量 javascript的数据类型 javascript的运算符 javascript的流程结构 首发日期:2018-05-09 javascript的变量 创建变 ...
- Jmeter-测试计划,线程组,取样器,逻辑控制器,断言和监听器
一 测试计划: 是使用jmeter测试的起点,是其他测试元件的容器,一个完整的测试计划包括多个线程组,逻辑控制器,取样器,监听器,配置元件 用户定义的变量: 测试计划上可以添加用户定义的变量.一般添加 ...
- 堆栈的应用——用JavaScript描述数据结构
栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底. 一.实现一个栈类Stack 基于堆栈的特性,可以用数组做线 ...
- 使用 pjsip 代码独立开发
1.在不改动pjsip代码的情况下,和pjsip工程目录并行建立win32控制台程序工程P2PTraversal 目录结构如下: . ├── pjproject-2.6 └── pjsipdemo 2 ...
- 系统休眠(System Suspend)和设备中断处理
一.设备IRQ的suspend和resume 本小节主要解决这样一个问题:在系统休眠过程中,如何suspend设备中断(IRQ)?在从休眠中唤醒的过程中,如何resume设备IRQ? 一般而言,在系统 ...
- CentOS 7.0下解决ifconfig: command not found的方法
在CentOS7.0中输入ifconfig命令会遇到-bash: ifconfig: command not found. 在CentOS最小安装时是没有附带ifconfig,我们进入sbin目录下可 ...
- 【算法】LeetCode算法题-Length Of Last Word
这是悦乐书的第155次更新,第157篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第14题(顺位题号是58).给定一个字符串,包含戴尔字母.小写字母和空格,返回最后一个单 ...