程序的装入怎么弄

时间:2025-01-27 18:18:27 单机游戏

程序的装入过程通常包括以下步骤:

编译

用户源程序首先由编译程序(Compiler)进行编译,生成目标模块(Object Module)。目标模块是纯二进制的机器级代码,但还不能直接执行,因为它可能还包含对其他目标模块或库函数的引用。

链接

接下来,链接程序(Linker)将编译后形成的一组目标模块以及它们所需要的库函数链接在一起,形成一个完整的装入模块(Load Module)。这个过程中,链接器会解析所有的符号引用,并生成可执行文件,如Windows下的.exe文件或Linux下的ELF文件。

装入

最后,装入程序(Loader)将装入模块装入内存。根据不同的装入方式,这个过程会有所不同:

绝对装入方式:在编译时已知程序将驻留在内存的什么位置,编译程序将产生绝对地址的目标代码。装入模块被装入内存后,由于程序中的逻辑地址与实际内存地址完全相同,不需要对程序和数据的地址进行修改。通常在程序中采用符号地址,然后在编译或汇编时,再将这些符号地址转换为绝对地址。

可重定位装入方式:目标模块中的地址为相对地址,装入模块中的逻辑地址与实际装入内存的物理地址不同。在装入时,对相对地址进行修改(重定位)以得到正确的物理地址。这种方式适用于多道程序环境,编译程序不可能预知编译后所得的目标模块应放在内存的何处。

动态运行时装入:这种方式允许在程序运行时装入到内存中移动的位置。装入程序在把装入模块装入内存之后,并不立即把装入模块中的逻辑地址转为物理地址,而是把地址转换推迟到程序真正要运行时才进行。这种方式需要一个重定位寄存器的支持。

建议

绝对装入方式适用于程序较小且固定在特定内存位置的情况,可以避免复杂的地址重定位过程。

可重定位装入方式适用于多道程序环境,可以动态分配内存,但需要在运行时进行地址重定位,可能会影响执行速度。

动态运行时装入提供了更大的灵活性,允许程序在运行时动态加载和卸载模块,但实现起来更为复杂,需要特定的运行时支持。

根据具体的应用场景和需求,可以选择合适的装入方式。