地址转换过程的模拟实现 课程设计报告汇总.docx
- 文档编号:27889761
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:66
- 大小:696.30KB
地址转换过程的模拟实现 课程设计报告汇总.docx
《地址转换过程的模拟实现 课程设计报告汇总.docx》由会员分享,可在线阅读,更多相关《地址转换过程的模拟实现 课程设计报告汇总.docx(66页珍藏版)》请在冰豆网上搜索。
地址转换过程的模拟实现课程设计报告汇总
淮阴工学院
操作系统课程设计报告
选题名称:
地址转换过程的模拟实现
系(院):
经济管理学院
专业:
信息管理与信息系统
班级:
姓名:
学号:
姓名:
学号:
姓名:
学号:
姓名:
学号:
指导教师:
学年学期:
~学年第学期
年月日
设计任务书
课题
名称
地址转换过程的模拟实现
设计
目的
1.理解地址转换相关理论。
2.熟悉地址转换的过程。
3.掌握常用地址转换算法的实现过程。
实验
环境
1.硬件:
PC机,奔腾IV以上CPU,512MB以上内存,80G以上硬盘。
2.软件:
Windows2000/XP、MicrosoftVisualC++6.0。
任务
要求
1.搜集地址转换过程的模拟实现可能涉及到的知识和相关资料。
2.应用MicrosoftVisualC++6.0集成开发环境,设计并实现一个地址转换模拟程序。
3.确保地址转换模拟程序能正确运行。
4.参加答辩,撰写课程设计报告。
工作进度计划
序号
起止日期
工作内容
1
2013.12.14
课题任务下达,查阅文献资料
2
2013.12.15~2013.12.17
课题总体设计、素材搜集与处理
3
2013.12.18~2013.12.20
课题详细设计、调试、完善设计
4
2013.12.21
答辩,撰写报告
指导教师(签章):
年月日
摘要:
本课程设计主要针对地址转换相关理论进行设计,程序能模拟出操作系统常用的地址转换算法,包括可变分区存储管理的地址转换、分页存储管理的地址转换、分段存储管理的地址转换和段页式存储管理的地址转换。
具体来说,把整个内存分成大小相等内存块,内存块从0开始依次编号。
把用户程序分成若干段,每段有个段名。
页面的大小和内存块相同,每段的各个页面都分别从0开始依次编号。
虚拟空间的最小单位是页而不是段,内存就被分为若干个页,且每段所拥有的程序和数据在内存中可以分开存放,分段大小也不再受内存可用区的限制。
程序模拟实现了四种地址转换方式,从中观察各种方法的优缺点及应用特点。
段页式存储管理系统,用分段的方法来分配和管理虚拟存储器,而用分页的方法来分配和管理主存。
既有段式系统便于实现段的共享,段的保护,动态链接和段的动态增长等一系列优点,又能像页式系统那样,很好地解决内存的外碎片问题。
关键词:
地址转换,虚拟地址,物理地址,偏移,越界
1需求分析
本课程设计题目:
地址转换过程的模拟实现。
课程设计任务及要求:
(1)搜集地址转换过程的模拟实现可能涉及到的知识和相关资料。
(2)应用MicrosoftVisualC++6.0集成开发环境,设计并实现一个地址转换模拟程序。
(3)确保地址转换模拟程序能正确运行。
(4)参加答辩,撰写课程设计报告。
运行环境:
WindowsXP系统Pentium(R)Dual-coreCPU3.20GHz1.96G内存200G硬盘。
开发工具:
本实验使用VC++6.0平台,使用基本的控制台应用程序,单文档结构,主要数据结构是结构体间的关系。
打开VC++6.0建立一个新的C++源文件,根据数据结构编写代码。
1.1可变分区存储管理的地址转换
一、任务要求
该程序要对每一个虚地址计算其代表的有效地址所对应的物理地址,并进行越界判断,打印出每个虚地址的物理地址。
能够输入进程名称和内存需求量,按页式存储管理方式把进程分成若干页,分配到内存中的若干个块中,同时生成并显示相应的页表。
输入一个逻辑地址能够转换并输出相应的物理地址。
二、基本思想
可变分区的基本原理是:
可变分区是指在作业装入是,依据它对内存空间实际的需求量来划分内存的分区,因此,每个分区的尺寸与进入他的作业大小相同。
它能有效解决固定分区的内存碎片问题,是一种较为常用的存储管理方法。
因为在系统运行过程中,内存中分区的数目和大小都是可变的,所以这种可变式分区也称为动态分区[8]。
三、存储器的基本性能参数
评价存储器性能的参数主要有三个方面:
容量、速度与价格。
存储器容量用S=W×l×m表示,W为存储器字长,l为存储器字数,m则为存储器体数。
评价存储器的速度一般有以下几个参数:
访问时间(accesstime)Ta:
从存储器接到读请求到所读的字传送到数据总线上的时间间隔。
存储周期Tm:
连续两次访问存储器之间所必需的最小时间间隔。
一般Tm>Ta。
存储带宽Bm:
存储器被连续访问时所提供的数据传输速流,单位是位(或字节)/秒。
存储器的价格通常用单位字节价格来表示。
若总容量为S的存储器的总价格为C,则单位字节价格c=C/S。
四、存储器层次结构的基本原理
程序设计人员总是希望存储器的速度尽可能的高,以与处理器的速度相匹配;存储器的容量尽可能的大,以装下可能极大的程序;因此,高速度、大容量、低价格始终是存储体系的设计目标。
一方面,经过几十年的发展,存储器的工艺实现技术有了突飞猛进的发展,高速、大容量、低价的存储器件以惊人的速度生产出来。
尽管如此,存储技术的发展证明单一工艺的单一存储器很难同时满足容量、价格、速度三方面的性能要求。
事实上,对容量与速度、速度与价格、容量与价格的性能要求是相互有矛盾的。
而且,存储器速度的改进始终跟不上CPU速度的提高。
另一方面,所有程序都具有这样的行为特性:
程序倾向于再次使用最近刚用过的数据和指令。
这样的局部性反映在空间和时间两个方面。
空间局部性(spatiallocality):
如果某个数据或指令被引用,那么地址邻近的数据或指令不久很可能也将被引用。
时间局部性(temporallocality):
如果某个数据或指令被引用,那么不久它可能还将再次被引用。
为了满足对存储器的性能要求,随着存储技术的不断发展,根据程序本身这种局部性的行为特性以及小硬件速度更快的设计原则,基于不同容量和速度的多种存储器所构成的存储器层次结构很自然地就产生了。
一个存储器层次结构由多级不同类型的存储器构成;越靠近CPU的存储器容量越小、速度越快、价格越高,离CPU越远的存储器容量越大、速度越慢、价格越低;第i级存储器存储的信息是第i-1级存储信息的子集(根据时间局部性),相邻两级存储器之间以块为单位进行信息交换(根据空间局部性);各级存储器借助辅助软硬件构成一个整体,使得该存储体系具有接近于第n级存储器速度、接近于第1级存储器容量和单位字节价格的性能。
存储器层次结构是由多级存储器构成的,但管理是以两级存储器为单位来进行的,而且一般只有在相邻两级存储器之间可以进行信息交换。
下面以两级存储器层次结构(简称存储层次)为例介绍存储器层次结构的一些基本概念。
块(Block):
相邻两级存储器之间信息交换的最小单位。
块大小一般是固定的,也可以是可变的。
若块大小固定,则两级存储器的容量为块大小的整数倍。
命中率(HitRate)H:
CPU产生的有效地址可以直接在高层存储器中访问到的概率。
失效率(MissRate)M:
CPU产生的有效地址直接在高层存储器中访问不到的概率。
M=1-H。
命中时间(HitTime):
访问高层存储器所需的时间,其中包括本次访问是命中还是失效的判定时间。
失效损失(MissPenalty):
用低层存储器中相应的块替换高层存储器中的块,并将该块传送到请求访问的设备(通常是CPU)的时间。
它又可细分为访问时间和传送时间(transfertime)两部分。
其中前者指访问高层存储器失效时,在低层存储器中访问到块中第一个字的时间,又称访问延迟(accesslatency)。
后者则是传送块内其它字的附加时间。
访问时间与低层存储器的延迟有关,而传送时间则依赖于两级存储器之间的传输带宽和块大小。
五、存储器层次结构的性能
由于存储器层次结构的设计目标之一是使其速度接近于高层存储器的速度,因此容易根据命中率的高低来评价存储器层次结构性能的好坏。
由于命中率或失效率与硬件速度无关,因而这样的评价是很片面的。
更好的评价存储器层次结构的性能参数是平均存储访问时间(averagememory-accesstime),其定义如下:
平均存储访问时间=命中时间+失效率×失效损失
应该注意的是尽管用平均存储访问时间评价存储器层次结构的速度性能比简单的用命中率来评价要好,平均存储访问时间仍然是性能的一种间接测度,它无法完全替代执行时间这个最准确的性能参数。
处理器的性能是计算机设计的最终依据,所以在选择降低平均存储访问时间的策略时应考虑对CPU性能的影响,保证设计方案不仅能降低平均存储访问时间,还能有益于改进CPU的性能,如同时提高CPI(CyclesPerInstruction,简称为指令的平均周期数)。
下面讨论一下存储器层次结构设计对CPU设计的影响。
在不支持存储器层次结构的系统中,由于所有的存储访问都需要相同的时间,所以处理器的设计相对简单。
而在存储器层次结构中对高层存储器的访问存在失效问题,这意味着CPU必须能够处理可变的存储访问时间。
当失效损失较小,只有几十个时钟周期时,CPU通常采用等待块传输结束的策略。
而当失效损失很大,达到CPU时钟的几千倍时,仍让CPU空闲着等待传输结束就太浪费了。
一般采用中断使CPU切换到其它进程去执行的办法。
但用这种方法来避免失效损失带来的额外开销意味着任何存储访问都可能导致CPU中断。
这样CPU还必须能够恢复引起这种中断的存储地址,使系统在失效处理时知道要传送哪一块。
当存储传送结束时,恢复原来被中断的进程,重新执行引起访问失效的那条指令。
处理器还必须设有一些机制以确定所需信息是否在存储器层次结构的最高层存储器中。
在每次存储访问时都要作这种判定检查,因而会影响命中时间。
为了保证达到可接受的性能,这种检测机制通常用硬件实现。
要实现存储器层次结构,处理机还必须有在相邻两级存储器之间传送信息块的机制。
如果块传送只需几十个时钟周期,那么这种传送机制一般用硬件来控制;如果需要几千个时钟周期,则可以用软件方法实现。
1.2分页存储管理的地址转换
一、任务要求
这个程序要把给出的虚拟地址找到相对应的物理地址,打印出相应的页号,内存块号及相应的物理地址。
二、意义
能够理解分页存储的思想,了解页表的结构。
掌握逻辑地址与逻辑的转换。
了解内存的分配及回收。
当创建一个进程之后,根据这个进程的大小,会给这个进程分配内存,可能时连续的内存,页可能时不连续的。
首先会将进程分成若干的页,每页对应的内存中的一个无力块。
页的大小等于物理块的大小,这样就形成了页和内存块对应的页表。
进程执行的会先访问页表。
三、基本思想
在存储器管理中,连续分配方式会形成许多“碎片”。
虽然可能通过“紧凑”方法将许多碎片拼接成可用的大块空间,但须为之付出很大开销。
如果允许将一个进程直接分散地装入到许多不相邻的分区中,则无须再进行“紧凑”。
基于这以思想而产生了离散式分配方式。
如果离散分配的基本单位式页,则称为基本分页存储管理方式,或称之为纯分页存储方式,它将内存分成多个同样大小的存储区,每个进程页分成同样大小的页,较小的进程需要较少的页,较大的进程需要较多的页,进程在调入内存式,所有的进程页放入内存中的空闲页,并建立页表【1】。
这种方法解决了分区方案中所固有的许多问题。
分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,也把内存空间分成与页面相同大小的若干个存储块,称为(物理)块或页框(frame),页同样为它们加以编号。
在为进程分配内存时,以块为单位将进程中的若干个页分别装入到多个可以不相邻的物理块中。
由于进程的最后一页经常装不满一块而形成了不可利用的碎片,称之为“页内碎片”。
在分页系统中的页面其大小应适中。
页面若太小,一方面虽然可使内存碎片减小,从而减少了内存碎片的总空间,有利于提高内存利用率,但另一方面也会使每个进程占用较多的页面,从而导致进程的页表过长,占用大量内存;此外,还会降低页面换进换出的效率。
1.3分段存储管理的地址转换
一、任务要求
该程序要对每一个虚地址计算其代表的有效地址所对应的物理地址,并进行越界判断,要求打印每个虚地址的所在段段号、段内偏移、内存始址及相对应的物理地址。
二、基本思想
把程序按内容或过程(函数)关系分成段,每段有自己的名字。
一个用户作业或进程所包含的段对应于一个二维线性虚拟空间,也就是一个二维虚拟存储器。
段式管理程序以段为单位分配内存,然后通过地址映射机构把段式虚拟地址转换成实际的内存物理地址。
和页式管理一样,段式管理也采用只把那些经常访问的段驻留内存,而把那些将来一段时间内不被访问的段放入外存,待需要时自动调入的方法实现二维虚拟存储器。
在分段式存储管理中,作业的地址空间由若干个逻辑分段组成,每一分段式一组逻辑意义完整的信息集合,并有自己的名字(段名)。
每一段都是以0开始的连续的一维地址空间,整个作业则构成了二维地址空间。
分段式存储管理以段为基本单位分配内存,且每一段必须分配连续的内存空间,但各段之间不要求连续。
由于各段的长度不一样,所以分配的内存空间大小也不一样。
因此,所谓分段式管理,就是管理由若干段组成的作业,并且按段来进行存储分配。
由于分段式管理的作业地址空间是二维的,所以分段式存储管理的关键在于如何把分段地址结构变成一维的地址结构。
与分页存储管理一样,分段式存储管理采用动态重定位技术来进行地址转换[4]。
三、段的共享与保护
1段的共享
在多道环境下,常常有许多子程序和应用程序是被多个用户所使用的。
如果每个用户进程或作业都在内存保留它们共享程序和数据的副本,那就会极大地浪费内存空间。
最好的办法是内存中只保留一个副本,供多个用户使用,称为共享。
一段程序为多个进程共享时
(1)要求在执行过程中,该段程序的指令和数据不能被修改。
(2)在段表中设立相应的共享位来判别该段是否正被某个进程调用。
显然一个正在被某个进程使用或即将被某个进程使用的共享段是不应该调出内存的。
2段的保护
与页式管理时相同,段式管理的保护主要有两种:
地址越界保护法和存取方式控制保护法。
图1.1段的共享
1.4段页式存储管理的地址转换
一、任务要求
该程序要实现段页式存储管理中逻辑地址到物理地址的转换,打印出访问序号、虚地址、段号、段内页号、页内偏移、内存块号、物理地址和越界判断信息。
并且能够检查地址的合法性,如果合法则进行转换,否则显示地址非法的原因。
二、基本思想
各个进程的虚拟空间被划分成若干个长度相等的页。
页长的划分和内存与外存之间的数据传输速度及内存大小等有关。
一般每个页长大约为1~4K,经过页划分之后,进程的虚拟地址变为页号p与页内地址w所组成。
除了将进程的虚拟空间划分为大小相等的页之外,页式管理还把内存空间也按页的大小划分为片或者页面。
这些页面为系统中的任一进程所共享。
从而与分区管理不一样,分页管理时,用户进程在内存空间内除了在每个页面内地址连续之外,每个页面之间不再连续。
第一是实现了内存中碎片的减少,因为任意碎片都会小于一个页面。
第二是实现了由连续存储到非连续存储的这个飞跃,为在内存中局部地、动态地存储那些反复执行或即将执行的程序和数据段打下了基础。
怎样由页式虚拟地址转变为内存页面物理地址?
页式管理把页式虚拟地址与内存页面物理地址建立一一对应页表,并用相应的硬件地址变换机构,来解决离散地址变换问题。
段页式系统的基本原理,是基本分段存储管理方式和基本分页存储管理方式原理的结合,即先将用户程序分成若干个段,再把每个段分成若干个页,并为每一个段赋予一个段名。
图1.2示出了一个作业的地址空间和地址结构。
图1.2段页式的地址空间和地址结构
该作业有三个段,页面大小为4KB。
在段页式系统中,其地址结构由段号、段内页号及页内地址三部分所组成,如下图1.3所示。
图1.3段页式的地址结构组成
具体来说,把整个内存分成大小相等内存块,内存块从0开始依次编号。
把用户程序分成若干段,每段有个段名。
页面的大小和内存块相同,每段的各个页面都分别从0开始依次编号。
虚空间的最小单位是页而不是段,内存就被分为若干个页,且每段所拥有的程序和数据在内存中可以分开存放,分段大小也不再受内存可用区的限制。
段式和页式存储管理各有优缺点,段页式存储管理系统,用分段的方法来分配和管理虚拟存储器,而用分页的方法来分配和管理主存。
既有段式系统便于实现段的共享,段的保护,动态链接和段的动态增长等一系列优点,又能像页式系统那样,很好地解决内存的外碎片问题[3]。
设计时需要结合分段和分页的各自特点,扬长避短充分发挥各自优势。
下表列出的是简单分页、简单分段、虚拟内存分页和虚拟内存分段各自的特点。
表1.1分页和分段的特点
简单分页
简单分段
虚拟内存分页
虚拟内存分段
内存分为小的固定的区域,称为帧
内存不划分
内存分为小的固定的区域,称为帧
内存不划分
程序由编译器或内存管理系统分页
由程序员决定段的划分
程序由编译器或内存管理系统分页
由程序员决定段的划分
帧内有碎片
无内部碎片
帧内有内部碎片
无内部碎片
无外部碎片
有外部碎片
无外部碎片
有外部碎片
操作系统必须为每个进程建立一个页表,以显示页在内存的哪一帧
操作系统必须为每个进程建立一个段表,以显示每个段载入内存的地址和段长
操作系统必须为每个进程建立一个页表,以显示页在内存的哪一帧
操作系统必须为每个进程建立一个段表,以显示每个段载入内存的地址和段长
操作系统必须建立一个空帧表
操作系统必须建立一个内存的空闲块表
操作系统必须建立一个空帧表
操作系统必须建立一个内存的空闲块表
处理机用页号和页位移量来计算绝对地址
处理机用段号和段位移量来计算绝对地址
处理机用页号和页位移量来计算绝对地址
处理机用段号和段位移量来计算绝对地址
进程运行时,该进程所有的页都必须调入内存
进程运行时,该进程所有的段都必须调入内存
进程运行时,并不需要将其所有的页调入内存,页在其需要时才读入内存
进程运行时,并不需要将其所有的段调入内存,段在其需要时才读入内存
对段页式的评价:
段页式基本上结合了段式和页式的优点,而克服了二者的缺点。
段页式的内存利用率比段式高,比页式低。
由于以页面为单位划分内存,段页式消除了段式的外部存储碎片,但和页式一样存在内部碎片,其内部碎片比页式要多页式式平均每个程序有一页有碎片,段页式则是平均每段有一页有碎片。
段页式的共享实现和保护实现与段式一样好,比页式好。
只要欲共享作业的段表中有相应的表目指向该共享段在内存中的页表地址即可。
段页式的动态扩充实现得比段式和页式都要好,提供了动态链接的便利。
但是段页式的表空间支出、地址映射时间等管理代价比段式与页式都高。
需要的内存和硬件也有所增加,如果不采用快速辅助寄存器的方式提高CPU访问速度,将使运行速度大大下降。
段页式管理对大中型机来说是使用的最广泛、最灵活的一种存储管理技术[9]。
三、静态页面管理
静态页面管理方法是在作业或进程开始执行之前,把该作业或进程的程序段和数据全部装入内存的各个页面,并通过页表和硬件地址变换机构实现虚拟地址到内存物理地址的地址映射。
1内存页面的分配与回收
静态分页管理的第一步是为要求内存的作业或进程分配足够的页面。
系统依靠存储页面表、请求页面表以及页表来完成内存的分配。
(1)页表
最简单的页表由页号与页面号组成,页表在内存中占有一块固定的存储区。
页表的大小有进程或作业的长度决定。
每个进程至少要拥有一个页表。
(2)请求表
用来确定作业或进程的虚拟空间的各页在内存中的实际对应位置。
系统必须知道每个作业或进程的页表起始地址和长度,以进行内存的分配和地址变换,另外请求表中还应包括每个作业或进程所要求的页面数。
(3)存储页面
存储页面表也是整个系统一张,存储页面表指出内存各个页面是否已被分配出去,以及未被分配页面总数。
存储页面表也有两种构成方法,一种是在内存中划分一块固定区域,每个单元的每个比特代表一个页面,如果该页面已被分配,则对应比特位置置1,否则置0。
另一种方法空闲页面链,不占内存空间。
2地址变换
在程序执行过程中,执行的是虚拟空间中的代码,代码中的指令是相对于虚拟空间的,需要到内存的实际空间中寻找对应的要执行的指令。
静态页式管理的缺陷:
虽然解决了分区管理时的碎片问题,但是由于静态页式管理要求进程或作业在执行前全部装入内存,如果可用页面数小于用户要求时,改作业或进程只好等待。
而且,作业或进程的大小仍受内存可用空间的限制。
四、动态页式管理
动态页式管理是在静态页式管理的基础上发展起来的,它分为请求页式管理和预调入页式管理。
请求页式管理和预调入页式管理在作业或进程开始执行之前都不把作业或进程的程序段和数据段一次性的调入内存,而是只装入被认为是经常反复执行和调用的工作区部分。
其他部分都在执行过程中动态的装入。
请求式页式管理:
当需要执行某条指令或某些数据时而又发现他不在内存中时,从而发生缺页中断,系统将相应的页面调入内存。
预调入:
系统对于那些在外存中的页进行调入顺序计算,估计出这些页中指令和数据的执行和被访问的顺序,并按此顺序将他们顺次调入和调出内存。
请求页式管理的地址变换与静态页式相同,也是通过页表查出相应的页面号,由页面号与页内相对地址相加而得到实际物理地址。
由于只有进程或程序的部分存在内存中因此怎样发现这些不在内存中的虚页以及怎样处理这种情况是必须解决的两个基本问题。
怎样发现这些不在内存中的虚页:
扩充页表的方法。
即与每个虚页号相对应,除了页面号之外,再增设该页是否在内存中的中断位以及该页在外存中的副本起始地址。
(1)采用何种方法将所缺的页调入内存。
(2)如果内存中没有空闲页面时,把调进来的页面放在什么地方。
即采用什么策略淘汰已占据内存的页。
还有就是如果内存中的也被淘汰,但该页被修改过,显然该页应当被重新写到外存加以保存。
所以还要增加一项记录是否该页已经被改变。
常见的置换算法:
(1)最佳置换算法(OPT):
所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。
(2)先进先出置换算法(FIFO):
优先淘汰最早进入的页面,亦即在内存中驻留时间最久的页面。
(3)最近最久未使用(LRU)算法:
选择最近最长时间未访问过的页面予以淘汰。
内存保护:
页式管理提供两种方式的内存保护:
一是:
地址越界保护。
二是:
通过页表控制对内存信息的存取操作方式以提供保护。
地址越界保护:
由地址变换机构中的控制存储器的值——页表长度和所要访问的虚地址相比较来完成。
存取控制保护的实现则是在页表中增加相应的保护位即可。
五、段式管理
分区式管理和页式管理时的进程的地址空间结构都是线性的,这要求对源程序进行编译连接时,把源程序中的主程序、子程序、数据区等按线性空间的一维地址顺序排列起来。
共享子程序和数据变得很困难,再者从链接的角度来看,分区管理和页式管理只能采用静态链接。
段式存储管理是基于为用户提供一个方便的灵活的程序设计环境而提出来的。
段式管理的基本思想是:
把程序按内容或过程(函数)关系分成段,每段都有自己的名字。
一个用户进程或作业所包含的段对应于一个二维线性虚拟空间,也就是二维虚拟存储器。
段式管理程序以段为单位分配内存,然后通过地址映射机构把段式虚拟地址转换成实际的内存物理地址。
和页式管理一样,段式管理也采用只把那些经常访问的段驻留内存,而把那些在将来一段时间内不被访问的段放在外存,待需要时自动调入的方法实现二
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 地址转换过程的模拟实现 课程设计报告汇总 地址 转换 过程 模拟 实现 课程设计 报告 汇总