计算机科学与技术学院

2021年5月

摘  要

摘要是论文内容的高度概括,应具有独立性和自含性,即不阅读论文的全文,就能获得必要的信息。摘要应包括本论文的目的、主要内容、方法、成果及其理论与实际意义。摘要中不宜使用公式、结构式、图表和非公知公用的符号与术语,不标注引用文献编号,同时避免将摘要写成目录式的内容介绍。

关键词:预处理;汇编;编译;进程;内存                            

(摘要0分,缺失-1分,根据内容精彩称都酌情加分0-1分

目  录

第1章 概述

1.1 Hello简介

1.2 环境与工具

1.3 中间结果

1.4 本章小结

第2章 预处理

2.1 预处理的概念与作用

2.2在Ubuntu下预处理的命令

2.3 Hello的预处理结果解析

2.4 本章小结

第3章 编译

3.1 编译的概念与作用

3.2 在Ubuntu下编译的命令

3.3 Hello的编译结果解析

3.4 本章小结

第4章 汇编

4.1 汇编的概念与作用

4.2 在Ubuntu下汇编的命令

4.3 可重定位目标elf格式

4.4 Hello.o的结果解析

4.5 本章小结

第5章 链接

5.1 链接的概念与作用

5.2 在Ubuntu下链接的命令

5.3 可执行目标文件hello的格式

5.4 hello的虚拟地址空间

5.5 链接的重定位过程分析

5.6 hello的执行流程

5.7 Hello的动态链接分析

5.8 本章小结

第6章 hello进程管理

6.1 进程的概念与作用

6.2 简述壳Shell-bash的作用与处理流程

6.3 Hello的fork进程创建过程

6.4 Hello的execve过程

6.5 Hello的进程执行

6.6 hello的异常与信号处理

6.7本章小结

第7章 hello的存储管理

7.1 hello的存储器地址空间

7.2 Intel逻辑地址到线性地址的变换-段式管理

7.3 Hello的线性地址到物理地址的变换-页式管理

7.4 TLB与四级页表支持下的VA到PA的变换

7.5 三级Cache支持下的物理内存访问

7.6 hello进程fork时的内存映射

7.7 hello进程execve时的内存映射

7.8 缺页故障与缺页中断处理

7.9动态存储分配管理

7.10本章小结

第8章 hello的IO管理

8.1 Linux的IO设备管理方法

8.2 简述Unix IO接口及其函数

8.3 printf的实现分析

8.4 getchar的实现分析

8.5本章小结

结论

附件

参考文献

第1章 概述

1.1 Hello简介

根据Hello的自白,利用计算机系统的术语,简述Hello的P2P,020的整个过程。

P2P:From Program to Process,说的就是程序(Program),即静态的指令的有序集合,变为动态的进程的过程,进程(Process)是计算机中的程序关于某数据集合上的一次运行活动

O2O:From Zero-0 to Zero-0,说的就是进程从最开始的无(执行之前),通过shell的fork,由父进程产生了子进程hello,变为有(执行中),指令完成后,又收到内核发来的信号,被父进程回收,归于无(执行后)这样的一个从无(zero)到有最终到无(zero)的过程。

1.2 环境与工具

列出你为编写本论文,折腾Hello的整个过程中,使用的软硬件环境,以及开发与调试工具。

硬件:X64 CPU;2GHz;2G RAM;256GHD Disk

软件:Windows7 64;Vmware 11;Ubuntu 16.04 LTS 64位;

工具:Visual Studio 2010 64;CodeBlocks 64位;vi/vim/gedit+gcc

1.3 中间结果

列出你为编写本论文,生成的中间结果文件的名字,文件的作用等。

hello.i

hello.c经过预处理后生成的修改了的源程序

hello.s

hello.i经过编译后生成的汇编程序

hello.o

hello.s经过汇编后生成的可重定位目标程序

hello

hello.o经过链接后生成的可执行目标程序

1.4 本章小结

本章介绍了本次实验任务,所使用的工具,涉及到的文件等实验基本信息。

(第1章0.5分)

第2章 预处理

2.1 预处理的概念与作用

概念:C语言的源程序加工包括三步:预处理、编译和连接。所谓的预处理是指在进行正式编译(此法分析,代码生成,优化等)之前所做的工作。

作用:预处理是C语言的一个重要的功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理命令部分做处理,处理完毕自动进入对源程序的编译。

预处理命令有多种,除文件包含(用#include),宏定义(#define M 10)外,还包括一种称为条件编译的预处理命令。

2.2在Ubuntu下预处理的命令

图一

使用GCC-E进行预处理之后,得到.i文件

图二

2.3 Hello的预处理结果解析

图三

图四

用记事本打开,可以看到内容是对于宏定义,文件包含等内容的基本分析,而程序本体则在第三千多行,可以看出并没有太大变化

2.4 本章小结

这一章介绍的是预编译的概念和效果,是写好的程序迈向进程的第一步。

(第2章0.5分)

第3章 编译

3.1 编译的概念与作用

概念:编译过程是整个程序构建的核心部分,编译成功,会将源代码由文本形式转换成机器语言。

作用:编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析以及优化后生成相应的汇编代码文件。

注意:这儿的编译是指从 .i 到 .s 即预处理后的文件到生成汇编语言程序

3.2 在Ubuntu下编译的命令

图五

编译指令:gcc -S hello.i -o hello.s

3.3 Hello的编译结果解析

图六

指令执行完毕后得到.s后缀的文件,内容如上图所示

图七

3.3.1数据声明系列

(1).file 声明文件

例:

图八

声明hello.c文件

  1. .text 声明代码段

例图九

从这里开始是代码

  1. .rodata 表示只读数据

例图十

(4).align 声明地址的对齐方式

例图十一

表示地址按8位对齐

(5).globl.type声明函数

例图十二

声明main函数

3.3.2赋值系列

图十三

有直接声明并赋初值的,也有使用mov指令进行赋值如下图

3.3.3类型转换系列

图十四

3.3.4算术操作系列

图十五

文件直接使用了简单的add指令来加以及sub指令来减,直白明了

3.3.5关系操作系列

对于大小比较,大于等于小于等于之类的操作,文件使用的是cmp函数

图十六

然后根据结果改变标志位,再根据标志位决定是否跳转

图十七

通过使用不同标准的jump指令来达到比较大小的效果

3.3.6控制转移系列

文件中用到了两种办法

第一种同上,通过cmp和jump函数共同完成比大小和跳转的操作来实现控制转移

图十八

第二种则是直接使用call函数进行控制转移

图十九

3.3.7函数操作系列

传参往往直接使用move函数把数据放进寄存器或指定内存地址来实现

图二十

在调用函数时直接call转移

图二十一

而局部变量则往往用到立即数和寄存器

图二十二

最后通过return完成函数返回

图二十三

3.4 本章小结

本章是汇编语言的介绍与探索,汇编语言比起高级语言晦涩难懂,却也不是完全不可读的机械语言,对于计算机系统底层运行的理解有着重要意义。

(第3章2分)

第4章 汇编

4.1 汇编的概念与作用

概念:汇编指的是把编译好的.s文件转换成机器能识别的二进制程序的过程

作用:汇编后机器才能识别这种语言并执行命令

注意:这儿的汇编是指从 .s 到 .o 即编译后的文件到生成机器语言二进制程序的过程。

4.2 在Ubuntu下汇编的命令

使用gcc -c hello.s -o hello.o

图二十四

即可得到.o文件

图二十五

4.3 可重定位目标elf格式

通过readelf -a hello.o > hello.elf,我们得到了.elf文件

图二十六

他的组成如下:

图二十七

首先是elf头文件,包含了文件最基本的信息

2然后是节头,包含.text,.bss,.data等信息

图二十八

3再之后是重定位节,涉及程序中多次跳转对应的位置

图二十九

4.4 Hello.o的结果解析

使用命令objdump -d -r hello.o > helloobj.txt获得反汇编代码,与.s文件对比发现差异如下:

在控制转移或跳转时,.s文件采取了L1L2这样的分段跳转或者直接跳转函数名,而反汇编则直接使用地址来完成跳转

图三十

(反汇编调用地址)

图三十一

(.s文件调用代码段)(.s文件调用函数名)

在涉及具体数字时,反汇编文件里采用的是16进制

图三十二,而.s文件采用的是10进制

图三十三

相比.s文件按代码段进行划分,反汇编文件直接采取内存地址给每段代码标上号,如下图

图三十四

4.5 本章小结

本阶段完成了对hello.s的汇编工作。同时使用汇编指令将其转换为.o可重定位目标文件。此外,本章还通过将.o文件反汇编,并与.s汇编程序代码进行比较,探究了二者之间的差别

(第4章1分)

5 链接

5.1 链接的概念与作用

概念:链接是将各种代码个数据片段收集并组合成一个单一文件的过程,这个文件可被加载到内存并执行

作用:链接后的文件整合了之前的工作,变得真正可以执行

注意:这儿的链接是指从 hello.o 到hello生成过程。

5.2 在Ubuntu下链接的命令

图三十五之后我们就得到了图三十六文件,并且可以运行

图三十七使用ld的链接命令,应截图,展示汇编过程! 注意不只连接hello.o文件

5.3 可执行目标文件hello的格式

使用readelf -a hello > hello.elf命令得到hello.elf文件图三十八

图三十九

与之前的elf文件并无太大差异

图四十

5.4 hello的虚拟地址空间

使用edb加载hello,查看本进程的虚拟地址空间各段信息,对比前文可知,init节地址0X401000

图四十一

Fini节地址0X401238

图四十二

5.5 链接的重定位过程分析

使用objdump指令后效果如下

图四十三

objdump -d -r hello 分析hello与hello.o的不同,说明链接的过程。

hello和hello.o的反汇编代码几乎完全相同,两者的反汇编文件的唯一不同之处在于:地址由相对偏移变为了可以由CPU直接访问的虚拟地址

5.6 hello的执行流程

图四十四

一次跳转

图四十五

完成一系列操作后再次跳转

图四十六

三次跳转

图四十七

四次跳转

图四十八五次跳转

图四十九六次跳转

图五十七次跳转

图五十一结束

5.7 Hello的动态链接分析

图五十二如图

5.8 本章小结

本章介绍了链接的概念和作用,以及以hello为例,讨论了链接过程中对程序的处理。经过链接,ELF可重定位的目标文件变成可执行的目标文件,将hello的反汇编文件和hello.o的反汇编文件进行比较,并举例计算了重定位的过程。

(第5章1分)

6 hello进程管理

6.1 进程的概念与作用

概念:进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,进程是程序的实体。

作用:从理论角度看,是对正在运行的程序过程的抽象;

6.3 Hello的fork进程创建过程

发送命令后,终端会调用fork函数创建一个新的子进程,新的子进程几乎但不完全和父进程相同(他们具有不同的PID)。fork函数只被调用一次,但会返回两次。一次是在调用进程中,一次是在新创建的子进程中。在父进程中,fork返回子进程的pid,在子进程中,fork返回0。

创建过程:

1.给新进程分配一个标识符。

2.在内核中分配一个PCB(进程管理块),将其挂在PCB表上。

3.复制它的父进程的环境(PCB中大部分的内容)。

4.为其分配资源(程序、数据、栈等)。

5.复制父进程地址空间里的内容(代码共享,数据写时拷贝)。

6.将进程设置成就绪状态,并将其放入就绪队列,等待CPU调度。

6.4 Hello的execve过程

execve 函数加载并运行可执行目标文件filename, 且带参数列表argv 和环境变量列表envp 。与fork 一次调用返回两次不同, execve 调用一次并从不返回。

6.5 Hello的进程执行

Linux 系统中的每个程序都运行在一个进程上下文中,操作系统内核使用这种被称为上下文切换的较高层形式的异常控制流来实现多任务:内核为每个进程维持一个上下文,上下文就是内核重新启动一个被抢占的进程所需的状态,在执行过程中,内核可以决定抢占当前进程,并重新开始一个先前被抢占的进程,这个决策称为调度。

hello程序与操作系统其他进程通过操作系统的调度,切换上下文,拥有各自的时间片从而实现并发运行。所以其实hello在sleep时就是这样的切换。

上下文切换的流程是:1.保存当前进程的上下文。2.恢复某个先前被抢占的进程被保存的上下文。3.将控制传递给这个新恢复的进程。

6.6 hello的异常与信号处理

图五十三正常运行如图图五十四

图五十五

图五十六

图五十七

各指令效果如上图

会出现的异常是中断,中断是异步发生的,是来自处理器外部的I/O设备的信号的结果。

涉及到的信号如下:

1.Ctrl-Z:内核发送一个SIGTSTP信号到前台进程组中的每个进程。默认情况下,结果是停止前台作业。

2.Ctrl-C:内核发送一个SIGINT信号到前台进程组中的每个进程。默认情况下结果是终止前台作业。

3.fg:将后台作业(在后台运行或在后台挂起)放到前台运行。

4.kill:信号编号是9,即SIGKILL,终止。kill -9 (hello的PID)是杀死后台hello程序。

6.7本章小结

本章介绍了程序在shell执行及进程的相关概念。程序在shell中执行是通过fork函数及execve创建新的进程并执行程序。

(第6章1分)

7 hello的存储管理

7.1 hello的存储器地址空间

逻辑地址:逻辑地址是指在计算机体系结构中是指应用程序角度看到的内存单元(memory cell)、存储单元(storage element)、网络主机(network host)的地址。就是hello.o里面的相对偏移地址。

线性地址:线性地址(Linear Address)是逻辑地址到物理地址变换之间的中间层。在分段部件中逻辑地址是段中的偏移地址,然后加上基地址就是线性地址。

虚拟地址:虚拟地址是Windows程序时运行在386保护模式下,这样程序访问存储器所使用的逻辑地址称为虚拟地址。就是hello里面的虚拟内存地址。

物理地址:物理地址在存储器里以字节为单位存储信息,为正确地存放或取得信息,每一个字节单元给以一个唯一的存储器地址,称为物理地址

7.2 Intel逻辑地址到线性地址的变换-段式管理

逻辑地址的表示形式为[段标识符:段内偏移量],这个表示形式包含完成逻辑地址到虚拟地址(线性地址)映射的信息。具体操作如下:

1.观察段选择符,0则转换的是GDT(全局)中的段,否则就是LDT(局部)中的段。
2.根据相应寄存器,找到其起始地址。
3.通过段标识符找到对应的基地址。
4.用基地址加上偏移,得到线性地址。

7.3 Hello的线性地址到物理地址的变换-页式管理

将程序的逻辑地址空间划分为固定⼤⼩的页(page),⽽物理内存划分为同样⼤⼩的页框(pageframe)。程序加载时,可将任意⼀页放⼈内存中任意⼀个页框,这些页框不必连续,从⽽实现了离散分配。该⽅法需要CPU的硬件⽀持,来实现逻辑地址和物理地址之间的映射。在页式存储管理⽅式中地址结构由两部构成,前⼀部分是页号,后⼀部分为页内地址。

7.4 TLB与四级页表支持下的VA到PA的变换

将VA分为四段。依次通过每段地址找到对应的PML4,PGD,PMD,PTE表,找到对应地址,组合得到PA

7.5 三级Cache支持下的物理内存访问

接到指令后,MMU用VPN到TLB中找寻PTE,缓存从物理地址中取出缓存偏移CO、缓存组索引CI以及缓存标记CT。若缓存中CI所指示的组有标记与CT匹配的条目且有效位为1,则检测到一个命中,读出在偏移量CO处的数据字节,并把它返回给MMU,随后MMU将它传递给CPU,得到PA;若不命中,则需到低一级Cache甚至主存中取出相应的块将其放入当前cache中,重新执行对应指令,访问要找的数据,得到PA。

7.6 hello进程fork时的内存映射

当fork函数被shell进程调用时,内核为新进程创建各种数据结构,并分配给它一个唯一的PID,为了给这个新进程创建虚拟内存,它创建了当前进程的mm_struct、区域结构和页表的原样副本。它将这两个进程的每个页面都标记为只读,并将两个进程中的每个区域结构都标记为私有对象。

7.7 hello进程execve时的内存映射

execve函数在shell中加载并运行包含在可执行文件hello中的程序,用hello程序有效地替代了当前程序。加载hello的过程主要步骤如下:

1删除已存在的用户区域,也就是将shell与hello都有的区域结构删除。

2映射私有区域,即为新程序的代码、数据、bss和栈区域创建新的区域结构,均为私有的、写时复制的

3映射共享区域,将一些动态链接库映射到hello的虚拟地址空间

4设置程序计数器,使之指向hello程序的代码入口。

7.8 缺页故障与缺页中断处理

1.段错误:地址不合法,即无法匹配到已有的区域结构中;
2.非法访问:没有应有的读写权限;
3.正常缺页:选择一页进行替换。

7.9动态存储分配管理

所有动态申请的内存都存在堆上面,用户通过保存在栈上面的一个指针来使用该内存空间

如果有足够空间用于扩大mem_address指向的内存块,则分配额外内存,并返回mem_address.  这里说的是“扩大”,我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时, realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平。也就是说,如果原先的内存大小后面还有足够的空闲空间用来分配,加上原来的空间大小= newsize,得到的是一块连续的内存。

如果原先的内存大小后面没有足够的空闲空间用来分配,那么从堆中另外找一块newsize大小的内存。  并把原来大小内存空间中的内容复制到newsize中。返回新的mem_address指针。

申请了内存空间后,必须检查是否分配成功。

当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它;当程序运行过程中malloc了,但是没有free的话,会造成内存泄漏.一部分的内存没有被使用,但是由于没有free,因此系统认为这部分内存还在使用,造成不断的向系统申请内存,使得系统可用内存不断减少.但是内存泄漏仅仅指程序在运行时,程序退出时,OS将回收所有的资源.

7.10本章小结

这一章是对于不同概念的内存地址的介绍,以及执行各种操作时的内存变动情况

(第7章 2分)

8 hello的IO管理

8.1 Linux的IO设备管理方法

以下格式自行编排,编辑时删除

设备的模型化:文件

设备管理:unix io接口

8.2 简述Unix IO接口及其函数

图五十八

8.3 printf的实现分析

以下格式自行编排,编辑时删除

[转]printf 函数实现的深入剖析 - Pianistx - 博客园

从vsprintf生成显示信息,到write系统函数,到陷阱-系统调用 int 0x80或syscall等.

字符显示驱动子程序:从ASCII到字模库到显示vram(存储每一个点的RGB颜色信息)。

显示芯片按照刷新频率逐行读取vram,并通过信号线向液晶显示器传输每一个点(RGB分量)。

8.4 getchar的实现分析

以下格式自行编排,编辑时删除

异步异常-键盘中断的处理:键盘中断处理子程序。接受按键扫描码转成ascii码,保存到系统的键盘缓冲区。

getchar等调用read系统函数,通过系统调用读取按键ascii码,直到接受到回车键才返回。

8.5本章小结

本章介绍了I/O接口相关的知识

(第8章1分)

结论

Hello程序从我写好代码开始,按下编译并运行的时候,先后经历了预处理(处理基本文件与信息),编译(转化成机器能读的语言),汇编(彻底成为二进制的只有机器看得懂的语言),然后链接,成为可执行文件,再运行这个文件,完成从程序到进程的转变,通过fork在进程树中产生子进程,拿到自己的内存分配,在完成任务后被父进程回收清空内存。程序的一生就此结束。

(结论0分,缺失 -1分,根据内容酌情加分)

附件

.S .O .I .OUT文件,对应编译过程中各阶段的文件

(附件0分,缺失 -1分)

参考文献

为完成本次大作业你翻阅的书籍与网站等

[1]  林来兴. 空间控制技术[M]. 北京:中国宇航出版社,1992:25-42.

[2]  辛希孟. 信息技术与信息服务国际研讨会论文集:A集[C]. 北京:中国科学出版社,1999.

[3]  赵耀东. 新时代的工业工程师[M/OL]. 台北:天下文化出版社,1998 [1998-09-26]. http://www.ie.nthu.edu.tw/info/ie.newie.htm(Big5).

[4]  谌颖. 空间交会控制理论与方法研究[D]. 哈尔滨:哈尔滨工业大学,1992:8-13.

[5]  KANAMORI H. Shaking Without Quaking[J]. Science,1998,279(5359):2063-2064.

[6]  CHRISTINE M. Plant Physiology: Plant Biology in the Genome Era[J/OL]. Science,1998,281:331-332[1998-09-23]. http://www.sciencemag.org/cgi/ collection/anatmorp.

(参考文献0分,缺失 -1分)

程序人生(计算机系统大作业)相关推荐

  1. 程序人生——CSAPP大作业

    摘  要 本文通过分析一个给定的hello.c程序的完整的生命周期(即从该程序最开始的预处理,到被编译器(gcc)编译,再到进入汇编器进行汇编,再到链接器执行链接,以及在进程中运行等过程),以及概括h ...

  2. 2022计算机系统大作业——程序人生-Hello’s P2P

    计算机系统 大作业 题     目 程序人生-Hello's P2P 专       业 计算机 学    号 120L021716 班    级 2003005 学       生 蔡泽栋 指 导 ...

  3. 哈工大2022计算机系统大作业---程序人生

    计算机系统 大作业 题     目 程序人生-Hello's P2P 专       业 计算机类 学    号 120L021923 班    级 2003006 学       生 甄自镜 指 导 ...

  4. 哈工大计算机系统大作业——程序人生-Hello’s P2P

    计算机系统 大作业 题          目程序人生-Hello's P2P 专          业 计算机科学与技术 学       号120L022401 班          级 200300 ...

  5. 哈工大2022年春季学期计算机系统大作业——程序人生

    计算机系统 大作业 题     目 程序人生-Hello's P2P 专       业 人工智能(未来技术) 学   号 7203610716 班   级 20WJ102 学       生 孙铭蔚 ...

  6. 程序人生-哈工大计算机系统大作业2022春

    计算机系统 大作业 题     目 程序人生-Hello's P2P 专       业 计算学部 学    号 7203610401 班    级 2036012 学       生 王元辰 指 导 ...

  7. HIT CS:APP 计算机系统大作业 《程序人生-Hello’s P2P》

    HIT CS:APP 计算机系统大作业 程序人生-Hello's P2P Hello的自白 我是Hello,我是每一个程序猿¤的初恋(羞羞--) l却在短短几分钟后惨遭每个菜鸟的无情抛弃(呜呜--), ...

  8. 哈尔滨工业大学计算机系统大作业--程序人生

    计算机系统   大作业 题     目  程序人生-Hello's P2P      专       业   计算机科学与技术        学    号        2021110xxx      ...

  9. [计算机系统]大作业-hello程序人生

    计算机系统 大作业 题     目 程序人生-Hello's P2P 专       业 计算学部 学    号 1190300505 班    级 1903011 学       生 张晟哲 指 导 ...

  10. 2021春深入理解计算机系统大作业——程序人生

    计算机系统 大作业 题     目 程序人生-Hello's P2P 专       业 计算学部 学    号 1190200608 班    级 1903004 学       生 琚晓龙 指 导 ...

最新文章

  1. Appium 并发测试基于unitest
  2. tinyxml 读取文本节点_【C++】【TinyXml】xml文件的读写功能使用——写xml文件
  3. Access数据库OleDbHelper
  4. Java并发编程71道面试题及答案 1
  5. 点融产品 VP 赵征宇:增长是一个探索人性的过程
  6. 利物浦大学的对于学生多样性的保护的网站!有什么unbalanced issues 直接找这里就行!
  7. 进击的Android Hook 注入术《三》
  8. GCC 7.3.0编译安装
  9. Vue项目如何实现国际化?分享一下基于vue-i18n实现国际化的经验
  10. 【转】js版的俄罗斯方块!!
  11. 计算机中逻辑运算用什么表示逻辑真,计算机逻辑运算和逻辑部.ppt
  12. c++知识整理 编程模块
  13. 计算机:游戏14,英语专四作文满分范文(十四):电脑游戏
  14. matlab arcsin 弧度,角度换算弧度(角度换算弧度计算器)
  15. python snownlp_GitHub - isnowfy/snownlp: Python library for processing Chinese text
  16. Java.生成class文件
  17. 2022-2027年中国发动机行业市场调研及未来发展趋势预测报告
  18. 漫步者蓝牙只有一边有声音_为什么我蓝牙耳机只有一边有声音?
  19. Codeforces E. Game With String
  20. 利用form表单上传图片,图片保存到本地,得到图片名字(后期可以将图片名字存进数据库)

热门文章

  1. 最新四级联动数据json
  2. java语言的基本介绍及相关特性
  3. 模糊c均值聚类及python实现
  4. Androidstudio开发ARcore
  5. Unity使用ARCore开发AR程序
  6. maven项目使用mybatis插件Free Mybatis plugin
  7. java前后端分离,前端部署的方式
  8. AppStore 预览图制作
  9. vs2015编译纯ASM文件
  10. 医疗物联网行业调研报告 - 市场现状分析与发展前景预测