哈尔滨工业大学-计算机系统-2022春-大作业
2.2在Ubuntu下预处理的命令.......................................................................... - 5 -
3.2 在Ubuntu下编译的命令............................................................................. - 6 -
4.2 在Ubuntu下汇编的命令............................................................................. - 7 -
5.2 在Ubuntu下链接的命令............................................................................. - 8 -
5.3 可执行目标文件hello的格式.................................................................... - 8 -
6.2 简述壳Shell-bash的作用与处理流程..................................................... - 10 -
6.3 Hello的fork进程创建过程..................................................................... - 10 -
6.6 hello的异常与信号处理............................................................................ - 10 -
7.1 hello的存储器地址空间............................................................................ - 11 -
7.2 Intel逻辑地址到线性地址的变换-段式管理............................................ - 11 -
7.3 Hello的线性地址到物理地址的变换-页式管理....................................... - 11 -
7.4 TLB与四级页表支持下的VA到PA的变换............................................. - 11 -
7.5 三级Cache支持下的物理内存访问.......................................................... - 11 -
7.6 hello进程fork时的内存映射.................................................................. - 11 -
7.7 hello进程execve时的内存映射.............................................................. - 11 -
7.8 缺页故障与缺页中断处理........................................................................... - 11 -
8.1 Linux的IO设备管理方法.......................................................................... - 13 -
8.2 简述Unix IO接口及其函数....................................................................... - 13 -
第1章 概述
1.1 Hello简介
1.2 环境与工具
1.3 中间结果
hello.o:hello.s汇编后的可重定位(relocatable)文件
hello.o.elf.txt:hello.o经过readelf得到的文本文件
hello.elf.txt:hello经readelf得到的文本文件
hello.o.s:hello.o经objdump得到的汇编代码
hello.oo:hello.oo经objdump得到的汇编代码
1.4 本章小结
本章简单介绍了Hello程序的一生,并勾勒出从P2P到020的整个过程。发现学习整个计算机系统与Hello的一生基本相同。 关于实验软硬件环境和采集处理工具,这就是文章的大致大纲
第2章 预处理
2.1 预处理的概念与作用
概念:预处理器根据以字符“#”开头的命令处理hello.c源程序。
作用:根据源代码中的预处理指令修改源代码,将系统头文件中的头文件源代码插入到目标文件中,最终生成hello.i文件
2.2在Ubuntu下预处理的命令
2.3 Hello的预处理结果解析
行数显著增多且原本的main()在结尾,g++将#include引入的头文件进行了展开
2.4 本章小结
第3章 编译
3.1 编译的概念与作用
概念:编辑器将文本文件hello.i转化为文本文件hello.s,即一个汇编语言程序。
作用:把源程序翻译成目标程序,进行词法分析和语法分析,分析过程中发现有语法错误,给出提示信息。
3.2 在Ubuntu下编译的命令
3.3 Hello的编译结果解析
3.4 本章小结
本章提供对汇编指令的简要介绍以及对 Hello 的机器级实现的理解。我们可以找到这些汇编指令与C语言代码语句的对应关系。 同时,根据一个程序的汇编代码,我们也可以还原出相应的C语言程序的大致样子。
第4章 汇编
4.1 汇编的概念与作用
汇编的作用:它的作用也很明确,即执行从汇编语言文件到可重定位目标文件的转换
4.2 在Ubuntu下汇编的命令
4.3 可重定位目标elf格式
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Data: 2's complement, little endian
Machine: Advanced Micro Devices X86-64
Start of program headers: 0 (bytes into file)
Start of section headers: 1240 (bytes into file)
Size of this header: 64 (bytes)
Size of program headers: 0 (bytes)
Size of section headers: 64 (bytes)
Section header string table index: 13
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .text PROGBITS 0000000000000000 00000040
0000000000000092 0000000000000000 AX 0 0 1
[ 2] .rela.text RELA 0000000000000000 00000388
00000000000000c0 0000000000000018 I 11 1 8
[ 3] .data PROGBITS 0000000000000000 000000d2
0000000000000000 0000000000000000 WA 0 0 1
[ 4] .bss NOBITS 0000000000000000 000000d2
0000000000000000 0000000000000000 WA 0 0 1
[ 5] .rodata PROGBITS 0000000000000000 000000d8
0000000000000033 0000000000000000 A 0 0 8
[ 6] .comment PROGBITS 0000000000000000 0000010b
000000000000002c 0000000000000001 MS 0 0 1
[ 7] .note.GNU-stack PROGBITS 0000000000000000 00000137
0000000000000000 0000000000000000 0 0 1
[ 8] .note.gnu.propert NOTE 0000000000000000 00000138
0000000000000020 0000000000000000 A 0 0 8
[ 9] .eh_frame PROGBITS 0000000000000000 00000158
0000000000000038 0000000000000000 A 0 0 8
[10] .rela.eh_frame RELA 0000000000000000 00000448
0000000000000018 0000000000000018 I 11 9 8
[11] .symtab SYMTAB 0000000000000000 00000190
00000000000001b0 0000000000000018 12 10 8
[12] .strtab STRTAB 0000000000000000 00000340
0000000000000048 0000000000000000 0 0 1
[13] .shstrtab STRTAB 0000000000000000 00000460
0000000000000074 0000000000000000 0 0 1
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
l (large), p (processor specific)
There are no section groups in this file.
There are no program headers in this file.
There is no dynamic section in this file.
Relocation section '.rela.text' at offset 0x388 contains 8 entries:
Offset Info Type Sym. Value Sym. Name + Addend
00000000001c 000500000002 R_X86_64_PC32 0000000000000000 .rodata - 4
000000000021 000c00000004 R_X86_64_PLT32 0000000000000000 puts - 4
00000000002b 000d00000004 R_X86_64_PLT32 0000000000000000 exit - 4
000000000058 000500000002 R_X86_64_PC32 0000000000000000 .rodata + 22
000000000062 000e00000004 R_X86_64_PLT32 0000000000000000 printf - 4
000000000075 000f00000004 R_X86_64_PLT32 0000000000000000 atoi - 4
00000000007c 001000000004 R_X86_64_PLT32 0000000000000000 sleep - 4
000000000087 001100000004 R_X86_64_PLT32 0000000000000000 getchar - 4
Relocation section '.rela.eh_frame' at offset 0x448 contains 1 entry:
Offset Info Type Sym. Value Sym. Name + Addend
000000000020 000200000002 R_X86_64_PC32 0000000000000000 .text + 0
Symbol table '.symtab' contains 18 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS hello.c
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1
3: 0000000000000000 0 SECTION LOCAL DEFAULT 3
4: 0000000000000000 0 SECTION LOCAL DEFAULT 4
5: 0000000000000000 0 SECTION LOCAL DEFAULT 5
6: 0000000000000000 0 SECTION LOCAL DEFAULT 7
7: 0000000000000000 0 SECTION LOCAL DEFAULT 8
8: 0000000000000000 0 SECTION LOCAL DEFAULT 9
9: 0000000000000000 0 SECTION LOCAL DEFAULT 6
10: 0000000000000000 146 FUNC GLOBAL DEFAULT 1 main
11: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND _GLOBAL_OFFSET_TABLE_
12: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND puts
13: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND exit
14: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND printf
15: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND atoi
16: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND sleep
17: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND getchar
No version information found in this file.
Displaying notes found in: .note.gnu.property
GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0
Properties: x86 feature: IBT, SHSTK
2:节头:记录每个节的节名、类型、地址、偏移量、大小、总大小、标志、链接、数据和对齐方式。
.rela.eh_frame 部分是 .eh_frame 部分的重定位数据。
4.4 Hello.o的结果解析
objdump -d -r hello.o >hello.o.s
hello.o: file format elf64-x86-64
c: 89 7d ec mov %edi,-0x14(%rbp)
f: 48 89 75 e0 mov %rsi,-0x20(%rbp)
13: 83 7d ec 04 cmpl $0x4,-0x14(%rbp)
19: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi # 20 <main+0x20>
20: e8 00 00 00 00 callq 25 <main+0x25>
25: bf 01 00 00 00 mov $0x1,%edi
2a: e8 00 00 00 00 callq 2f <main+0x2f>
2f: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%rbp)
36: 83 7d fc 07 cmpl $0x7,-0x4(%rbp)
3c: 48 8b 45 e0 mov -0x20(%rbp),%rax
40: 48 83 c0 10 add $0x10,%rax
47: 48 8b 45 e0 mov -0x20(%rbp),%rax
55: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi # 5c <main+0x5c>
58: R_X86_64_PC32 .rodata+0x22
5c: b8 00 00 00 00 mov $0x0,%eax
61: e8 00 00 00 00 callq 66 <main+0x66>
66: 48 8b 45 e0 mov -0x20(%rbp),%rax
6a: 48 83 c0 18 add $0x18,%rax
74: e8 00 00 00 00 callq 79 <main+0x79>
7b: e8 00 00 00 00 callq 80 <main+0x80>
80: 83 45 fc 01 addl $0x1,-0x4(%rbp)
86: e8 00 00 00 00 callq 8b <main+0x8b>
87: R_X86_64_PLT32 getchar-0x4
8b: b8 00 00 00 00 mov $0x0,%eax
标识符替换为相对地址,.L2只是简写、易读的形式,实际汇编代码中需要替换为实际的地址
4.5 本章小结
本章简要介绍了汇编的概念和功能。 展示了在linux系统下将汇编语言程序转换为可移动目标文件的过程,并详细分析了可移动目标文件的结构和内容。 以及 hello.s 中的反汇编代码和汇编代码的区别。
在本章中,可以看到汇编阶段如何将汇编语言转换为机器语言并生成重定向的目标文件。 一切都在为以后的链接做准备。 链接后会得到可执行程序hello。
第5章 链接
5.1 链接的概念与作用
概念:链接是收集和组合代码和数据的过程。在现代系统中单个可执行文件的链接可以在编译时、加载时或运行时完成。链接由链接器自动执行。
作用:链接过程使分离集合成为可能。我们可以将同一个程序分成几个独立的模块。将单独的编译源代码写入目标文件或库。改变一个文件时,我们将重新编译此文件和重新链接,而不重新编译其他文件。
5.2 在Ubuntu下链接的命令
5.3 可执行目标文件hello的格式
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Data: 2's complement, little endian
Machine: Advanced Micro Devices X86-64
Start of program headers: 64 (bytes into file)
Start of section headers: 14208 (bytes into file)
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Size of section headers: 64 (bytes)
Section header string table index: 26
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .interp PROGBITS 00000000004002e0 000002e0
000000000000001c 0000000000000000 A 0 0 1
[ 2] .note.gnu.propert NOTE 0000000000400300 00000300
0000000000000020 0000000000000000 A 0 0 8
[ 3] .note.ABI-tag NOTE 0000000000400320 00000320
0000000000000020 0000000000000000 A 0 0 4
[ 4] .hash HASH 0000000000400340 00000340
0000000000000038 0000000000000004 A 6 0 8
[ 5] .gnu.hash GNU_HASH 0000000000400378 00000378
000000000000001c 0000000000000000 A 6 0 8
[ 6] .dynsym DYNSYM 0000000000400398 00000398
00000000000000d8 0000000000000018 A 7 1 8
[ 7] .dynstr STRTAB 0000000000400470 00000470
000000000000005c 0000000000000000 A 0 0 1
[ 8] .gnu.version VERSYM 00000000004004cc 000004cc
0000000000000012 0000000000000002 A 6 0 2
[ 9] .gnu.version_r VERNEED 00000000004004e0 000004e0
0000000000000020 0000000000000000 A 7 1 8
[10] .rela.dyn RELA 0000000000400500 00000500
0000000000000030 0000000000000018 A 6 0 8
[11] .rela.plt RELA 0000000000400530 00000530
0000000000000090 0000000000000018 AI 6 21 8
[12] .init PROGBITS 0000000000401000 00001000
000000000000001b 0000000000000000 AX 0 0 4
[13] .plt PROGBITS 0000000000401020 00001020
0000000000000070 0000000000000010 AX 0 0 16
[14] .plt.sec PROGBITS 0000000000401090 00001090
0000000000000060 0000000000000010 AX 0 0 16
[15] .text PROGBITS 00000000004010f0 000010f0
0000000000000145 0000000000000000 AX 0 0 16
[16] .fini PROGBITS 0000000000401238 00001238
000000000000000d 0000000000000000 AX 0 0 4
[17] .rodata PROGBITS 0000000000402000 00002000
000000000000003b 0000000000000000 A 0 0 8
[18] .eh_frame PROGBITS 0000000000402040 00002040
00000000000000fc 0000000000000000 A 0 0 8
[19] .dynamic DYNAMIC 0000000000403e50 00002e50
00000000000001a0 0000000000000010 WA 7 0 8
[20] .got PROGBITS 0000000000403ff0 00002ff0
0000000000000010 0000000000000008 WA 0 0 8
[21] .got.plt PROGBITS 0000000000404000 00003000
0000000000000048 0000000000000008 WA 0 0 8
[22] .data PROGBITS 0000000000404048 00003048
0000000000000004 0000000000000000 WA 0 0 1
[23] .comment PROGBITS 0000000000000000 0000304c
000000000000002b 0000000000000001 MS 0 0 1
[24] .symtab SYMTAB 0000000000000000 00003078
00000000000004c8 0000000000000018 25 30 8
[25] .strtab STRTAB 0000000000000000 00003540
0000000000000158 0000000000000000 0 0 1
[26] .shstrtab STRTAB 0000000000000000 00003698
00000000000000e1 0000000000000000 0 0 1
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
l (large), p (processor specific)
There are no section groups in this file.
PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000002a0 0x00000000000002a0 R 0x8
INTERP 0x00000000000002e0 0x00000000004002e0 0x00000000004002e0
0x000000000000001c 0x000000000000001c R 0x1
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x00000000000005c0 0x00000000000005c0 R 0x1000
LOAD 0x0000000000001000 0x0000000000401000 0x0000000000401000
0x0000000000000245 0x0000000000000245 R E 0x1000
LOAD 0x0000000000002000 0x0000000000402000 0x0000000000402000
0x000000000000013c 0x000000000000013c R 0x1000
LOAD 0x0000000000002e50 0x0000000000403e50 0x0000000000403e50
0x00000000000001fc 0x00000000000001fc RW 0x1000
DYNAMIC 0x0000000000002e50 0x0000000000403e50 0x0000000000403e50
0x00000000000001a0 0x00000000000001a0 RW 0x8
NOTE 0x0000000000000300 0x0000000000400300 0x0000000000400300
0x0000000000000020 0x0000000000000020 R 0x8
NOTE 0x0000000000000320 0x0000000000400320 0x0000000000400320
0x0000000000000020 0x0000000000000020 R 0x4
GNU_PROPERTY 0x0000000000000300 0x0000000000400300 0x0000000000400300
0x0000000000000020 0x0000000000000020 R 0x8
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 0x10
GNU_RELRO 0x0000000000002e50 0x0000000000403e50 0x0000000000403e50
0x00000000000001b0 0x00000000000001b0 R 0x1
03 .init .plt .plt.sec .text .fini
05 .dynamic .got .got.plt .data
Dynamic section at offset 0x2e50 contains 21 entries:
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000c (INIT) 0x401000
0x000000000000000d (FINI) 0x401238
0x0000000000000004 (HASH) 0x400340
0x000000006ffffef5 (GNU_HASH) 0x400378
0x0000000000000005 (STRTAB) 0x400470
0x0000000000000006 (SYMTAB) 0x400398
0x000000000000000a (STRSZ) 92 (bytes)
0x000000000000000b (SYMENT) 24 (bytes)
0x0000000000000015 (DEBUG) 0x0
0x0000000000000003 (PLTGOT) 0x404000
0x0000000000000002 (PLTRELSZ) 144 (bytes)
0x0000000000000014 (PLTREL) RELA
0x0000000000000017 (JMPREL) 0x400530
0x0000000000000007 (RELA) 0x400500
0x0000000000000008 (RELASZ) 48 (bytes)
0x0000000000000009 (RELAENT) 24 (bytes)
0x000000006ffffffe (VERNEED) 0x4004e0
0x000000006fffffff (VERNEEDNUM) 1
0x000000006ffffff0 (VERSYM) 0x4004cc
Relocation section '.rela.dyn' at offset 0x500 contains 2 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000403ff0 000300000006 R_X86_64_GLOB_DAT 0000000000000000 __libc_start_main@GLIBC_2.2.5 + 0
000000403ff8 000500000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0
Relocation section '.rela.plt' at offset 0x530 contains 6 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000404018 000100000007 R_X86_64_JUMP_SLO 0000000000000000 puts@GLIBC_2.2.5 + 0
000000404020 000200000007 R_X86_64_JUMP_SLO 0000000000000000 printf@GLIBC_2.2.5 + 0
000000404028 000400000007 R_X86_64_JUMP_SLO 0000000000000000 getchar@GLIBC_2.2.5 + 0
000000404030 000600000007 R_X86_64_JUMP_SLO 0000000000000000 atoi@GLIBC_2.2.5 + 0
000000404038 000700000007 R_X86_64_JUMP_SLO 0000000000000000 exit@GLIBC_2.2.5 + 0
000000404040 000800000007 R_X86_64_JUMP_SLO 0000000000000000 sleep@GLIBC_2.2.5 + 0
Symbol table '.dynsym' contains 9 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.2.5 (2)
2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND printf@GLIBC_2.2.5 (2)
3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)
4: 0000000000000000 0 FUNC GLOBAL DEFAULT UND getchar@GLIBC_2.2.5 (2)
5: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
6: 0000000000000000 0 FUNC GLOBAL DEFAULT UND atoi@GLIBC_2.2.5 (2)
7: 0000000000000000 0 FUNC GLOBAL DEFAULT UND exit@GLIBC_2.2.5 (2)
8: 0000000000000000 0 FUNC GLOBAL DEFAULT UND sleep@GLIBC_2.2.5 (2)
Symbol table '.symtab' contains 51 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000004002e0 0 SECTION LOCAL DEFAULT 1
2: 0000000000400300 0 SECTION LOCAL DEFAULT 2
3: 0000000000400320 0 SECTION LOCAL DEFAULT 3
4: 0000000000400340 0 SECTION LOCAL DEFAULT 4
5: 0000000000400378 0 SECTION LOCAL DEFAULT 5
6: 0000000000400398 0 SECTION LOCAL DEFAULT 6
7: 0000000000400470 0 SECTION LOCAL DEFAULT 7
8: 00000000004004cc 0 SECTION LOCAL DEFAULT 8
9: 00000000004004e0 0 SECTION LOCAL DEFAULT 9
10: 0000000000400500 0 SECTION LOCAL DEFAULT 10
11: 0000000000400530 0 SECTION LOCAL DEFAULT 11
12: 0000000000401000 0 SECTION LOCAL DEFAULT 12
13: 0000000000401020 0 SECTION LOCAL DEFAULT 13
14: 0000000000401090 0 SECTION LOCAL DEFAULT 14
15: 00000000004010f0 0 SECTION LOCAL DEFAULT 15
16: 0000000000401238 0 SECTION LOCAL DEFAULT 16
17: 0000000000402000 0 SECTION LOCAL DEFAULT 17
18: 0000000000402040 0 SECTION LOCAL DEFAULT 18
19: 0000000000403e50 0 SECTION LOCAL DEFAULT 19
20: 0000000000403ff0 0 SECTION LOCAL DEFAULT 20
21: 0000000000404000 0 SECTION LOCAL DEFAULT 21
22: 0000000000404048 0 SECTION LOCAL DEFAULT 22
23: 0000000000000000 0 SECTION LOCAL DEFAULT 23
24: 0000000000000000 0 FILE LOCAL DEFAULT ABS hello.c
25: 0000000000000000 0 FILE LOCAL DEFAULT ABS
26: 0000000000403e50 0 NOTYPE LOCAL DEFAULT 19 __init_array_end
27: 0000000000403e50 0 OBJECT LOCAL DEFAULT 19 _DYNAMIC
28: 0000000000403e50 0 NOTYPE LOCAL DEFAULT 19 __init_array_start
29: 0000000000404000 0 OBJECT LOCAL DEFAULT 21 _GLOBAL_OFFSET_TABLE_
30: 0000000000401230 5 FUNC GLOBAL DEFAULT 15 __libc_csu_fini
31: 0000000000404048 0 NOTYPE WEAK DEFAULT 22 data_start
32: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@@GLIBC_2.2.5
33: 000000000040404c 0 NOTYPE GLOBAL DEFAULT 22 _edata
34: 0000000000401238 0 FUNC GLOBAL HIDDEN 16 _fini
35: 0000000000000000 0 FUNC GLOBAL DEFAULT UND printf@@GLIBC_2.2.5
36: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@@GLIBC_
37: 0000000000404048 0 NOTYPE GLOBAL DEFAULT 22 __data_start
38: 0000000000000000 0 FUNC GLOBAL DEFAULT UND getchar@@GLIBC_2.2.5
39: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
40: 0000000000402000 4 OBJECT GLOBAL DEFAULT 17 _IO_stdin_used
41: 00000000004011c0 101 FUNC GLOBAL DEFAULT 15 __libc_csu_init
42: 0000000000404050 0 NOTYPE GLOBAL DEFAULT 22 _end
43: 0000000000401120 5 FUNC GLOBAL HIDDEN 15 _dl_relocate_static_pie
44: 00000000004010f0 47 FUNC GLOBAL DEFAULT 15 _start
45: 000000000040404c 0 NOTYPE GLOBAL DEFAULT 22 __bss_start
46: 0000000000401125 146 FUNC GLOBAL DEFAULT 15 main
47: 0000000000000000 0 FUNC GLOBAL DEFAULT UND atoi@@GLIBC_2.2.5
48: 0000000000000000 0 FUNC GLOBAL DEFAULT UND exit@@GLIBC_2.2.5
49: 0000000000000000 0 FUNC GLOBAL DEFAULT UND sleep@@GLIBC_2.2.5
50: 0000000000401000 0 FUNC GLOBAL HIDDEN 12 _init
Histogram for bucket list length (total of 3 buckets):
Length Number % of total Coverage
Version symbols section '.gnu.version' contains 9 entries:
Addr: 0x00000000004004cc Offset: 0x0004cc Link: 6 (.dynsym)
000: 0 (*local*) 2 (GLIBC_2.2.5) 2 (GLIBC_2.2.5) 2 (GLIBC_2.2.5)
004: 2 (GLIBC_2.2.5) 0 (*local*) 2 (GLIBC_2.2.5) 2 (GLIBC_2.2.5)
Version needs section '.gnu.version_r' contains 1 entry:
Addr: 0x00000000004004e0 Offset: 0x0004e0 Link: 7 (.dynstr)
000000: Version: 1 File: libc.so.6 Cnt: 1
0x0010: Name: GLIBC_2.2.5 Flags: none Version: 2
Displaying notes found in: .note.gnu.property
GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0
Properties: x86 feature: IBT, SHSTK
Displaying notes found in: .note.ABI-tag
GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag)
1 ELF header中,Type发生了变化,从REL变成了EXEC,节头部数量变为27个。
2 注意到链接后符号表中的符号数量迅速增加。 表示其他库函数的许多符号链接在一起并添加到符号表中后会被使用。
5.4 hello的虚拟地址空间
5.5 链接的重定位过程分析
不同于hello.o只有main,hello中有各个调用到的函数
2:重定位部分中的符号引用,在这一步中,链接器将修改对代码和数据中每个符号的引用,以指向正确的运行时地址。
5.6 hello的执行流程
5.7 Hello的动态链接分析
动态共享库是一项解决静态库缺点的现代创新。共享库是一个对象模块,可以在运行或加载时加载到任意内存地址并与程序链接。这个过程称为动态链接。
程序按照模块划分为相对独立的部分,在程序运行时将它们链接在一起形成一个完整的程序,而不是像静态链接那样将所有程序模块链接成一个单独的可执行文件。
.plt:一个数组,每个元素都是一个 16 字节的数据。 PLT[0] 是跳转到动态链接器的特殊条目。可执行程序调用的每个库函数都有自己的 PLT 条目。每个条目负责调用一个特定的函数。
5.8 本章小结
第6章 hello进程管理
6.1 进程的概念与作用
6.2 简述壳Shell-bash的作用与处理流程
作用:shell-bash给用户提供一个界面来访问操作系统内核的服务。
6.3 Hello的fork进程创建过程
6.4 Hello的execve过程
创建shell子进程后子进程调用 exceve 函数来加载和运行新程序。这就是当前子进程上下文中的 hello 程序。需要执行以下步骤:
3共享空间映射 如果一个Hello 程序与libc.so 标准C 库等共享对象相关联,则这些对象与程序是动态关联的。然后将其映射到用户虚拟地址空间中的共享空间。
4 设置程序计数器(PC) exceve 做的最后一件事就是将当前进程上下文中的PC设置为指向代码区域的开头。
6.5 Hello的进程执行
Hello通常在用户模式进行,访问权限受限,个别函数调用使其进入内核模式,有完全的权限
如果系统调用在等待事件时被阻塞,内核可以让当前进程休眠并切换到另一个进程。上下文是内核重新启动抢占进程所需的状态,是一种比较高级的异常控制。流动。
在调度进程的过程中,操作系统主要做了两件事:加载保存的寄存器和切换虚拟地址空间。
6.6 hello的异常与信号处理
6.7本章小结
由本章可见,进程垄断整个CPU和内存空间只是一种假象。实际上多个进程通过操作系统的进程调度机制获得这一假象。
第7章 hello的存储管理
7.1 hello的存储器地址空间
物理地址:加载到内存地址寄存器中的地址,内存单元的真实地址。 CPU通过地址总线的寻址找到真正物理内存对应的地址。 在前端总线上传输的内存地址都是物理内存地。
线性地址:线性地址是逻辑地址到物理地址转换之间的中间层。 在一个分段单元中,逻辑地址就是段中的偏移地址,再加上基地址就是线性地址。
逻辑地址:指程序生成的与段相关的偏移地址部分,以[段标识符:段内偏移]的形式表示,由段标识符加上相对地址在段内的偏移组成 段。
7.2 Intel逻辑地址到线性地址的变换-段式管理
在Intel平台下,逻辑地址格式为段标识符:段内偏移。段标识符由一个称为段选择器的 16 位字段组成,前 13 位是索引号,后 3 位包含一些硬件细节。分段机制将逻辑地址转换为线性地址的步骤如下:
通过使用段选择器中的偏移值,在 GDT 或 LDT 表中找到相关的段描述符。
将段描述符中获得的段的基地址添加到偏移量。最后创建一个线性地址
7.3 Hello的线性地址到物理地址的变换-页式管理
实际内存被分为页,VM中也分为一样大小的页,每个进程有一个页表,保存VM的页到实际内存的页的映射状态
7.4 TLB与四级页表支持下的VA到PA的变换
从VA到PA的转化需要访问页表,但直接向内存访问页表可能十分缓慢,即使页表在或者部分在缓存中也是,因此在CPU中设置了专门的缓存用于保存一部分页表
直接保存页表占用的空间会较大,而页表中大部分通常是空白的,因此使用四级页表:一种类似指针实现的线段树的结构,来保存页表,特点是连续空白的页表段实际上只会占用极少的空间来存储
实际操作:CPU首先向TLB查找页表条目,查找不到则在四级页表中查找对应条目并更新缓存
7.5 三级Cache支持下的物理内存访问
7.6 hello进程fork时的内存映射
fork后的子进程的VM为父进程VM的副本,同时使用copy-on-write机制,使得两个进程看起来好像独占内存,互不干扰
7.7 hello进程execve时的内存映射
exec以指定程序的内容来更新进程VM,因此导致虚拟内存中一些页被删除,一些页被分配
7.8 缺页故障与缺页中断处理
7.9动态存储分配管理
malloc free提供动态地申请和释放空间的功能,申请时从内存中找足够长的连续未分配段,占用并返回,释放时将这些段标记为空闲
另一种方式是将内存分为多种固定大小的段,确保段的长度始终是某一预设值,有多种策略进行段的分裂和合并
7.10本章小结
第8章 hello的IO管理
8.1 Linux的IO设备管理方法
8.2 简述Unix IO接口及其函数
基本函数是open()close()read()write()实现字面意义上的功能,其中read write需要指定长度,直接使用可能不便、低效
8.3 printf的实现分析
int printf(const char *fmt, ...)
va_list arg = (va_list)((char*)(&fmt) + 4);
调用vsprintf以实现格式化字符串,然后用write函数输出,write函数调用系统函数完成输出过程
int vsprintf(char *buf,const char *fmt,va_list args)
itoa(tmp, *((int *)p_next_arg));
8.4 getchar的实现分析
static char* bb=buf;//指向缓冲区的第一个位置的指针
return(--n>=0)?(unsigned char)*bb++:EOF;
首先这里设置了缓冲区,以免每次都要调用系统函数read(这样较慢)
8.5本章小结
本章简要介绍Linux系统的IO管理,简要介绍IO接口和UNIX功能,分析printf和getchar的使用,通过这些分析展示程序如何获取用户输入并在屏幕上打印数据。 . 展示了 IO 管理的强大功能
结论
2.预处理:预处理器对hello.c进行处理,将所有调用的外部库进行扩展合并,生成一个hello.i文件。
4.汇编:汇编器将hello.s文件转换为二进制格式的hello.o可移动目标文件。
5. 链接:链接器将 hello.o 与库链接并移动以创建可执行的 hello。
6、创建子进程:用户在shell中输入命令运行Hello后,shell通过fork创建进程。
7.加载:Shell调用execve,在上下文中加载hello可执行文件,并启动hello。
8. 执行:hello程序正在运行,在此过程中可能会产生异常,需要通过信号处理器调用来处理用户键盘输入ctrl+z、ctrl+c等信号。在运行程序的过程中,Hello 还使用了几种复杂的内存访问机制。
9. 终止:Hello 程序在收到信号后停止或停止。主要流程已经结束。并且 hello 子进程被回收。内核会删除内存中为hello生成的相关数据。
感悟:
操作系统通过多个层面的配合(进程、VM等)使得程序可以认为自己独立地占用整个机器,这是复杂但十分有效、十分重要的机制
附件
hello.c:C语言源程序
hello.i:hello.c预处理的文本文件
hello.s:hello.i编译后的汇编文件
hello.o:hello.s汇编后的可重定位(relocatable)文件
hello.o.elf.txt:hello.o经过readelf得到的文本文件
hello:可执行文件
hello.elf.txt:hello经readelf得到的文本文件
hello.o.s:hello.o经objdump得到的汇编代码
hello.oo:hello.oo经objdump得到的汇编代码
参考文献
[1] Computer Systems A Programmer's Perspective
[2] https://www.tutorialspoint.com/unix_commands/readelf.htm
[3] https://www.tutorialspoint.com/unix_commands/objdump.htm
哈尔滨工业大学-计算机系统-2022春-大作业相关推荐
- 哈尔滨工业大学计算机系统大作业2022春
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算机 学 号 120L02**** 班 级 2003005 学 生 无敌飞龙 指 导 教 ...
- 哈尔滨工业大学 计算机系统 大作业 22春
计算机系统大作业 计算机科学与技术学院 2022年5月 摘 要 摘要是论文内容的高度概括,应具有独立性和自含性,即不阅读论文的全文,就能获得必要的信息.摘要应包括本论文的目的.主要内容.方法.成果及其 ...
- 2023春 哈尔滨工业大学计算机系统大作业
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 物联网工程 学 号 2021111491 班 级 2137301 学 生 业知翰 指 ...
- 哈尔滨工业大学 计算机系统大作业
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算机类 学 号 120L022010 班 级 2003007 学 生 窦馨宇 指 导 教 ...
- 哈尔滨工业大学计算机系统大作业--程序人生
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算机科学与技术 学 号 2021110xxx ...
- [ HIT - CSAPP ] 哈尔滨工业大学 - 计算机系统 - 期末大作业“Hello‘s P2P’”
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算学部 学 号 120L020731 班 级 2003005 学 生 吴少杰 指 导 ...
- 哈尔滨工业大学计算机系统大作业
计算机科学与技术学院 2021年5月 摘 要 本篇论文分析了程序hello的p2p,020过程,根据书籍<深入理解计算机系统>,对从hello程序的编译,到hello程序的运行的整体过程 ...
- 哈尔滨工业大学计算机系统大作业——程序人生-Hello’s P2P
目录 摘要 第1章 概述 1.1 Hello简介 1.1.1 P2P:From Program to Process 1.1.2 020:From Zero-0 to Zero-0 1.2 环境与工具 ...
- 程序人生-Hello’s P2P——哈尔滨工业大学计算机系统大作业
摘 要 在这篇文章中,我们主要探究hello程序从几行源代码到真正变成一个程序,实现自身功能,最后被回收的过程.在这个过程中,我们按照课程知识体系的流程,一步步对hello进行分析阐述,分析程序在计 ...
最新文章
- Python 21 Flask(二)上下文管理详解
- 盘点 | 近期活动信息都在这里啦~
- Jmeter连接mysql(一)
- excel 公式 单引号 concat_从Excel的数据类型说Python
- TCP/IP网络协议栈:IP协议
- Graham-Scan小总结——toj2317 Wall
- MTK FM收音机修改门限减少杂台
- knockoutjs 读源码
- 计算机word题目设置标题,word文档标题怎么设置?word设置标题样式的方法
- ECMAScript基础
- c语言:数据保存的方法实现简易贪吃蛇
- 计算机电路英文专业翻释术语,电子专业词汇翻译中英文对照(新手必备知识)
- 分享 2022 年最受欢迎的黑科技工具(二)
- 自动化重复文件清理 Bash 脚本
- html5怎么让图片垂直居中显示,css中如何实现图片垂直居中显示?
- 献给那些有梦想的程序员'
- 中国流动人口数据(cmds)
- 编程图记(2): 学用PHP框架Laravel
- 基于.net6.0在wpf桌面应用中发布webApi服务示例
- SMBJ5.0A-TR介绍