环保网站 源码,海南移动互联网开发,关键词广告,东莞网站自动化推广注#xff1a;这是本人学习汤小丹等编写的计算机操作系统#xff08;西安电子科技大学出版社#xff09;的学习笔记#xff0c;因此许多引用来源于此书#xff0c;在正文中就不注明了#xff01;
程序在运行前需要经过以下步骤#xff1a;编译程序对源程序进行编译生成…注这是本人学习汤小丹等编写的计算机操作系统西安电子科技大学出版社的学习笔记因此许多引用来源于此书在正文中就不注明了
程序在运行前需要经过以下步骤编译程序对源程序进行编译生成目标程序.obj链接程序将目标程序和需要的库文件链接在一起形成可执行程序.exe即一个完整的装入模块装入程序将装入模块装入内存然后运行。依次称为程序的编译、链接、装入。
程序的装入方式有三种绝对装入方式、可重定位装入方式和动态运行时的装入方式。
绝对装入方式。适用系统小且仅运行单道程序的情况此时很容易知道程序装入后将留在内存的什么位置因此程序经编译后将产生含有绝对地址物理地址或内存地址的目标代码装入程序将按照该地址装入内存因此装入内存后程序的实际地址内存地址与程序的逻辑地址完全相同不需要进行地址变换。程序中所使用的绝对地址既可以在编译或汇编时指出将程序中的符号地址转变为绝对地址也可以由程序员直接赋予用绝对地址编程但要求程序员熟悉内存的使用情况。
可重定位装入方式。用户程序编译链接后形成的可执行程序的起始地址一般都是从0开始的其它地址都是相对于起始地址计算的逻辑地址因此此时装入后的实际地址与程序中的逻辑地址不同需要进行地址变换。对于多道程序采用基址寻址有效地址EAA(BR)A为指令的地址码字段BR为基址寄存器其内容由OS和系统管理程序决定值不变系统根据BR的值为程序分配储存空间因此装入后需要根据该值进行地址变换即程序中的逻辑地址或虚拟地址加上基址即可对于程序中的数据地址语句中引用到的逻辑地址和外部调用符号都要进行相应的修改即需要对程序地址指令地址、数据地址和外部调用符号进行修改。把在装入时对目标程序中指令和数据地址的修改过程称为重定位对于可重定位装入方式该地址变换是一次完成的以后不可以再修改因此称为静态重定位。变址寻址EAA(IX)IX为变址寄存器此时IX的值可变由用户设定A的值不变通常为数组的起始地址。变址寻址用于处理数组问题编制循环程序相对寻址EA(PC)A常用于转移类指令无论该程序在主存的哪一个区域都可以正确运行对于编写浮动程序非常有利。
动态运行时的装入方式。如果程序在内存中会发生移动此时物理位置会发生变化因此可重定位装入方式不再适用移动后需要再次对地址进行修改如在具有对换功能的系统中一个进程可能会被多次换入和换出其位置总是在发生变化此时可采用动态运行时的装入方式。该方式将装入模块装入内存后并不立即把装入模块中的逻辑地址虚拟地址变换为物理地址而是把这种地址变换过程推迟到真正执行时进行即执行时通过EAA(BR)来完成地址变换因此装入模块的地址实际上一直都是逻辑地址虚拟地址程序执行时自动根据该地址进行变换此时在CPU中需要设置一个基址寄存器BR对于每一个进程OS都会为其分配一个基址。
链接程序的功能是将一组目标程序和需要的库文件链接成一个完成的装入模块根据进行链接的时间不同分为三种链接方式静态链接方式、装入时动态链接、运行时动态链接。
静态链接方式。在装入之前就将所有的目标模块和需要的库文件链接成为一个完整的装入模块可执行文件.exe以后不再拆开。每个目标模块都采用的是逻辑地址即起始地址均为0因此链接过程中需要做以下修改对相对地址程序或指令地址、数据地址进行修改对外部调用符号进行修改如CALLB表示调用模块B目标文件B改为JSR“L”L为B的首地址。如下 装入时动态链接。对于各个目标模块和库文件采用边装入边链接的方式即在装入一个目标模块时若发生一个外部调用事件将引起装入程序去找出相应的外部调用模块并将其装入内存然后进行链接并按照上图所示的方式修改地址。该方式具有以下优点1.便于对目标模块修改和更新。对于经过静态链接装配在一起的装入模块如果要修改或更新某个目标模块需要将其拆开低效且麻烦而且有时不可能。对于动态链接方式装入时动态链接和运行时动态链接模块是分开存放的对于修改和更新很容易实现注意即使装入了的模块原模块依然存在相当于拷贝一份装入。2.便于实现目标模块的共享。对于静态链接方式每个应用模块都必须含有其目标模块的拷贝无法实现对目标模块的共享。而动态链接方式却可以容易将一个目标模块链接到几个应用模块上。
运行时动态链接。其是对装入时动态链接方式的一种改进。这种链接方式是将对某些模块的链接推迟到程序执行时才进行。亦即在执行过程中当发现一个被调用模块尚未装入内存时立即由OS去找到该模块并将之装入内存将其链接到调用者模块上。凡在执行过程中未被用到的目标模块如处理错误用的模块如果运行过程中不出现错误则不会用到都不会被调入内存和被链接到装入模块上这样不仅能加快程序的装入过程而且可节省大量的内存空间。
在运行时进行链接通常被链接的共享代码称为动态链接库DLL, Dynamic Link Library或共享库shared library。