精华内容
下载资源
问答
  • 编译链接装入运行
    2021-05-19 11:53:49

    下面的内容都是我自己的一些想法,可能不正确,如有错,请指出来,我会及时更改。

    首先,我先编写一个main.asm汇编源程序,要明确的是,不同的汇编指令转化成二进制机器指令时,会有多个字节,不同指令所占用的字节是不同的。知道占用多个字节就可以了。
    看下图,反汇编下指令的地址和机器指令,我编写的main.asm转化为机器指令,指令的地址是从076B:0000开始的。
    在这里插入图片描述

    编译

    编译将我所写的main.asm文件转化为main.obj文件,生成一个目标文件。
    转化为目标文件的规则:假设我有一条语句是jmp next反汇编之后,就是变成了jmp 2500,那么这个2500就是相对我自己写的代码段的偏移地址。
    再假设我有一条语句是 mov ax,Y 那么转化成机器语言之后,再反汇编就是
    mov ax,[0002]就是相对数据段的偏移地址为2的内容送至ax。

    虽然程序是按编译->链接->装入的方式执行的,但是可以先跳到装入的内容看一下。

    链接

    就是将多个目标模块链接成一个大目标模块。
    每个模块中的指令地址都是从0开始的。
    比如三个目标模块A,B,C
    A所有指令地址为0 - L-1, B所有指令地址为0 - M-1,C所有指令地址为0 - N-1。

    装入

    这些内容都是按着时间线慢慢发展起来的,针对当时的不同的条件,所思考出的不同策略。

    1.绝对装入方式
    只适合运行单程序。
    每次将程序装入内存中初地址为R的地方,那么执行jmp 2500就是跳到jmp R+2500的地方,继续执行。

    2.可重定位装入方式

    适用于多程序
    可重定位就是给cpu配置两个寄存器基址寄存器、变址寄存器
    首先,OS会给程序分配一个起始地址,假设10000,保存在基址寄存器中,从这个起始地址,将程序的所有指令依次放入内存中。那么原来的指令jmp 2500放入内存中就会变成jmp 12500。
    变址寄存器是存放代码的长度,防止越界的。

    3.动态运行时的装入方式

    考虑一个程序会被分成多个部分,而这些部分可能会被多次换出,又被多次换入,放入内存中的物理地址就会改变。显然,可重定位装入方式就不适用了。
    那么对应其解决的策略就是原本的指令jmp 2500依旧放入内存中,当程序运行时,再将其转化为jmp12500执行,如果,这段代码更改地址了,可能会执行jmp 32500(由这段代码所在物理地址决定)。

    再扯一点,因为只有一个基址寄存器,当有多个进程在内存中,那么应该保存哪个进程的起始地址呢?
    实际上,每次会给一个刚运行的程序分配一个起始地址,当进程变为阻塞、切换其他进程时,会将这个起始地址保存在这个进程的PCB中。并且会把基址寄存器的内容修改为下一个将要运行进程的起始地址(在PCB中查看是否有起始地址,没有的话则系统分配一个)。
    每个进程都有自己的PCB。

    更多相关内容
  • 关注、星标公众号,直达精彩内容作者:hguisu一、地址概念和程序如何运行在多道程序环境下,要使程序运行,必须先为之创建进程。而创建进程的第一件事,便是将程序和数据装入内存。如何将...

        关注、星标公众号,直达精彩内容

    bb3dcd91b4d4084a253741b26118c308.png

    作者:hguisu

    一、地址概念和程序如何运行

    在多道程序环境下,要使程序运行,必须先为之创建进程。而创建进程的第一件事,便是将程序和数据装入内存。如何将一个用户源程序变为一个可在内存中执行的程序,通常都要经过以下几个步骤:

    首先是要编译

    由编译程序(Compiler)将用户源代码编译成cpu可执行的目标代码,产生了若干个目标模块(Object  Module)(即若干程序段)。形成的目标代码,每个目标代码都是以0为基址顺序进行编址,原来用符号名访问的单元用具体的数据——单元号取代。这样生成的目标程序占据一定的地址空间,称为作业的逻辑地址空间,简称逻辑空间

    在逻辑空间中每条指令的地址和指令中要访问的操作数地址统称为逻辑地址  。很简单,逻辑地址就是你源程序里使用的地址,或者源代码经过编译以后编译器将一些标号,变量转换成的地址。

    其次是链接

    由链接程序(Linker)将编译后形成的一组目标模块(程序段),以及它们所需要的库函数链接在一起,形成一个完整的装入模块(Load  Module)

    最后是装入(地址重定位)

    由装入程序(Loader)将装入模块装入物理内存。物理内存是真实存在的插在主板内存槽上的内存条的容量的大小。

    物理内存内存是由若干个存储单元组成的,每个存储单元有一个编号,这种编号可唯一标识一个存储单元,称为内存地址(或物理地址)。我们可以把内存看成一个从0字节一直到内存最大容量逐字节编号的存储单元数组,即每个存储单元与内存地址的编号相对应。

    装入模块虽然具有统一的地址空间,但它仍是以“0”作为参考地址,即是浮动的。要把它装入内存执行,就要确定装入内存的实际物理地址,并修改程序中与 地址有关的代码,这一过程叫做地址重定位。地址重定位主要是把逻辑地址转换成物理内存绝对地址,这个工作又称为地址映射。

    图 4-2 示出了这样的三步过程。

    e020ac56fe577b6151070774bcc3a322.png

    图4-2  对用户程序的处理步骤

    二. 程序的链接

    源程序经过编译后,可得到一组目标模块,再利用链接程序将这组目标模块链接,形成装入模块。根据链接时间的不同,可把链接分成如下三种:

    (1) 、 静态链接。在程序运行之前,先将各目标模块及它们所需的库函数,链接成一个完整的装配模块,以后不再拆开。我们把这种事先进行链接的方式称为静态链接方式。

    (2)、  装入时动态链接。这是指将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的链接方式。

    (3)、  运行时动态链接。这是指对某些目标模块的链接,是在程序执行中需要该(目标)模块时,才对它进行的链接。

    1.静态链接方式(Static Linking)

    我们通过一个例子来说明在实现静态链接时应解决的一些问题。在图 4-4(a)中示出了经过编译后所得到的三个目标模块A、B、C,它们的长度分别为 L、M和N。在模块A中有一条语句CALL B,用于调用模块B。在模块B中有一条语句CALL C,用于调用模块C。B和C都属于外部调用符号,在将这几个目标模块装配成一个装入模块时,须解决以下两个问题:

    (1)  对相对地址进行修改。在由编译程序所产生的所有目标模块中,使用的都是相对地址,其起始地址都为 0,每个模块中的地址都是相对于起始地址计算的。

    在链接成一个装入模块后,原模块B和 C在装入模块的起始地址不再是 0,而分别是 L和 L+M,所以此时须修改模块B和C中的相对地址,即把原B中的所有相对地址都加上 L,把原 C中的所有相对地址都加上L+M。

    (2)  变换外部调用符号。将每个模块中所用的外部调用符号也都变换为相对地址,如把B 的起始地址变换为 L,把 C 的起始地址变换为 L+M,如图 4-4(b)所示。

    这种先进行链接所形成的一个完整的装入模块,又称为可执行文件。通常都不再拆开它,要运行时可直接将它装入内存。这种事先进行链接,以后不再拆开的链接方式,称为静态链接方式。

    a1589aa9bc79f7c792ff9d09c3afeb63.png

    图 4-4 程序链接示意图

    2.装入时动态链接(Load-time Dynamic Linking)

    用户源程序经编译后所得的目标模块,是在装入内存时边装入边链接的,即在装入一个目标模块时,若发生一个外部模块调用事件,将引起装入程序去找出相应的外部目标模块,并将它装入内存,还要按照图4-4所示的方式来修改目标模块中的相对地址。装入时动态链接方式有以下优点:

    (1) 、 便于修改和更新。对于经静态链接装配在一起的装入模块,如果要修改或更新其中的某个目标模块,则要求重新打开装入模块。这不仅是低效的,而且有时是不可能的。若采用动态链接方式,由于各目标模块是分开存放的,所以要修改或更新各目标模块是件非常容易的事。

    (2)、  便于实现对目标模块的共享。在采用静态链接方式时,每个应用模块都必须含有其目标模块的拷贝,无法实现对目标模块的共享。但采用装入时动态链接方式,OS则很容易将一个目标模块链接到几个应用模块上,实现多个应用程序对该模块的共享。

    3.运行时动态链接(Run-time Dynamic Linking)

    在许多情况下,应用程序在运行时,每次要运行的模块可能是不相同的。但由于事先无法知道本次要运行哪些模块,故只能是将所有可能要运行到的模块都全部装入内存,并在装入时全部链接在一起。显然这是低效的,因为往往会有些目标模块根本就不运行。

    比较典型的例子是作为错误处理用的目标模块,如果程序在整个运行过程中都不出现错误,则显然就不会用到该模块。近几年流行起来的运行时动态链接方式,是对上述在装入时链接方式的一种改进。

    这种链接方式是将对某些模块的链接推迟到程序执行时才进行链接,亦即,在执行过程中,当发现一个被调用模块尚未装入内存时,立即由OS去找到该模块并将之装入内存,把它链接到调用者模块上。凡在执行过程中未被用到的目标模块,都不会被调入内存和被链接到装入模块上,这样不仅可加快程序的装入过程,而且可节省大量的内存空间。

    三. 程序的装入(地址的变换)

    为了阐述上的方便,我们先介绍一个无需进行链接的单个目标模块的装入过程。该目标模块也就是装入模块。在将一个装入模块装入内存时,可以有绝对装入方式可重定位装入方式动态运行时装入方式,下面分别简述之。

    1.绝对装入方式(Absolute Loading Mode)

    在编译时,如果知道程序将驻留在内存的什么位置,那么,编译程序将产生绝对地址的目标代码。即按照物理内存的位置赋予实际的物理地址。例如,事先已知用户程序(进程)驻留在从R处开始的位置,则编译程序所产生的目标模块(即装入模块)便从R处开始向上扩展。

    绝对装入程序按照装入模块中的地址,将程序和数据装入内存。装入模块被装入内存后,由于程序中的逻辑地址与实际内存地址完全相同,故不须对程序和数据的地址进行修改。程序中所使用的绝对地址,既可在编译或汇编时给出,也可由程序员直接赋予。

    这个方式的优点:是CPU执行目标代码快

    缺点:

    1)是由于内存大小限制,能装入内存并发执行的进程数大大减少

    2)编译程序必须知道内存的当前空闲地址部分和其地址,并且把进程的不同程序段连续地存放起来,编译非常复杂。由于程序
    因此,通常是宁可在程序中采用符号地址,然后在编译或汇编时,再将这些符号地址转换为绝对地址。

    如何把虚拟内存地址空间变换到内存唯一的一维物理线性空间?涉及到两个问题:

    一是虚拟空间的划分问题。

    二是把虚拟空间中已经链接和划分好的内容装入内存,并将虚拟空间地址映射内存地址的问题。即地址映射。地址映射就是建立虚拟地址与内存地址的关系。

    2.静态地址重定位(可重定位装入方式 Relocation Loading Mode)

    绝对装入方式只能将目标模块装入到内存中事先指定的位置。在多道程序环境下,编译程序不可能预知所编译的目标模块应放在内存的何处,因此,绝对装入方式只适用于单道程序环境。

    在多道程序环境下,所得到的目标模块的起始地址通常是从 0 开始的,程序中的其它地址也都是相对于起始地址计算的。此时应采用可重定位装入方式,根据内存的当前情况,将装入模块装入到内存的适当位置。

    静态地址重定位:即在程序装入对目标代码装入内存的过程中完成,是指在程序开始运行前,程序中指令和数据的各个地址均已完成重定位,即完成虚拟地址到内存地址映射。地址变换通常是在装入时一次完成的,以后不再改变。

    值得注意的是, 在采用可重定位装入程序将装入模块装入内存后, 会使装入模块中的所有逻辑地址与实际装入内存的物理地址不同,图4-3示出了这一情况。

    8c4cf7f14a32b1ca477e679314402781.png

    图 4-3 作业装入内存时的情况

    例如,在用户程序的 1000 号单元处有一条指令LOAD 1,2500,该指令的功能是将 2500 单元中的整数 365 取至寄存器 1。但若将该用户程序装入到内存的 10000~15000号单元而不进行地址变换, 则在执行11000号单元中的指令时,它将仍从 2500 号单元中把数据取至寄存器1而导致数据错误。

    由图4-3 可见,正确的方法应该是将取数指令中的地址 2500 修改成 12500,即把指令中的相对地址 2500 与本程序在内存中的起始地址 10000 相加,才得到正确的物理地址12500。除了数据地址应修改外,指令地址也须做同样的修改,即将指令的相对地址 1000 与起始地址 10000 相加,得到绝对地址 11000。

    优点:无需硬件支持

    缺点:

    1)程序重定位之后就不能在内存中搬动了;

    2)要求程序的存储空间是连续的,不能把程序放在若干个不连续的区域中。

    3.动态地址重定位(动态运行时装入方式Dynamic Run-time Loading)

    可重定位装入方式可将装入模块装入到内存中任何允许的位置,故可用于多道程序环境;但这种方式并不允许程序运行时在内存中移动位置。因为,程序在内存中的移动,意味着它的物理位置发生了变化, 这时必须对程序和数据的地址(是绝对地址)进行修改后方能运行。

    然而,实际情况是,在运行过程中它在内存中的位置可能经常要改变,此时就应采用动态运行时装入的方式。

    动态地址重定位:不是在程序执行之前而是在程序执行过程中进行地址变换。更确切的说,是把这种地址转换推迟到程序真正要执行时才进行,即在每次访问内存单元前才将要访问的程序或数据地址变换成内存地址。

    动态重定位可使装配模块不加任何修改而装入内存。为使地址转换不影响指令的执行速度,这种方式需要一个重定位寄存器的支持,

    优点:

    1)目标模块装入内存时无需任何修改,因而装入之后再搬迁也不会影响其正确执行,这对于存储器紧缩、解决碎片问题是极其有利的;

    2)一个程序由若干个相对独立的目标模块组成时,每个目标模块各装入一个存储区域,这些存储区域可以不是顺序相邻的,只要各个模块有自己对应的定位寄存器就行。

    缺点:需要硬件支持。

    四. Windows NT动态链接库

    5.1. 构造动态链接库

    DLL是包含函数和数据的模块,它的调用模块可为EXE或DLL,它由调用模块在运行时加载;加载时,它被映射到调用进程的地址空间。在VC中有一类工程用于创建DLL。

    • 库程序文件 .C:相当于给出一组函数定义的源代码;

    • 模块定义文件 .DEF:相当于定义链接选项,也可在源代码中定义;如:DLL中函数的引入和引出(dllimport和dllexport)。

    • 编译程序利用 .C文件生成目标模块 .OBJ

    • 库管理程序利用 .DEF文件生成DLL输入库 .LIB和输出文件 .EXP

    • 链接程序利用 .OBJ和 .EXP文件生成动态链接库 .DLL。

    5.2. DLL的装入方法

    1)装入时动态链接(load-time):

    • 在编程时显式调用某个DLL函数,该DLL函数在可执行文件中称为引入(import)函数。

    • 链接时需利用 .LIB文件。在可执行文件中为引入的每个DLL建立一个IMAGE_IMPORT_DESCRIPTOR结构。

    • 在装入时由系统根据该DLL映射在进程中的地址改写Import Address Table中的各项函数指针。Hint是DLL函数在DLL文件中的序号,当DLL文件修改后,就未必指向原先的DLL函数。在装入时,系统会查找相应DLL,并把它映射到进程地址空间,获得DLL中各函数的入口地址,定位本进程中对这些函数的引用

    装入时动态链接过程:

    (注:Import Address Table是在装入时依据DLL模块的加载位置确定)。

    aa70efaeb84a0fad3f5b68a1cd2bb4c0.png

    「DLL函数的调用过程:」

    a311024899c9676cf9e666e4d62ffb4d.png

    2)运行时动态链接(run-time):

    在编程时通过LoadLibrary(给出DLL名称,返回装入和链接之后该DLL的句柄), FreeLibrary, GetProcAddress(其参数包括函数的符号名称,返回该函数的入口指针)等API来使用DLL函数。这时不再需要引入库(import library)。

    • LoadLibrary或LoadLibraryEx把可执行模块映射到调用进程的地址空间,返回模块句柄;

    • GetProcAddress获得DLL中特定函数的指针,返回函数指针;

    • FreeLibrary把DLL模块的引用计数减1;当引用计数为0时,拆除DLL模块到进程地址空间的映射;

    运行时动态链接的例子:

    HINSTANCE hInstLibrary;//模块句柄定义
    DWORD (WINAPI *InstallStatusMIF)(char*, char*, char*, char*, char*, char*, char*, BOOL);//函数指针定义
    if (hInstLibrary = LoadLibrary("ismif32.dll"))//映射
    {
        InstallStatusMIF = (DWORD (WINAPI *)(char*,char*,char*, char*, char*, char*, char*, BOOL))      GetProcAddress(hInstLibrary, "InstallStatusMIF");//获得函数指针
        if (InstallStatusMIF)
        {
            if (InstallStatusMIF(“office97”, “Microsoft”, “Office 97”, “999.999”, “ENU”, “1234”, ”Completed successfully”, TRUE) !=0)//调用DLL模块中的函数
            {
            }
        }
        FreeLibrary(hInstLibrary);//拆除映射
    }

    作者:hguisu

    原文地址:https://blog.csdn.net/hguisu/article/details/5713099


    版权归原作者所有,如有侵权,请联系删除。

    ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

    关注我的微信公众号,回复“加群”按规则加入技术交流群。

    欢迎关注我的视频号:

    点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。
    展开全文
  • 前言 本文梳理程序是如何运行的。 内存的基础知识 内存的概念和作用 内存是用于存储数据的硬件。...代码会被编译成机器码被操纵系统执行,包含相应指令、操作码、和若干参数等。 在生成机器指令时并不知道该进程

    前言

    本文梳理程序是如何运行的。

    内存的基础知识

    image.png

    内存的概念和作用

    内存是用于存储数据的硬件。程序执行前需要先放到内存中才能被CPU处理。

    • 存储单元
      内存地址从0开始,每个地址对应一个存储单元。
      如果计算机是按字节编址的,则每个存储单元的大小为1字节,即8位;
      如果是按字编址的,那么每个存储单元的大小为一个字;字长是按CPU指令长度来的,32位/64位等。

    进程运行的基本原理

    image.png

    • 指令的工作原理
      代码会被编译成机器码被操纵系统执行,包含相应指令、操作码、和若干参数等。
      在生成机器指令时并不知道该进程的数据会被放到什么位置,所以编译时生成的指令中一般是使用逻辑地址。

    • 逻辑地址 vs 物理地址
      逻辑地址,就是相对地址;
      物理地址,绝地地址;
      程序编程时产生的指令只用关心相对地址,实际放入内存中时再根据进程起始位置得到绝对地址就能找到相应的数据了。
      从逻辑地址到物理的地址的转换将有装入程序完成。

    • 代码编译到运行流程:编译->链接->装入
      编译:由编译程序Compiler将源代码编译成若干个目标模块,翻译成机器语言
      链接:由链接程序Linker将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块(可执行文件);
      装入:可执行文件只有被装载到内存以后才能被CPU执行,由装入程序Loader将装入模块装入内存运行;

    三种链接方式

    源程序经过编译后,可得到一组目标模块,再利用链接程序将这组目标模块链接,形成装入模块。根据链接时间的不同,可把链接分成如下三种:

    • 静态链接:
      在程序运行前,先将各个目标模块以及他们所需的库函数连接成一个完成的可执行文件,之后不再拆开;

    • 装入时动态链接:
      将各目标模块装入内存时,边装入边链接。

    • 运行时动态链接:
      在程序执行中需要该目标模块时,才对它进行链接。
      优点是便于修改和更新,便于实现对目标的共享。

    三种装入方式

    可执行文件只有被装载到内存以后才能被CPU执行,由装入程序Loader将装入模块装入内存运行;
    装入模块有三种方式完成逻辑地址到物理地址的装换:有绝对装入、可重定位装入、动态运行装入三种方式,此处以连续分配方式为例,后续讲解非连续分配方式的地址转换;
    现在一般都采用动态运行装入;

    • 绝对装入:
      在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。即编译、链接后得到的装入模块的指令直接就使用了绝对地址;
      装入程序按照装入模块中的地址,将程序和数据装入内存;
      绝对装入只适用于单道程序环境。

    • 静态重定位(可重定位装入):
      编译、链接后的装入模块的地址都是从0开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址,装入程序根据内存的当前情况,将装入模块装入到内存的适当位置,并在装入时对地址进行重定位,将逻辑地址变换为物理地址。
      地址变换是在装入时一次性完成的。

      • 特点:
        静态重定位的特点是在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,则装入失败。作业一旦进入内存后,运行期间不能再移动,也不能再申请新的内存空间。
    • 动态重定位(动态运行时装入):
      编译、链接后的装入模块的地址都是从0开始的,装入程序把装入模块装入内存后,在程序真正执行时候进行地址转换。因此装入内后后所有地址依然是逻辑地址。
      这种方式需要一个重定位寄存器(存放装入模块存放的起始位置)的支持。
      采用动态重定位时允许程序在内存中发生移动。

      • 特点:
        并且可将程序分配到不连续的内存空间中;
        还可以只用装入部分程序代码即可运行,在程序运行时进行动态内存分配即可;
        便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间;

    参考:
    程序如何运行:编译、链接、装入
    Linux下编译、链接和装载

    展开全文
  • 关于程序的编译链接装入,与运行 编译是将程序员编辑的代码段中的符号地址转换为目标文件中的逻辑地址,这么说有点逆序,正因为生成了目标我文件,因此才将便于人管理的符号空间,转成了便于计算机识别的逻辑空间. ...

    关于程序的编译,链接,装入,与运行

    编译是将程序员编辑的代码段中的符号地址转换为目标文件中的逻辑地址,这么说有点逆序,正因为生成了目标我文件,因此才将便于人管理的符号空间,转成了便于计算机识别的逻辑空间.

    链接是将编译好的目标文件中加入库文件(#include<…>等等),将它们置于统一的逻辑地址之下.生成可执行文件(.exe)(如果在编译完之后就链接了,就是静态链接,这样可执行文件就要一直拖家带口的<它的那些库文件>,而且还很大)

    装入,将可执行文件放到内存之中,注意在这之前文件里面都是逻辑空间(从零开始),但是这一步是分水岭,因为这一步就知道到时候文件具体会住在内存的那一片地了,因此在这一步可以选择把文件中的逻辑地址转换为物理地址(当然也可以不转),转了就是静态重定位,不转就是动态重定位.

    运行,程序执行

    我主要是分享下面这几张图的,关于链接与重定位

    有什么不对的地方,望大家指出

    接下来两张图是关于整个过程中地址空间的变化

    编译与链接

    装入与运行

    接下来一张图是关于链接与重定位的位置

    整个过程

    接下来一张图是关于链接与重定位在做什么

    链接与重定位

    展开全文
  • 链接:由链接程序把编译好的目标模块,以及运行所需的库函数链接在一起,形成一个完整的可装入模块。 3.装入:把链接好的模块送入内存。 总结: 1.源程序编译好后,形成的一组目标模块里面都是逻辑地址。 2.然后通过...
  • 而创建进程的第一件事,便是将程序和数据装入内存。如何将一个用户源程序变为一个可在内存中执行的程序,通常都要经过以下几个步骤: 首先是要编译编译程序(Compiler)将用户源代码编译成cpu可执行的目标代码,...
  • 装入时动态链接 运行时动态链接 程序装入 静态地址重定位 动态地址重地位 基本分页存储管理的地址变换 逻辑地址空间与物理地址空间 前言 在多道程序环境下,要使程序运行,必须先为之创建进程。而创建进程的...
  • 编译时和运行时区别

    千次阅读 2021-06-15 15:35:53
    另外还有啥链接器.汇编器.为了了便于理解我们可以统称为编译器) 那编译时就是简单的作一些翻译工作,比如检查老兄你有没有粗心写错啥关键字了啊.有啥词法分析,语法分析之类的过程.就像个老师检查学生的作文中有没有...
  • 而创建进程的第一件事,便是将程序和数据装入内存。如何将一个用户源程序变为一个可在内存中执行的程序,通常都要经过以下几个步骤: 首先是要编译: 由编译程序(Compiler)将用户源代码编译成cpu可执行的目标代码,...
  • C++编辑编译链接运行

    千次阅读 2018-04-17 09:20:22
    从写一个简单的“hello world!”到完成一个大型程序,当...了解这五个过程中所做的工作,对我们理解头文件、库文件等在程序中的作用是有帮助的,而且如果能够清楚的了解编译链接过程,在编程时定位错误,纠正错误,...
  • 编译链接过程

    千次阅读 多人点赞 2018-08-24 23:17:54
    编译链接过程 C/C++程序从文本到可执行文件之间是一个复杂的过程. 对于源代码(.c/.cpp)文件我们是不能直接运行的, 必须经过一系列的处理才能转化为机器语言, 再通过链接相应的文件转化为可执行程序. 这个过程称为...
  • C语言- 详解 编译链接 的过程

    千次阅读 2022-04-10 10:52:25
    VS2019 集成开发环境不方便观察每个细节 我们使用 Linux gcc来演示编译链接的过程
  • 这一篇也是在学习原理,学习了之前的一种存储器的抽象:地址空间。还有了解了链接装入方式。其中对装入的方式还学习了哈工大老师的课程,讲的很不错,也更深入了解了装入方式。
  • 程序的链接装入

    2021-11-16 19:43:14
    对于静态链接,程序的链接是在程序的装入之前 编译程序 链接程序 装入程序 一.程序的链接 1.静态链接 在程序运行之前,把所有的目标模块链接在一起 2.装入时动态链接装入内存时,边装入链接 3.运行时动态装入 ...
  • 程序如何运行编译链接装入

    万次阅读 多人点赞 2010-07-05 11:02:00
    1. 地址相关概念 1. 物理地址(physical address) 物理内存,真实存在的插在主板内存槽上的内存条的容量的大小. 内存是由若干个存储单元组成的,每个存储单元有一个编号,这种编号可唯一标识一个存储单元,称为...
  • 静态链接装入时动态链接运行时动态链接

    万次阅读 多人点赞 2013-06-30 13:01:14
    实现链接的方法有三种:静态链接装入时动态链接运行时动态链接。 ①静态链接 图5.2.2示出了经编译后所得到的三个目标模块A、B、C,他们的长度分别为 L、M、N。在模块A中,有 一条语句CALL B,用于调用模块B。在...
  • C/C++程序的编译链接过程详解

    千次阅读 2020-08-15 15:08:16
    编译编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。 C源程序...
  • 深入程序编译链接和装载过程

    千次阅读 多人点赞 2018-12-06 12:56:02
    深入编译链接运行 CPU、内存 与 I/O 32位4GLinux虚拟地址空间布局 指令和数据 分析二进制可重定位目标文件main.o 的组成 强符号与弱符号 符号表 链接过程分析 可执行文件分析 run可执行文件的组成格式...
  • 编译器:将.c/.h文件转换成.s文件,使用的gcc命令是:gcc –S,对应于编译命令 cc –S;汇编器:将.s 文件转化成 .o文件,使用的gcc 命令是:gcc –c,对应于汇编命令是 as;链接器:将.o文件转化成可执行程序,使用...
  • C++编译链接过程详解

    万次阅读 多人点赞 2018-09-01 19:27:48
    C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作...
  • 在自己实践的情况下,基本验证了编译链接(动态链接、静态链接)的过程。这里简单用自己的语言来说一下编译链接编译:将源文件编译成二进制的目标文件(这里说的编译是大的概念 包括:预处理、编译非汇编、...
  • 操作系统中采用的内存管理方式: 重定位(relecation) 分段(segmentation) 分页(paging) ...由源程序经过汇编或编译后,形成目标程序,每个目标程序都是以0为基址顺序进行编址的,原来用符号名访问的单
  • 程序编译链接运行过程

    千次阅读 2018-04-01 11:19:54
    进程在内存上的布局:在x86体系32位linux内核/操作系统下:每一个进程在运行的时候,系统会为其分配一个以上构造的4G的虚拟地址空间:3G为用户空间(私有)1G为内核空间(共享)对任何一个普通进程:涉及到5种不同段...
  • 装入时动态链接是指:用户源程序编译后,得到一组目标模块,在装入内存时,采用边装入,边链接的方式。即在装入一个目标模块时,若发生一个外部模事件,将引起装入程序去找出相应的外部目标模块,并将他装入内存。 ...
  • 什么叫编译时和运行

    万次阅读 多人点赞 2018-06-17 15:02:22
    转载http://blog.csdn.net/weiwenhp/article/details/8107203以前经常听说编译时和运行时的概念.但没太搞明白具体代表啥意思.后面花了点时间研究了下.总算知道个大概意思了.编译编译时顾名思义就是正在编译的时候....
  • 各位坛内大神,我一直想不明白为啥windows上的应用程序我们安装的是exe,已经编译连接好的可执行性文件,意思是说实际运行时是直接将装入模块装入内存作进程执行吗,不是说编译的目标代码用的是相对地址,连接了的...
  • C语言的编译链接过程详解

    千次阅读 2018-08-04 11:43:31
    我们将对C语言的这种处理过程称为编译链接编译就是把文本形式源代码翻译为机器语言形式的目标文件过程。 链接是把目标文件、操作系统的启动代码和用到的库文件进行组织最终形成可执行代码的过程。编译链接...
  • os 程序的装入链接

    2022-01-25 09:32:56
    os 程序的装入链接

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,103
精华内容 10,041
关键字:

编译链接装入运行