什么形式是DLL&是什么让它依赖于处理器

时间:2009-11-18 12:32:00

标签: dll operating-system processor

我知道DLL包含一个或多个导出的函数,这些函数分别被编译,链接和存储。

我的问题不是关于如何创建它......但它是关于它以什么形式存储的。它是以0和&的形式出现的。 1 ..或装配命令ADD,MUL,DIV,MOV,CALL,RETURN等。 也是因为它依赖于处理器......(如x86,x87,IBM 700指令集)..

有人可以简单地解释一下......!

5 个答案:

答案 0 :(得分:4)

首先,计算机中的一切的形式为“0& 1”。计算机可以将其中一些显示为文本,图片,声音,3D模型等,这只是您解释它们的一个问题。但在那里,在金属上,它只是“0& 1”(也称为位)。请注意,它们总是以8个为一组组合在一起,这些被称为“字节”。这实际上是为了提高效率,因为单独操作每一点都太繁琐了。实际上,今天的计算机甚至不再使用单个字节(或者更确切地说 - 它们很少这样做)。大多数情况下,你一次只能操作4个或8个字节,具体取决于你是使用32位还是64位CPU(用外行的术语来说,它实际上比这更复杂)。

对于.DLL文件 - 就像.EXE文件一样,它包含描述CPU可以执行的指令的字节。 CPU直接从.DLL / .EXE获取这些字节,并在不做任何进一步修改的情况下执行它们。这就是为什么这些文件是特定于CPU的。在不同的CPU体系结构中,相同的字节组合意味着不同的东西,因此.DLL / .EXE只能在其设计的CPU上正确运行。在其他CPU上,这些字节将意味着一些其他指令,并且在运行时,程序很可能会完全废话并立即崩溃。

您提到的装配命令也值得解释。 “汇编程序”不是CPU可以理解的语言。这是人类可以理解的语言。它的创建是因为直接在机器代码中写入(CPU实际理解的字节)非常困难。你得到的是屏幕上的完全胡言乱语(尝试在记事本中打开一些.EXE文件!)但是必须精确设置它才能工作。

因此汇编语言基本上是相同的,除了这些指令是用人们可以阅读的文本编写的。对于CPU可以理解的每个机器代码,都有一个带有人性化名称的指令。汇编编译器只是读取这些指令并将其替换为表示CPU执行的实际指令的字节。这是1:1的操作。汇编语言中的每个命令都匹配单个机器指令(再次,用外行的术语)。

所以你看,甚至没有一种汇编语言。每个CPU架构都有自己的汇编语言,因为它们各自都有不同的指令。

请注意,所有这些都适用于本机.DLL / .EXE文件。 .NET文件是不同的 - 它们不包含机器代码,而是包含抽象的,不存在的CPU的指令。它就像Java字节码。运行.NET .DLL / .EXE时,.NET运行时将其从抽象指令转换为特定CPU可以理解的指令。他们使用了很多技巧来实现这一点,因此这些文件的运行速度几乎与简单的.DLL / .EXE文件一样快。

这是否清楚了? :)

答案 1 :(得分:2)

原生DLL(不是.NET程序集)通常包含只能在特定平台上运行的机器代码。机器代码是一个字节序列,处理器将其视为指令(ADD,MOV等)。

答案 2 :(得分:2)

在Windows中,dll以PE格式存储,该格式基本上是包含有关如何将其映射到内存的信息的部分的集合。某些部分包含程序的代码(当然取决于处理器),其他部分包含程序的数据,其他部分包含导出和导入的函数等。

托管代码被编译为某种中间语言,在执行时由运行时JITed。因此,您的DLL将不包含任何与处理器相关的代码,并且您将能够在具有相关运行时的任何平台上执行您的程序。

答案 3 :(得分:1)

这取决于你的DLL。通常,DLL包含可执行代码作为EXE文件。这些代码DLL依赖于处理器,因为代码只能在特定平台上执行。代码使用与EXE文件(二进制机器代码)相同的“格式”存储。

但是,DLL有时只能包含数据:它们被称为“资源DLL”,根本不依赖于处理器。它们充当应用程序使用的数据文件的容器。

请注意,许多DLL都是混合的:它们包含代码和资源。例如,构成Windows操作系统用户部分的大多数DLL都是混合的:您可以使用Visual Studio或资源浏览器打开它们以查看它们包含的资源(数据段),或者使用Dependency Walker或dumpbin打开它们。查看它们包含的函数(代码段)。

(当然这个答案实际上是Windows特有的,我不知道.so文件是linux的等价的DLL)

答案 4 :(得分:0)

DLL和EXE都包含可执行代码。

在DLL的情况下,它没有可直接执行的必要部分。必须从另一段可执行代码中调用它。一个DLL可以调用另一个,但最终必须从和EXE调用。

因此,与适用于EXE的处理器兼容的规则也适用于DLL。