程序人生-Hello’s P2P

计算机系统

大作业

题 目 程序人生-Hello’s P2P
专 业 计算机科学与技术
学   号 1180300317
班   级 1803003
学 生 杨铭涛    
指 导 教 师 史先俊

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

摘 要
“Hello world!”应该是每一个学习写程序的人写出的第一个代码。程序员们大多知到如何写代码,却不一定知到代码在计算机中是如何运行的。本论文将以最简单的helloworld程序为例,阐述程序在计算机中的运行,以帮助进一步理解计算机系统工作原理。

关键词:helloworld;P2P;O2O;程序运行;进程;流程;计算机系统

目 录

第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简介
P2P: From Program to Process 。linux中,hello.c经过cpp的预处理、ccl的编译、as的汇编、ld的链接最终成为可执行目标程序hello,在shell中键入启动命令后,shell为其fork产生子进程的过程。

020: shell通过execve加载并执行hello,映射虚拟内存,进入程序入口后程序开始载入物理内存,然后进入 main函数执行目标代码,CPU为运行的hello分配时间片执行逻辑控制流。当程序运行结束后,shell父进程负责回收hello进程,内核删除相关数据结构。
1.2 环境与工具
硬件环境:X64 CPU ,2.50GHz , 8G RAM
软件环境:Windows 10 64位 ,Vmware 14 ,Ubuntu 16.04 LTS 64 位
开发工具:gcc + gedit , Codeblocks , gdb edb
1.3 中间结果
hello.c :hello源代码

hello.i :预处理后的文本文件

hello.s :hello.i编译后的汇编文件

hello.o :hello.s汇编后的可重定位目标文件

hello :链接后的可执行文件
1.4 本章小结
本章对hello程序进行了简单的介绍,分析了其P2P和020的过程,列出了本次任务的环境和工具,并且阐明了任务过程中出现的中间产物及其作用。

第2章 预处理
2.1 预处理的概念与作用
预处理一般是指在程序源代码被翻译为目标代码的过程中,生成二进制代码之前的过程。典型地,由预处理器对程序源代码文本进行处理,得到的结果再由编译器核心进一步编译。这个过程并不对程序的源代码进行解析,但它把源代码分割或处理成为特定的单位——(用C/C++的术语来说是)预处理记号用来支持语言特性(如C/C++的宏调用)。

2.2在Ubuntu下预处理的命令
命令:gcc -E hello.c -o hello.i
在这里插入图片描述2.3 Hello的预处理结果解析

在main函数之前,预处理器(cpp)读取头文件stdio.h 、stdlib.h 、和unistd.h中的内容,三个系统头文件依次展开。比如stdio.h的展开,打开usr/include/stdio.h发现了其中还含有#开头的宏定义等,预处理器会对此继续递归展开,最终的.i程序中没有#define,并且针对#开头的条件编译语句,cpp根据#if后面的条件决定需要编译的代码。
在这里插入图片描述main函数在.i文件的最后部分,前面的部分分别是.c源程序文件名、命令行参数、环境变量,对包含的.h头文件的预处理,用绝对路径将其替代,标准C库中一些数据类型的声明,结构体的定义,对引用的外部函数的声明。
2.4 本章小结
预处理过程进行替换代码文本的工作,是编译前的准备步骤,没有检查源程序语法正确性,没有对语法进行修改。这是从.c源程序到可执行文件的第一步。

第3章 编译
3.1 编译的概念与作用

将便于人编写、阅读、维护的高级计算机语言所写作的源代码程序,翻译为计算机能解读、运行的低阶机器语言的程序,也就是可执行文件。编译器将原始程序作为输入,翻译产生使用目标语言的等价程序。源代码一般为高级语言,如Pascal、C、C++、C# 、Java等,而目标语言则是汇编语言或目标机器的目标代码,有时也称作机器代码。

3.2 在Ubuntu下编译的命令
命令:gcc -S hello.i -o hello.s在这里插入图片描述3.3 Hello的编译结果解析

3.3.1 开头部分
在这里插入图片描述
.file:源文件名
.globl:全局变量
.data:数据段
.align:对齐方式
.type:指定是对象类型或是函数类型
.size:大小
.long:长整型
.section .rodata:下面是.rodata节
.string:字符串
.text:代码段

3.3.2 数据部分
hello.s中C语言的数据类型主要有:局部变量、指针数组。
1.int argc:argc是函数传入的第一个int型参数,存储在%edi中。
2.char* argv:argv是函数获知的指针数组。
3. int i;局部变量,通常保存在寄存器或是栈中。根据movl $0, -4(%rbp)操作可知i的数据类型占用了4字节的栈空间。
4.常量,hello.s中一些如同4、1等常量以立即数形式($4、$1……)出现。

3.3.3 赋值
在这里插入图片描述
这个语句的作用是对局部变量i的赋值,等价于i=0。

3.3.4 算术操作
在这里插入图片描述
此语句对应for循环中的i++操作。

3.3.5 关系操作
在这里插入图片描述
(1)此语句是for循环中的控制部分,对应i<8语句的作用。
在这里插入图片描述
(2)此语句对应argc!=4,在读取*argv[]数组时起到作用。

3.3.6 数组/指针/结构操作
在这里插入图片描述
argv[]数组是一个指针数组,数组元素是指针变量,指针变量存储的是字符串的地址,即指针数组存储了字符串的地址,argv[i]即为指针数组中第i个字符串的地址。char 数据类型占8个字节,由(%rax)和%rax&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值