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