什么是.exe?它的运行原理是什么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是.exe?它的运行原理是什么?相关的知识,希望对你有一定的参考价值。

exe是可执行文件的文件格式之一,可以在系统中直接运行。即是可以被访问的,这要看是什么文件。如是系统文件有些文件在电脑启动,及进行一些操作时必须被执行即访问。否则会造成系统错误但有些文件也是不必被访问的。.exe 扩展名的文件名后按 Enter键就能运行。不过有些是病毒文件,所以要注意区分一下。
原理:
EXE 文件比较复杂,每个EXE文件都有一个文件头,结构如下:
EXE文件头信息
―――――――――――――――――――
├ 偏移量 ┤ 意义 ┤
├00h-01h ┤MZ\'EXE文件标记 ┤
├2h-03h ┤文件长度除512的余数 ┤
├04h-05h ┤...............商 ┤
├06h-07h ┤重定位项的个数 ┤
├08h-09h ┤文件头除16的商 ┤
├0ah-0bh ┤程序运行所需最小段数 ┤
├0ch-0dh ┤..............大.... ┤
├oeh-0fh ┤堆栈段的段值 (SS) ┤
├10h-11h ┤........sp ┤
├12h-13h ┤文件校验和 ┤
├14h-15h ┤IP ┤
├16h-17h ┤CS ┤
├18h-19h ┤............ ┤
├1ah-1bh ┤............ ┤
├1ch ┤............ ┤
―――――――――――――――――――――――――
.EXE文件包含一个文件头和一个可重定位程序映象。文件头包含MS-DOS用于加载程序的信息,例如程序的大小和寄存器的初始值。文件头还指向一个重定位表,该表包含指向程序映象中可重定位段地址的指针链表。文件头的形式与EXEHEADER结构对应:
EXEHEADER STRUC
exSignature dw 5A4Dh ;.EXE标志
exExraBytes dw ? ;最后(部分)页中的字节数
exPages dw ? ;文件中的全部和部分页数
exRelocItems dw ? ;重定位表中的指针数
exHeaderSize dw ? ;以字节为单位的文件头大小
exMinAlloc dw ? ;最小分配大小
exMaxAlloc dw ? ;最大分配大小
exInitSS dw ? ;初始SS值
exInitSP dw ? ;初始SP值
exChechSum dw ? ;补码校验值
exInitIP dw ? ;初始IP值
exInitCS dw ? ;初始CS值
exRelocTable dw ? ;重定位表的字节偏移量
exOverlay dw ? ;覆盖号
EXEHEADER ENDS程序映象,包含处理器代码和程序的初始数据,紧接在文件头之后。它的大小以字节为单位,等于.EXE文件的大小减去文件头的大小,也等于exHeaderSize的域的值乘以16。MS-DOS通过把该映象直接从文件拷贝到内存加载.EXE程序然后调整定位表中说明的可重定位段地址。
定位表是一个重定位指针数组,每个指向程序映象中的可重定位段地址。文件头中的exRelocItems域说明了数组中指针的个数,exRelocTable域说明了分配表的起始文件偏移量。每个重定位指针由两个16位值组成:偏移量和段值。为加载.EXE程序,MS-DOS首先读文件头以确定.EXE标志并计算程序映象的大小。然后它试图申请内存。首先,它计算程序映象文件的大小加上PSP的大小再加上EXEHEADER结构中的exMinAlloc域说明的内存大小这三者之和,如果总和超过最大可用内存块的大小。则MS-DOS停止加载程序并返回一个出错值。否则面,它计算程序映象的大小加上PSP的大小再加上EXEHEADER结构中exMaxAlloc域说明的内存大小之和,如果第二个总和小于最大可用内存块的大小,则MS-DOS 分配计算得到的内存量。否则,它分配最大可用内存块。分配完内存后,MS-DOS确定段地址,也称为起始段地址,MS-DOS从此处加载程序映象。如果exMinAlloc域和exMaxAlloc域中的值都为零,则MS-DOS把映象尽可能地加载到内存最高端。否则,它把映象加载到紧挨着PSP域之上。接下来,MS-DOS读取重定位表中的项目调整所有由可重定位指针说明的段地址。对于重定位表中的每个指针,MS-DOS寻找程序映象中相应的可重定位段地址,并把起始段地址加到它之上。一旦调整完毕,段地址便指向了内存中被加载程序的代码和数据段。 MS-DOS在所分配内存的最低部分建造256字节的PSP,把AL和AH设置为加载 .COM程序时所设置的值。MS-DOS使用文件头中的值设置SP与SS,调整SS初始值,把起始地址加到它之上。MS-DOS还把ES和DS设置为PSP的段地址.最后,MS-DOS从程序文件头读取CS和IP的初始值,把起始段地址加到CS之上,把控制转移到位于调整后地址处的程序。
参考技术A 就是程序文件啊.到我的电脑搜索qq.exe你就会找到一个qq.exe文件,这些文件双击或者右键选择打开的话就会运行并完成一些操作,不像.txt .doc文件打开的话是用记事本、Word显示它们的内容的,比如qq.exe你双击它就会让你登陆,然后就可以聊天了

原理:
EXE 文件比较复杂,每个EXE文件都有一个文件头,结构如下:
EXE文件头信息
―――――――――――――――――――
├ 偏移量 ┤ 意义 ┤
├00h-01h ┤MZ'EXE文件标记 ┤
├2h-03h ┤文件长度除512的余数 ┤
├04h-05h ┤...............商 ┤
├06h-07h ┤重定位项的个数 ┤
├08h-09h ┤文件头除16的商 ┤
├0ah-0bh ┤程序运行所需最小段数 ┤
├0ch-0dh ┤..............大.... ┤
├oeh-0fh ┤堆栈段的段值 (SS) ┤
├10h-11h ┤........sp ┤
├12h-13h ┤文件校验和 ┤
├14h-15h ┤IP ┤
├16h-17h ┤CS ┤
├18h-19h ┤............ ┤
├1ah-1bh ┤............ ┤
├1ch ┤............ ┤
―――――――――――――――――――――――――
.EXE文件包含一个文件头和一个可重定位程序映象。文件头包含MS-DOS用于加载程序的信息,例如程序的大小和寄存器的初始值。文件头还指向一个重定位表,该表包含指向程序映象中可重定位段地址的指针链表。文件头的形式与EXEHEADER结构对应:
EXEHEADER STRUC
exSignature dw 5A4Dh ;.EXE标志
exExraBytes dw ? ;最后(部分)页中的字节数
exPages dw ? ;文件中的全部和部分页数
exRelocItems dw ? ;重定位表中的指针数
exHeaderSize dw ? ;以字节为单位的文件头大小
exMinAlloc dw ? ;最小分配大小
exMaxAlloc dw ? ;最大分配大小
exInitSS dw ? ;初始SS值
exInitSP dw ? ;初始SP值
exChechSum dw ? ;补码校验值
exInitIP dw ? ;初始IP值
exInitCS dw ? ;初始CS值
exRelocTable dw ? ;重定位表的字节偏移量
exOverlay dw ? ;覆盖号
EXEHEADER ENDS程序映象,包含处理器代码和程序的初始数据,紧接在文件头之后。它的大小以字节为单位,等于.EXE文件的大小减去文件头的大小,也等于exHeaderSize的域的值乘以16。MS-DOS通过把该映象直接从文件拷贝到内存加载.EXE程序然后调整定位表中说明的可重定位段地址。
定位表是一个重定位指针数组,每个指向程序映象中的可重定位段地址。文件头中的exRelocItems域说明了数组中指针的个数,exRelocTable域说明了分配表的起始文件偏移量。每个重定位指针由两个16位值组成:偏移量和段值。为加载.EXE程序,MS-DOS首先读文件头以确定.EXE标志并计算程序映象的大小。然后它试图申请内存。首先,它计算程序映象文件的大小加上PSP的大小再加上EXEHEADER结构中的exMinAlloc域说明的内存大小这三者之和,如果总和超过最大可用内存块的大小。则MS-DOS停止加载程序并返回一个出错值。否则面,它计算程序映象的大小加上PSP的大小再加上EXEHEADER结构中exMaxAlloc域说明的内存大小之和,如果第二个总和小于最大可用内存块的大小,则MS-DOS 分配计算得到的内存量。否则,它分配最大可用内存块。分配完内存后,MS-DOS确定段地址,也称为起始段地址,MS-DOS从此处加载程序映象。如果exMinAlloc域和exMaxAlloc域中的值都为零,则MS-DOS把映象尽可能地加载到内存最高端。否则,它把映象加载到紧挨着PSP域之上。接下来,MS-DOS读取重定位表中的项目调整所有由可重定位指针说明的段地址。对于重定位表中的每个指针,MS-DOS寻找程序映象中相应的可重定位段地址,并把起始段地址加到它之上。一旦调整完毕,段地址便指向了内存中被加载程序的代码和数据段。 MS-DOS在所分配内存的最低部分建造256字节的PSP,把AL和AH设置为加载 .COM程序时所设置的值。MS-DOS使用文件头中的值设置SP与SS,调整SS初始值,把起始地址加到它之上。MS-DOS还把ES和DS设置为PSP的段地址.最后,MS-DOS从程序文件头读取CS和IP的初始值,把起始段地址加到CS之上,把控制转移到位于调整后地址处的程序。
参考技术B 就是采用C语言编写的可执行文件,它的运行原理当然就是C语言啦 参考技术C EXE是在Windows操作系统里的应用程序,在别的系统里不能用,如Apple为DMG,别的操作系统里的程序在Windows也不能用.Windows有一个叫System和System32的内核,专门来处理Exe的运行,将程序转到内存执行,保存后将内存里的数据保存到硬盘. 参考技术D exe文件是含有计算机指令代码的文件, DOS下称为浮动代码文件, 一般是编译后的目标文件与运行库连接后形成.

AQS是什么? 它的实现原理是什么? 它是怎么实现的?

文章目录

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


AQS是什么? 它的实现原理是什么? 它是怎么实现的?

01 AQS是什么?

AQS指的是AbstractQueuedSynchronizer-抽象队列同步器

锁机制的一个规范
在java.util.concurrent工具包中,这个包简称为JUC。

02 AQS的实现原理?

AQS维护了一个volatile的修饰的共享变量state和一个FIFO线程等待队列,多线程争用资源被阻塞的时候会进入这个队列,state是一个共享变量,其访问有三种方式:getState() setState() compareAndSetState()[通过CAS是机制],通过尝试获取共享变量state的结果来对线程的状态做出处理。

AQS是将每一条请求共享资源的线程封装成一个CLH队列(虚拟的双向队列)的一个结点来实现锁的分配。根据volatile修饰的state共享变量,线程通过CAS去改变状态。

如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并将共享资源设置为锁定状态,如果被请求共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现,即将暂时获取不到锁的线程加入到队列中等待唤醒。

CLH虚拟队列:是一个虚拟的双向队列,不是一个具体的队列,只有结点和结点之间的关联关系。

总结:AQS就是基于CLH队列,用volatile修饰共享变量state,线程通过CAS去改变状态符,成功则获取锁成功,失败则进入等待队列,等待被唤醒。

03 AQS典型的实现类和资源共享方式?

ReentrantLock、CountDownLatch、Semaphore、CyclicBarrier、ReentrantReadWriteLock都是AQS的衍生物,他们都是我们【抽象队列同步器】的实现。
独占:只要一个线程能执行,ReentrantLock;
共享:多个线程可以同步执行,CountDownLatch、Semaphore、CyclicBarrier;
独占和共享:ReentrantReadWriteLock;

04 AQS的实现?

同步器的设计是给予模板方法模式,如果要实现同步器一般的方式的过程:
1)、继承AbstractQueuedSynchronizer并重写指定的方法。
2)、将AQS组合在同步组件的实现中,并调用其模板方法,而这些模板方法会调用使用者重写的方法。

04::01 AQS的实现-ReentrantLock

  1. state初始化为0,表示未锁定状态,A线程lock()时,调用tryAcquire()独占锁方法并将state+1。
  2. 之后其他线程在想tryAcquire()时候就会失败,直到A线程unlock()到state=0为止,其他线程才有机会获取该锁。
  3. A释放锁之前,自己也是可以重复获取此锁(state累加),这就是可重复锁的概念

04::02 AQS的实现-CountDownLatch

  1. 我们任务分为n个子线程去执行,state就初始化为n,n个线程并行执行。
  2. 每个线程执行完毕之后countDown()一次,state就会CAS原子性-1。
  3. 当n个子线程执行完毕之后,state=0,会unpark调用主线程,主线程就会从await方法函数回调,继续之后的操作。

以上是关于什么是.exe?它的运行原理是什么?的主要内容,如果未能解决你的问题,请参考以下文章

什么是看门狗它的原理 看门狗它的原理是什么

反射是什么?原理?作用?

什么是看门狗?它的原理?

什么是免流?它的原理是什么?这样违法吗?

Java Jvm运行机制原理

服务程序原理和实现