程序人生-Hello’s P2P

计算机系统

大作业

题 目 程序人生-Hello’s P2P
专 业 计算机类
学   号 1180300209
班   级 1803002
学 生 刘英    
指 导 教 师 史先俊

计算机科学与技术学院
2019年12月

摘 要

hello.c是程序员第一个接触到的程序,也是几乎每个IDE都自带的第一个运行起来的程序。新人从hello.c中发现编程的乐趣,IDE用hello.c来检验环境是否安装成功。
本文主要介绍了从程序员点击编译按钮的那一刻起,到hello完全死亡计算机所做的一切,包括预处理、编译、汇编、链接、进程管理、存储管理和I/O管理。
通过本文,可以更加深入的理解计算机系统,将本门课程所学联系在一起,通过一个简单的例子,认识一个庞大精细的系统。每一步都做了细致的分解,应有的扩展。

关键词:hello、系统、生命周期

目 录

第1章 概述 - 4 -
1.1 HELLO简介 - 4 -
1.2 环境与工具 - 4 -
1.3 中间结果 - 4 -
1.4 本章小结 - 4 -
第2章 预处理 - 5 -
2.1 预处理的概念与作用 - 5 -
2.2在UBUNTU下预处理的命令 - 5 -
2.3 HELLO的预处理结果解析 - 5 -
2.4 本章小结 - 5 -
第3章 编译 - 6 -
3.1 编译的概念与作用 - 6 -
3.2 在UBUNTU下编译的命令 - 6 -
3.3 HELLO的编译结果解析 - 6 -
3.4 本章小结 - 6 -
第4章 汇编 - 7 -
4.1 汇编的概念与作用 - 7 -
4.2 在UBUNTU下汇编的命令 - 7 -
4.3 可重定位目标ELF格式 - 7 -
4.4 HELLO.O的结果解析 - 7 -
4.5 本章小结 - 7 -
第5章 链接 - 8 -
5.1 链接的概念与作用 - 8 -
5.2 在UBUNTU下链接的命令 - 8 -
5.3 可执行目标文件HELLO的格式 - 8 -
5.4 HELLO的虚拟地址空间 - 8 -
5.5 链接的重定位过程分析 - 8 -
5.6 HELLO的执行流程 - 8 -
5.7 HELLO的动态链接分析 - 8 -
5.8 本章小结 - 9 -
第6章 HELLO进程管理 - 10 -
6.1 进程的概念与作用 - 10 -
6.2 简述壳SHELL-BASH的作用与处理流程 - 10 -
6.3 HELLO的FORK进程创建过程 - 10 -
6.4 HELLO的EXECVE过程 - 10 -
6.5 HELLO的进程执行 - 10 -
6.6 HELLO的异常与信号处理 - 10 -
6.7本章小结 - 10 -
第7章 HELLO的存储管理 - 11 -
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 -
7.9动态存储分配管理 - 11 -
7.10本章小结 - 12 -
第8章 HELLO的IO管理 - 13 -
8.1 LINUX的IO设备管理方法 - 13 -
8.2 简述UNIX IO接口及其函数 - 13 -
8.3 PRINTF的实现分析 - 13 -
8.4 GETCHAR的实现分析 - 13 -
8.5本章小结 - 13 -
结论 - 14 -
附件 - 15 -
参考文献 - 16 -

第1章 概述

1.1 Hello简介

根据Hello的自白,利用计算机系统的术语,简述Hello的P2P,020的整个过程。
P2P:From Program to Prcess,程序Program从键盘输入,存入磁盘,经过预处理、编译、汇编、链接,最终生成可执行程序hello
然后向shell输入”./hello”,运行hello时shell为其fork子进程,然后shell通过execve映射虚拟内存,并且hello中的代码和数据被载入驻村,然后CPU开始执行hello程序中的目标代码。CPU为hello分配时间片,执行逻辑控制流,当程序运行结束后,shell父进程负责回收hello进程,内核删除相关数据结构,于是hello“从0到0”结束了。

1.2 环境与工具

X64 CPU;2GHz;2G RAM;256GHD Disk 以上
Windows7 64位以上;VirtualBox/Vmware 11以上;Ubuntu 16.04 LTS 64位/优麒麟 64位;
Visual Studio 2010 64位以上;CodeBlocks;vi/vim/gpedit+gcc

1.3 中间结果

文件名 作用
hello.i 分析预处理过程的作用
hello.s 分析编译阶段的作用
hello.o 可重定位目标文件
hello.elf 可重定位目标文件ELF文件
hello.asm 可重定位目标文件反汇编
hello 可执行目标文件
hello.ldelf 可执行的目标文件ELF格式
hello.asm1 可执行的目标文件反汇编

1.4 本章小结

本章概述了hello的简介,实验所使用的环境和工具,以及生成的中间结果

第2章 预处理

2.1 预处理的概念与作用

预处理一般是指在程序源代码被翻译为目标代码的过程中,生成二进制代码之前的过程。典型地,由预处理器(preprocessor) 对程序源代码文本进行处理,得到的结果再由编译器核心进一步编译。这个过程并不对程序的源代码进行解析,但它把源代码分割或处理成为特定的单位——(用C/C++的术语来说是)预处理记号(preprocessing token)用来支持语言特性(如C/C++的宏调用)。
C/C++预处理
最常见的预处理是C语言和C++语言。ISO C和ISO C++都规定程序由源代码被翻译分为若干有序的阶段(phase),通常前几个阶段由预处理器实现。预处理中会展开以#起始的行,试图解释为预处理指令(preprocessing directive) ,其中ISO C/C++要求支持的包括#if/#ifdef/#ifndef/#else/#elif/#endif(条件编译)、#define(宏定义)、#include(源文件包含)、#line(行控制)、#error(错误指令)、#pragma(和实现相关的杂注)以及单独的#(空指令)。
主要有三个方面的内容: 1.宏定义; 2.文件包含; 3.条件编译。 预处理命令以符号“#”开头。
预处理指令一般被用来使源代码在不同的执行环境中被方便的修改或者编译。

2.2在Ubuntu下预处理的命令

gcc -E hello.c -o hello.i
在这里插入图片描述

2.3 Hello的预处理结果解析

在这里插入图片描述
hello.c经过预处理之后仍为一个C程序,不同的是文件变大了,由原来的24行增至3043行。在原来的程序之前添加了外部引用的函数库、类型定义、结构体。进行了宏展开和文件包含处理。经过预处理,原C程序的头文件被插入。

2.4 本章小结

预处理一般不会对C程序产生较大的改动,但会影响到代码头部包含的头文件、宏定义和条件编译,插入头文件的内容,使代码量大大增加;将宏名替换为文本;对于条件编译:使用条件编译使目标程序变小,仅编译满足条件的程序段。

第3章 编译

3.1 编译的概念与作用

编译程序的基本功能是把源程序(高级语言)翻译成目标程序。但是,作为一个具有实际应用价值的编译系统,除了基本功能之外,还应具备语法检查、调试措施、修改手段、覆盖处理、目标程序优化、不同语言合用以及人机联系等重要功能。
而这儿的编译是指从 .i 到 .s 即预处理后的文件到生成汇编语言程序,该程序是一个可重定位目标文件。
编译程序的实现算法较为复杂。这是因为它所翻译的语句与目标语言的指令不是一一对应关系,而是一多对应关系;同时也因为它要处理递归调用、动态存储分配、多种数据类型,以及语句间的紧密依赖关系。
文件编译完成后,将C语言的数据与操作和汇编语言联系起来,分配了寄存器,还可以使用不同的编译选项对源程序进行优化,如-Og不优化,-O1优化,-O2更高级的优化。

3.2 在Ubuntu下编译的命令

gcc -S hello.i -o hello.s

在这里插入图片描述

3.3 Hello的编译结果解析

3.3.1 数据:常量、变量(全局/局部/静态)、表达式、类型、宏

只读数据:string “用法: Hello 学号 姓名 秒数!\n”
string “Hello %s %s\n”
局部变量 i, argc, argv
movl %edi, -20(%rbp) //edi存入%rbp-20 (argc)
movq %rsi, -32(%rbp) //rsi存入%rbp-32 (argv地址)
movl $0, -4(%rbp) //%rbp-4存放局部变量i的值

3.3.2 赋值 = ,逗号操作符,赋初值/不赋初值

leaq .LC0(%rip), %rdi //相对寻址,“用法: Hello 学号 姓名 秒数!\n”
leaq .LC1(%rip), %rdi // “Hello %s %s\n”
movl $0, -4(%rbp) //赋初值i=0

3.3.3 类型转换(隐式或显式) unsigned/char/int/long/float/double

3.3.4 Sizeof

subq $32, %rsp //栈顶指针减32, 4*sizeof(pointer) 存放argv[]的4个元素

3.3.5 算术操作:+ - * / % ++ – 取正/负± 复合“+=”等

addl $1, -4(%rbp) //i++

3.3.6 逻辑/位操作:逻辑&& || ! 位 & | ~ ^ 移位>> << 复合操作如 “|=” 或“<<=”等

3.3.7 关系操作:== != > < >= <=

cmpl $4, -20(%rbp)
je .L2 //条件跳转指令,argc==4 则跳转到.L2
cmpl $7, -4(%rbp) //共循环8次
jle .L4 //%rbp-4的内存数值 <= 7? 跳转

3.3.8 数组/指针/结构操作:A[i] &v *p
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值