用户调用 和稻谷的生长进程分为可分为 文件操作

操作系统复习资料_中华文本库
第1页/共5页
1解释进程的顺序性和并发性
答:目前使用的计算机基本上是冯·诺依曼式结构,其基本特点是处理器顺序执行指令。进程在顺序的处理器上的执行是严格按顺序进行的,这就是进程的顺序性,。当一个进程独占处理器顺序执行的时,具有两个特点:(1)封闭性,进程执行的结果只取决于进程本身,不受外界影响(2)可再现性,当进程再次重复执行时,必定获得相同的结果。进程具有并发性。也就是说在一个进程的工作没有全部完成之前,另一个进程就可以开始工作。并发进程相互之间可能是无关的,也可能是有交互的。这些有交互的进程共享某些资源。
2.对相关临界区的管理有哪些要求? 答:为了使并发进程能正确执行,对若干进程共享某一资源的相关临界区的管理应满足以下三个要求:(1)一次最多让一个进程在临界区中执行,当有进程在临界区中时。其他想进入临界区执行的进程必须等待(2)任何一个进入临界区执行的进程必须在有限的时间内退出临界区,即任何一个进程都不应该无限的逗留在自己的临界区中(3)不能强迫一个进程无限的等待进如它的临界区即有进程退出了临界区时应让下一个等待进入临界区的进程进入他的临界区执行。
3什么是线程?多线程技术具有哪些优越性? 答:线程是进程中可独立执行的子任务,一个进程可以有一个或者多个线程,每个线程都有一个唯一的标识符。线程与进程有许多相似之处,往往把线程又称为“轻型进程”。线程与进程的根本区别是把进程作为资源分配单位,而线程是调度和执行单位。优越性:(1)创建速度快,系统开销小,创建线程不需要另行分配资源(2)通信简洁,信息传送速度快,线程间的通信在同一地址空间进行,不需要额外的通信机制(3)并行性高,线程能独立执行,能充分利用和发挥处理器与外围设备并行工作的能力。多线程机制是操作系统的发展趋势,他能提高计算机系统的性能。
4简述UNIX系统中管道机制pipe和FIFO的区别
答:pipe文件是一种在两个进程间传送信息的临时文件,一旦写入pipe文件中的信息被读取后,这个pipe文件就没有必要保存了,它占用的存储空间就可被收回。命名管道FIFO适用于不同的用户的进程间的通信。所谓命名管道,实际上是一个冠有文件名的管道文件。命名管道的使用方式与无名管道的使用方式不同。对命名管道的使用就像对普通文件的使用一样,要通过文件操作来使用,首先必须建立文件,读写之前先打开文件,通信结束后要关闭文件。命名管道属于该文件的建立者所有。在建立有名管道文件时可设置访问权限。只有被授权的用户才可按访问权限使用有名管道文件。利用有名管道文件通信时,通信的发送者用只写方式打开,通信的接受着用只读的方式打开。对被打开的有名管道文件,进程可按打开的方式对该文件读或写。在读写的过程中管道机制要对读写操作进行同步控制,以保证信息传输的正确性。通信结束后要关闭该文件,以后需要时可再次打开。 5简述信号量S的物理含义
答:S>0时,S表示可使用的资源数,或表示可使用的资源的进程数。S=0时,表示无资源可供使用或表示不允许进程在进入临界区。S<0时,|S|表示等待使用资源的进程个数或表示等待进入临界区的进程个数。当S>0时,使用P(S)
的进程不会等待,调用V(S)后使可用资源数加1或是可用资源的进程数加1.当S≤0时,调用P(S)的进程必须等待,调用V(S)后将释放一个等待使用资源者或释放一个等待进入临界区者 6如果一个生产者和一个消费者他们共享的缓冲区(B)容量为可以存放N件物品,如何使用PV操作来实现他们正确的同步?
答:设信息量empty(表示缓冲区中可存放多少件物品)的初值为n,信号量full(表示缓冲区中存有几件物品)的初值为0.但是当缓冲区已经有n件物品时,生产者想在存入一件物品将被拒绝,每存一件物品后,由于调用V(full),故empty的值表示缓冲区中可用的物品数,只要full>0,消费者调用P(full)后总可去取物品。每取走一件物品后,由于调用V(empty),便增加了一个可用来存放物品的位置。用指针k和t分别表示生产者往缓冲区村物品和消费者从缓冲区物品的相对位置,他们的初值为0.那么,一个生产者和一个消费者共有容量为n的缓冲区时,可进行如下同步工作:设信号量empty,full,初值为empty=n,full=0,整型变量k,t,初值为k=t=0生产者进程:begin
(empty);B[k]:=k:=(k+1)V(full);go to L1;消费者进程:begin L2:P(full)take a product from B[t]; t:=(t+1) V(empty);go to L2;
7进程通信方式有两种,即直接通信和间接通信,给出各自使用的原语形式 答:(1)直接通信:这种通信方式是固定在一对进程之间进行。例如,进程A把新建只发送给进程B,而进程B也只接收进程A的信件。那么,“send”和“receive”两条原语的形式如下:send (B,M)把信件M发送给进程B,receive(A,X)接收来自进程A的信件且存入X中,进程A和进程B通过“send”和“receive”操作而自动建立了一种联结(2)间接通信:这种通信方式是以信箱为媒体来实现通信的,只要接收进程的设立一个信箱,那么,若干个进程都可向同一个进程发送信件。利用信箱通信时,“send”和“receive”原语中应给出信箱名,send (N,M)把信件M发送给信件N中,receive(N,X)从信件N中取出一封信存入X中
8UNIX中,消息缓冲机制的作用是什么?
答:UNIX中消息缓冲机制是利用缓冲区来传输消息的。有系统统一管理一组缓冲区,其中每一个缓冲区都可用来放一个消息。当一个进程要发送消息时,首先向系统申请一个缓冲区;然后再把组织好的消息存入缓冲区;接着把村有消息的缓冲区链接到消息队列中。所有这些工作可通过调用消息存入缓冲区;接着把村有消息的缓冲区链接到消息队列中。所有这些工作可通过调用消息缓冲机制所提供的系统调用来完成。接受消息的进程也可通过系统调用从消息队列中取用消息,从缓冲机制取出消息后,就应释放该缓冲区。UNIX的消息缓冲机制设置了多个消息队列。对不同的类型的消息分别设置不同的消息队列。进程间传送的每一个消息都有一个指定的类型。消息缓冲机制根据发送进程给定的消息类型,从与该类型相关联的消息队列中读出一个消息。于是发送进程和接收进程既可以使用同一消息队列中读出一个消息。于是发送进程和接收进程既可以使用同一消息队列进行通信。 9为什么并发进程执行时可能会产生与时间相关的错误?如何避免?
答:有交互的并发进程可能会同时使用共享资源,如果对这种情况不加控制,由于进程占用处理器的时间,执行的速度和外界的影响等。就会引起与时间有关的错误。只要使若干并发进程的相关临界区互斥执行,就可避免造成这类错误。
10简述文件的组织结构
文件的组织结构是指文件的构造方式。用户和文件系统信信从不同的角度对待同一个文件。(1)文件的逻辑结构:用户按自己对信息的处理要求确定文件的逻辑结构。我们把用户组织的文件称为逻辑文件。逻辑文件有如下两种形式。①流式文件:指用户对文件中的信息不再划分可独立的单位,整个文件由依次的一串停止组成;②记录式文件:指用户对文件中的信息按逻辑上独立的含义现划分信息单位。每个信息单位称为一个逻辑记录。简称为记录(2)文件的存储结构:文件系统根据存储设备的类型、用户采用的存储方式决定文件在存储介质上的组织方式。目前常用的存储设备有磁盘机和磁带机,他们的组织文件如下:①磁带文件的组织:磁带机是一种顺序存取的设备,组织在磁带上的文件都采用顺序结构的;②磁盘文件的组织:文件在磁盘上有多种组织方式。常用的有顺序结构、链接结构和索引结构 11文件系统能允许用户去关闭一个不是自己打开或建立的文件吗?
关闭文件操作只有文件的建立者或打开者才有权关闭文件。因此文件文件系统一般不能允许用户去关闭一个不是自己打开或建立的文件。
12叙述下列术语;存储介质、卷、块、文件和记录。
存储介质:可用来记录信息的磁带、硬磁盘组、软磁盘片、光盘、卡片等称为存储介质。目前常用的存储介质是磁带机和磁盘机。卷:把存储介质的物理单位定义为“卷’.一盘磁带、一张软磁片、一个硬盘组都可以称为一个卷。块:把存储介质上连续信息所组成的一个区域称为“块”。块是存储设备与主存储器之间进行信息交换的物理单位。每次问题把一块或几块信息读入主存储器,或是把主存储器上的信息写到一块或几块中。文件:是指逻辑上具有完整意义的信息集合。记录:是指文件内信息按逻辑上独立的含义划分的信息单位,每个单位称为一个逻辑单位,简称为记录。 13文件系统应由哪些部分组成?
文件系统由以下一些部分组成:(1)文件目录:是实现按名存取的一种手段。目录结构应既能方便文件的检索,又能保证文件系统的安全。(2)文件的组织:用户按信息的使用和处理方式来组织文件。文件系统要从系统效率和方便检索的角度来考虑如何保存文件。通常文件在存储介质上可以有多种组织形式。(3)文件存储空间的管理:对文件的存储空间的分配和空闲情况进行登记和管理。(4)文件操作:是文件系统提供给用户使用文件的一组接口。用户调用文件操作提出对文件的使用要求。(5)文件的安全措施:文件共享既能节省存储空间又可减少传送文件的时间,但文件需要适当的安全保护措施,既要防止有意或无意地破坏文件,又要避免随意的剽窃文件,实现文件的保护和保密。 14文件是如何进行分类的?
文件可以按各种分类方法进行分类,主要有以下几种:(1)按用途分类:可把文件分为系统文件、库文件和用户文件。(2)按保护级别分类:可以把文件分成执行文件、只读文件和读写文件等。(3)按信息流向分类:一般可以分为输入文件、输出文件和输入/输出文件。(4)按存放时限分类,可以分成临时文件、
永久文件和档案文件。(5)按设备类型分类,可以把文件分成磁盘文件、磁带文件、卡片文件和打印文件等。(6)按文件组织结构分类,可分为逻辑文件、流式文件和记录式文件、物理文件、顺序文件、链接文件和索引文件。
15如果用户要求读一个尚未打开的文件时文件系统怎样处理?
如果用户要求读一个尚未打开的文件时,文件系统会报告用户需要首先打开文件的信息。有的系统为了方便用户,提供了一种隐式使用文件的方法,允许用户不调用“打开文件”、“建立文件”和“关闭文件”操作,而直接调用“读文件”或“写文件”操作。当用户要求使用一个未被打开或建立的文件时,文件系统先做“打开文件”或“建立文件”的工作,然后再执行“读文件”吉“写文件”的操作。
16简述“打开文件”操作的系统处理过程。
当用户使用一个已经存放在存储介质上的文件的时候,必须先调开“打开”操作,向系统提出使用一个文件的要求。用户调用“打开”操作时,也必须向系统提供参数:用户名、文件名、存取方式、存储设备类型、口令等。文件系统在接到用户的“打开”要求后,要为用户做好使用前的准备工作。这些工作主要是:(1)让用户在指定的存储设备上装存储介质;(2)把存储介质上的文件目录读入主存储器;(3)按文件名检索文件目录,找出该文件的目录项;(4)核对用户口令,仅当输入口令与目录项中口令一致时才允许打开;(5)核对存储方式是否与建立该文件时规定的存储方式一致;(6)找出文件存放在存储介质上的起始位置,把他们作为当前位置;(7)对索引文件应把该文件的索引表读入主要存储器,以便后续的读操作能快速地进行;(8)做上该文件已打开的标志。
17怎样防止由于系统故障而造成的文件被破坏?
对于因硬件故障或软件失误而引起的文件被破坏,应经常采用对立副本定时转储的办法来解决。(1)建立副本。副本既可建立在同类型的不同存储介质上,也可建立在不同类型的存储介质上。当系统出现故障时,应根据系统故障的具体情况来选取副本。操作系统还可以在同一存储介质上对系统文件建立多个副本,万一某个副本上的文件受了侵害,可以其它副本上的文件更换,增强系统文件的安全性。建立副本的方法简单易行,但系统开销增大,当文件更新时必须要改动所有的副本。因此这种方法适用于容量较小且重要的文件。(2)定时转储。在文件存储过程中,定时地把文件转储到某个存储介质上。当文件发生故障时就用转储的文件来复原。这样可把有故障的文件恢复到某一时刻的状态,仅丢失了自上次转储来新修改或新增加的信息,只要从修复点重新执行就可得到弥补。UNIX系统就采用定时转储来保护文件,提高文件的安全性。 18UNIX文件系统有什么特点?
UNIX的文件系统分成基本文件系统和可装卸的子文件系统两部分。 不论基本文件系统还是可装卸子文件系统都有自己独立的目录结构。但上基本文件系统是整个UNIX系统的基础,被称为根文件系统。系统一旦启动运行后,基本文件系统不能脱卸,而子文件系统就可以随便更换。这种结构使得文件系统易于扩充和更改。
19UNIX中的系统调用link和unlink起什么作用?
系统调用link和unlink的典型应用是允许开发的几个小组成员共享一个文件。
第1页/共5页
寻找更多 ""操作系统试题E_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
操作系统试题E
||文档简介
总评分3.6|
浏览量2887
&&操​作​系​统​,​复​习​资​料
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢Linux系统调用及用户编程接口(API)学习
Linux系统调用及用户编程接口(API)学习
  Linux系统调用  系统调用指操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务。  为什么用户程序不能直接访问系统内核提供的服务呢?这是由于在Linux中,为了更好地保护内核空间,将程序的运行空间分为用户空间和内核空间(也就是常称的用户态和内核态),它们分别运行在不同的级别上,逻辑上是相互分离的。因此,用户进程通常情况下不允许访问内核数据,也无法使用内核函数,它们只能在用户空间操作用户数据,调用用户空间的函数。  但是,在有些情况下,用户空间的进程需要获得一定的系统服务(调用内核空间程序),这时操作系统就必须利用系统提供用户的“特殊接口”―――系统调用规定用户进程进入内核空间的具体位置。在进行系统调用时,程序运行空间需要从用户空间进入内核空间,处理完成后再返回用户空间。  Linux系统调用还算精简(只有250个左右),它继承了UNIX系统调用中最基本和最有用的部分。这些系统调用按照功能逻辑大致可分为进程控制、进程间通信、文件系统控制、存储管理、网络管理、套接字控制、用户管理等几类。  用户编程接口(API)  前面讲到的系统调用并不直接与程序员进行交互,它仅仅是一个通过软中断机制向内核提交请求以获取内核服务的接口。实际使用中,程序员调用的通常都是用户编程接口(API)。  例如,创建进程的API函数fork()函数对应于内核空间的sys_fork()系统调用,但并不是所有的函数都对应一个系统调用。有时,一个API函数会需要几个系统调用来共同完成函数的功能,甚至还有一些API函数不需要调用相应的系统调用(因此它所完成的不是内核提供的服务)。  系统命令  系统命令相对于API更高了一层,它实际上是一个可执行程序,它的内部引用了用户编程接口(API)来实现相应的功能,它们之间的关系如下图1:    
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
职称考试题目
招生信息考研政治
网络安全安全设置工具使用手机安全
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&【Linux操作系统分析】进程的创建与可执行程序的加载
我的图书馆
【Linux操作系统分析】进程的创建与可执行程序的加载
进程的创建与可执行程序的加载
SA***189 & & & & 周肃
一 进程的创建
& & & & 进程0是所有进程的祖先。进程1被创建并选择后调用execve()系统调用转入可执行程序init,init进程一直存活,创建和监控在操作系统外层执行的所有进程的活动。
& & & & 当fork()被调用时,主要由函数do_fork()函数来处理。do_fork()函数的执行流程如下:
& & & & do_fork()的主要作用是为子进程分配PID,检查各个标志位,以决定新创建的子进程的被创建后所处的状态和执行队列,以及调用辅助函数copy_process()来创建进程描述符以及子进程执行所需要的所有其他内核数据结构。
& & & & do_fork()结束后,创建了可运行的完整的子进程,调用程序把子进程描述符thread字段的值装入CPU寄存器,特别是把thread.esp(子进程内核态对战的地址)装入esp寄存器,把函数ret_from_fork()的地址装入eip寄存器,这个汇编语言函数调用schedule_tail()函数,用存放在栈中的值再装载所有的寄存器,并强迫CPU返回到用户态。然后在fork()系统调用结束时,新进程将开始执行。系统调用的返回值放在eax寄存器中:返回给子进程的值是0,返回给父进程的值是子进程的PID。
& & & & 至此,fork()系统调用结束,父进程和子进程暂时共享同一个用户态对战,但是当父子进程中有一个试图去改变栈,则写时复制复制机制将拷贝出一份新的用户态堆栈给父进程。
二&可执行程序的加载
& & & & 前面讲到fork()系统调用创建出了一个新的进程,然后紧接着,这个新的进程一般会用来调用execve()系统调用执行指定的ELF文件,即当进入execve()系统调用之后,就开始了可执行程序的加载。
上面绿色的步骤为装载文件的主要函数,其主要步骤为:
检查ELF可执行文件格式的有效性,比如摩数、程序头表中段的数量。需找动态链接的“.interp”段,设置动态连接器路径根据ELF可执行文件的程序头表的描述,对ELF文件进行映射,比如代码,数据,只读数据初始化ELF进程环境,比如进程启动时EDX寄存器的地址应该是DT_FINI的地址将系统调用的返回地址修改成ELF可执行文件的入口点,这个入口点取决于程序的连接方式,对于静态链接的ELF可执行文件,这个程序入口就是ELF文件的文件头中e_entry所指的地址:对于动态链接的ELF可执行文件,程序入口点是动态连接器
当load_elf_binary()执行完毕,返回至do_execve()再返回至sys_execve()时,上面第5步已经把系统调用的返回地址改成了被装载的ELF程序的入口地址。所以当sys_+execve()系统调用从内核态返回到用户态时,EIP寄存器直接跳转到ELF程序的入口地址,于是新的程序开始执行,ELF可执行文件装载完成。
1 fork()和exec()族函数
fork():创建一个新进程,该进程几乎是当前进程的完全拷贝。exec()族函数:启动另外的进程以取代当前运行的进程。
1.1 fork()函数
forkTest.c
[cpp] int&main()&&{&&&&&&pid_t&&&&&&&&&pid&=&fork();&&&&&&&&if(pid&==&0)&&&&&&{&&&&&&&&&&printf("Child&process!\n");&&&&&&}&&&&&&else&if(pid&&&0)&&&&&&{&&&&&&&&&&sleep(1);&&&&&&&&&&&&&&&&&&printf("Parent&process!\n");&&&&&&}&&&&&&else&printf("fork&failure!\n");&&&&&&&&&&&&exit(0);&&}&&
运行截图:
由运行结果可知,fork()创建了一个子进程,父进程和子进程各打印了一条信息。
1.2 exec()族函数
execTest.c
例子中用execl系统调用在相同的文件夹中已经编译好一个helloworld可执行文件。execTest.c文件,在上例中fork()函数创建的子进程分支中增加了一个execl()系统调用,调用同文件夹下的helloworld可执行文件。
[cpp] #include&stdlib.h&&&#include&stdio.h&&&#include&sys/types.h&&&#include&unistd.h&&&&&int&main()&&{&&&&&&pid_t&&&&&&&&&pid&=&fork();&&&&&&&&if(pid&==&0)&&&&&&{&&&&&&&&&&execl("./helloworld",&"helloworld",&NULL);&&&&&&&&&&printf("Child&process!\n");&&&&&&}&&&&&&else&if(pid&&&0)&&&&&&{&&&&&&&&&&sleep(1);&&&&&&&&&&printf("Parent&process!\n");&&&&&&}&&&&&&else&printf("fork&failure!\n");&&&&&&&&exit(0);&&}&&
运行截图:
由运行结果可以看到,execl()函数调用了一个新的进程,完全取代当前调用该函数的进程。上例中,fork出来的子进程并没有打印出“Child process!”,正说明了这一点。
2&fork和exec系统调用在内核中的执行过程
2.1 C代码中嵌入汇编代码
[cpp] #include&&stdio.h&&&&&int&&main()&&{&&&&&&/*&val1+val2=val3&*/&&&&&&unsigned&int&val1&=&1;&&&&&&unsigned&int&val2&=&2;&&&&&&unsigned&int&val3&=&0;&&&&&&printf("val1:%d,val2:%d,val3:%d\n",val1,val2,val3);&&&&&&asm&volatile(&&&&&&"movl&$0,%%eax\n\t"&/*&clear&%eax&to&0*/&&&&&&"addl&%1,%%eax\n\t"&/*&%eax&+=&val1&*/&&&&&&"addl&%2,%%eax\n\t"&/*&%eax&+=&val2&*/&&&&&&"movl&%%eax,%0\n\t"&/*&val2&=&%eax*/&&&&&&:&"=m"&(val3)&/*&output&=m&mean&only&write&output&memory&variable*/&&&&&&:&"c"&(val1),"d"&(val2)&/*&input&c&or&d&mean&%ecx/%edx*/&&&&&&);&&&&&&printf("val1:%d+val2:%d=val3:%d\n",val1,val2,val3);&&&&&&&&return&0;&&}&&执行截图:
2.2 C代码中嵌入系统调用汇编代码
sys_asmTest.c
[cpp] #include&&stdio.h&&&#include&&time.h&&&&&int&&main()&&{&&&&&&time_t&&&&&&&struct&tm&*t;&&&&&&&&&&int&&&/*&(gdb)&disassemble&time&Dump&of&assembler&code&for&function&time:&&&&0x&&+0&:&&&push&&&%ebp&&&&0x&&+1&:&&&mov&&&&%esp,%ebp&&&&0x&&+3&:&&&mov&&&&0x8(%ebp),%edx&&&&0x&&+6&:&&&push&&&%ebx&&&&0x&&+7&:&&&xor&&&&%ebx,%ebx&&&&0x&&+9&:&&&mov&&&&$0xd,%eax&&&&0x0804f80e&&+14&:&&int&&&&$0x80&&&&0x&&+16&:&&test&&&%edx,%edx&&&&0x&&+18&:&&je&&&&&0x804f816&&time+22&&&&&0x&&+20&:&&mov&&&&%eax,(%edx)&&&&0x&&+22&:&&pop&&&&%ebx&&&&0x&&+23&:&&pop&&&&%ebp&&&&0x&&+24&:&&ret&&&&&End&of&assembler&dump.&&*/&&#if&0&&&&&&time(&tt);&&&&&&printf("tt:%ld\n",tt);&&#else&&&&&&&&&&/*&没有使用常规寄存器传参的方法&*/&&&&&&asm&volatile(&&&&&&&&&&"mov&$0,%%ebx\n\t"&/*&不使用参数tt&*/&&&&&&"mov&$0xd,%%eax\n\t"&&&&&&&"int&$0x80\n\t"&&&&&&&"mov&%%eax,%0\n\t"&&&&&&&&:&"=m"&(tt)&&&&&&&);&&&&&&printf("tt:%ld\n",tt);&&&&&&t&=&localtime(&tt);&&&&&&printf("time:%d:%d:%d:%d:%d:%d\n",t-&tm_year+1900,&t-&tm_mon,&t-&tm_mday,&t-&tm_hour,&t-&tm_min,&t-&tm_sec);&&&&&&&&&&/*&使用常规寄存器传参的方法&*/&&&&&&asm&volatile(&&&&&&&&&&"mov&%1,%%ebx\n\t"&/*&使用参数tt&*/&&&&&&"mov&$0xd,%%eax\n\t"&&&&&&&"int&$0x80\n\t"&&&&&&&"mov&%%eax,%0\n\t"&&&&&&&&:&"=m"&(ret)&&&&&&&&&&&:&"b"&(&tt)&&&&&&);&&&&&&printf("tt:%ld\n",tt);&&&&&&t&=&localtime(&tt);&&&&&&printf("time:%d:%d:%d:%d:%d:%d\n",t-&tm_year+1900,&t-&tm_mon,&t-&tm_mday,&t-&tm_hour,&t-&tm_min,&t-&tm_sec);&&#endif&&&&&&&&&&return&0;&&}&&运行截图:
2.3 fork()系统调用的执行过程
查看fork()系统调用的汇编代码(部分):
2.4 exec()系统调用的执行过程
对exec()进行反汇编:
[plain] Dump&of&assembler&code&for&function&execl:&&&&&0xb7ed85f0&&+0&:&&&push&&&%ebp&&&&&0xb7ed85f1&&+1&:&&&push&&&%edi&&&&&0xb7ed85f2&&+2&:&&&push&&&%esi&&&&&0xb7ed85f3&&+3&:&&&push&&&%ebx&&&&&0xb7ed85f4&&+4&:&&&sub&&&&$0x102c,%esp&&&&&0xb7ed85fa&&+10&:&&mov&&&&0x1044(%esp),%edx&&&&&0xb7ed8601&&+17&:&&lea&&&&0x20(%esp),%ecx&&&&&0xb7ed8605&&+21&:&&call&&&0xb7f4af83&&&&&0xb7ed860a&&+26&:&&add&&&&$0xec9ea,%ebx&&&&&0xb7ed8610&&+32&:&&lea&&&&0x1048(%esp),%eax&&&&&0xb7ed8617&&+39&:&&mov&&&&%ecx,0x18(%esp)&&&&&0xb7ed861b&&+43&:&&test&&&%edx,%edx&&&&&0xb7ed861d&&+45&:&&mov&&&&%edx,0x20(%esp)&&&&&0xb7ed8621&&+49&:&&je&&&&&0xb7ed8724&&execl+308&&&&&&0xb7ed8627&&+55&:&&lea&&&&0x4(%eax),%ebp&&&&&0xb7ed862a&&+58&:&&mov&&&&(%eax),%eax&&&&&0xb7ed862c&&+60&:&&mov&&&&$0x1,%esi&&&&&0xb7ed8631&&+65&:&&lea&&&&0x20(%esp),%edi&&&&&0xb7ed8635&&+69&:&&mov&&&&$0x400,%edx&&&&&0xb7ed863a&&+74&:&&test&&&%eax,%eax&&&&&0xb7ed863c&&+76&:&&mov&&&&%eax,(%edi,%esi,4)&&&&&0xb7ed863f&&+79&:&&je&&&&&0xb7ed865d&&execl+109&&&&&&0xb7ed8641&&+81&:&&lea&&&&0x0(%esi,%eiz,1),%esi&&&&&0xb7ed8648&&+88&:&&add&&&&$0x1,%esi&&&&&0xb7ed864b&&+91&:&&cmp&&&&%esi,%edx&&&&&0xb7ed864d&&+93&:&&je&&&&&0xb7ed86a0&&execl+176&&&&&&0xb7ed864f&&+95&:&&mov&&&&%ebp,%eax&&&&&0xb7ed8651&&+97&:&&lea&&&&0x4(%eax),%ebp&&---Type&&return&&to&continue,&or&q&&return&&to&quit---&&&&&0xb7ed8654&&+100&:&mov&&&&(%eax),%eax&&&&&0xb7ed8656&&+102&:&test&&&%eax,%eax&&&&&0xb7ed8658&&+104&:&mov&&&&%eax,(%edi,%esi,4)&&&&&0xb7ed865b&&+107&:&jne&&&&0xb7ed8648&&execl+88&&&&&&0xb7ed865d&&+109&:&mov&&&&-0xd4(%ebx),%eax&&&&&0xb7ed8663&&+115&:&mov&&&&0x1040(%esp),%ecx&&&&&0xb7ed866a&&+122&:&mov&&&&(%eax),%eax&&&&&0xb7ed866c&&+124&:&mov&&&&%edi,0x4(%esp)&&&&&0xb7ed8670&&+128&:&mov&&&&%ecx,(%esp)&&&&&0xb7ed8673&&+131&:&mov&&&&%eax,0x8(%esp)&&&&&0xb7ed8677&&+135&:&call&&&0xb7ed82e0&&execve&&&&&&0xb7ed867c&&+140&:&cmp&&&&0x18(%esp),%edi&&&&&0xb7ed8680&&+144&:&mov&&&&%eax,%esi&&&&&0xb7ed8682&&+146&:&je&&&&&0xb7ed868c&&execl+156&&&&&&0xb7ed8684&&+148&:&mov&&&&%edi,(%esp)&&&&&0xb7ed8687&&+151&:&call&&&0xb7e36ef0&&free@plt+48&&&&&&0xb7ed868c&&+156&:&add&&&&$0x102c,%esp&&&&&0xb7ed8692&&+162&:&mov&&&&%esi,%eax&&&&&0xb7ed8694&&+164&:&pop&&&&%ebx&&&&&0xb7ed8695&&+165&:&pop&&&&%esi&&&&&0xb7ed8696&&+166&:&pop&&&&%edi&&&&&0xb7ed8697&&+167&:&pop&&&&%ebp&&&&&0xb7ed8698&&+168&:&ret&&&&&&&&&0xb7ed8699&&+169&:&lea&&&&0x0(%esi,%eiz,1),%esi&&&&&0xb7ed86a0&&+176&:&cmp&&&&0x18(%esp),%edi&&&&&0xb7ed86a4&&+180&:&mov&&&&$0x0,%eax&&&&&0xb7ed86a9&&+185&:&lea&&&&(%edx,%edx,1),%ecx&&&&&0xb7ed86ac&&+188&:&mov&&&&%ecx,0x1c(%esp)&&&&&0xb7ed86b0&&+192&:&lea&&&&0x0(,%edx,8),%ecx&&---Type&&return&&to&continue,&or&q&&return&&to&quit---&&&&&0xb7ed86b7&&+199&:&cmovne&%edi,%eax&&&&&0xb7ed86ba&&+202&:&mov&&&&%edx,0x14(%esp)&&&&&0xb7ed86be&&+206&:&mov&&&&%ecx,0x4(%esp)&&&&&0xb7ed86c2&&+210&:&mov&&&&%eax,(%esp)&&&&&0xb7ed86c5&&+213&:&call&&&0xb7e36e70&&realloc@plt&&&&&&0xb7ed86ca&&+218&:&mov&&&&0x14(%esp),%edx&&&&&0xb7ed86ce&&+222&:&test&&&%eax,%eax&&&&&0xb7ed86d0&&+224&:&je&&&&&0xb7ed8710&&execl+288&&&&&&0xb7ed86d2&&+226&:&cmp&&&&0x18(%esp),%edi&&&&&0xb7ed86d6&&+230&:&je&&&&&0xb7ed86e8&&execl+248&&&&&&0xb7ed86d8&&+232&:&mov&&&&%eax,%edi&&&&&0xb7ed86da&&+234&:&mov&&&&0x1c(%esp),%edx&&&&&0xb7ed86de&&+238&:&mov&&&&%ebp,%eax&&&&&0xb7ed86e0&&+240&:&jmp&&&&0xb7ed8651&&execl+97&&&&&&0xb7ed86e5&&+245&:&lea&&&&0x0(%esi),%esi&&&&&0xb7ed86e8&&+248&:&shl&&&&$0x2,%edx&&&&&0xb7ed86eb&&+251&:&mov&&&&%edx,0x8(%esp)&&&&&0xb7ed86ef&&+255&:&mov&&&&%edi,0x4(%esp)&&&&&0xb7ed86f3&&+259&:&mov&&&&%eax,(%esp)&&&&&0xb7ed86f6&&+262&:&mov&&&&%eax,0x14(%esp)&&&&&0xb7ed86fa&&+266&:&call&&&0xb7e9f750&&&&&0xb7ed86ff&&+271&:&mov&&&&0x14(%esp),%ecx&&&&&0xb7ed8703&&+275&:&mov&&&&%ebp,%eax&&&&&0xb7ed8705&&+277&:&mov&&&&0x1c(%esp),%edx&&&&&0xb7ed8709&&+281&:&mov&&&&%ecx,%edi&&&&&0xb7ed870b&&+283&:&jmp&&&&0xb7ed8651&&execl+97&&&&&&0xb7ed8710&&+288&:&cmp&&&&0x18(%esp),%edi&&&&&0xb7ed8714&&+292&:&mov&&&&$0xffffffff,%esi&&&&&0xb7ed8719&&+297&:&jne&&&&0xb7ed8684&&execl+148&&&---Type&&return&&to&continue,&or&q&&return&&to&quit---&&&&&0xb7ed871f&&+303&:&jmp&&&&0xb7ed868c&&execl+156&&&&&&0xb7ed8724&&+308&:&mov&&&&-0xd4(%ebx),%eax&&&&&0xb7ed872a&&+314&:&mov&&&&0x1040(%esp),%ecx&&&&&0xb7ed8731&&+321&:&mov&&&&(%eax),%eax&&&&&0xb7ed8733&&+323&:&mov&&&&%ecx,(%esp)&&&&&0xb7ed8736&&+326&:&mov&&&&%eax,0x8(%esp)&&&&&0xb7ed873a&&+330&:&lea&&&&0x20(%esp),%eax&&&&&0xb7ed873e&&+334&:&mov&&&&%eax,0x4(%esp)&&&&&0xb7ed8742&&+338&:&call&&&0xb7ed82e0&&execve&&&&&&0xb7ed8747&&+343&:&mov&&&&%eax,%esi&&&&&0xb7ed8749&&+345&:&jmp&&&&0xb7ed868c&&execl+156&&&End&of&assembler&dump.&&
3&task_struct进程控制块,ELF文件格式与进程地址空间的联系,注意Exec系统调用返回到用户态时EIP指向的位置。
3.1 task_struct进程控制块结构
3.2 ELF文件格式
3.3 ELF文件格式与进程地址空间的关系
ELF文件中,段的权限往往只有为数不多的几种组合,基本上是三种:
以代码段为代表的权限为可读可执行的段以数据段和BSS段为代表的权限为可读可写的段以只读数据段为代表的权限为只读的段
对于相同权限的段,把它们合并在一起当作一个段进行映射。
如.text和.init,它们包含的分别的是程序的可执行代码和初始化代码,并且它们的权限相同,都是可读并且可执行。假设.text为4097字节,.init为512字节,这两个段分别映射的话需要占用三个页面,因为一个页面的大小为4KB。如果把它们合并成一起映射的话只需占用两个页面。
ELF可执行文件中引入了一个概念叫做“Segment”,一个Segment包含一个或多个属性类似的Section。Segment实际上从装载的角度重新划分了ELF的各个段。
4&动态链接库在ELF文件格式中与进程地址空间中的表现形式
表现形式:动态连接器和动态链接重定位表。
在静态链接时,整个程序最终只有一个可执行文件,它是一个不可以分割的整体;但是在动态连接下,一个程序被分成了若干个文件,有程序的主要部分,即可执行文件和程序所依赖的共享对象(.so文件)。
动态链接器与普通共享对象一样被映射到了进程的地址空间,在系统开始运行程序之前,首先会把控制权交给动态链接器,由它完成所有的动态链接工作以后再把
控制权交给程序,然后开始执行。
动态连接器的位置是由ELF可执行文件决定的。在ELF可执行中,有一个专门的段叫做“.interp”段。
动态链接的实现步骤:
发表评论:
TA的最新馆藏

我要回帖

更多关于 64位进程调用32位dll 的文章

 

随机推荐