背景技术
本文所用的术语“计算装置”将被广泛地理解为覆盖任何形式的电计算装置并且包括:数据记录装置、任意类型或形式的计算机(包括手持和个人计算机,例如个人数字助理(PDA))、任何形状因子的通信装置(包括:移动电话,智能电话,将通信、图像记录和/或重放、以及计算功能结合到单个装置中的通信器)、以及其他形式的无线和有线信息装置(包括数字照相机、MP3和其他音乐播放器、以及数字收音机)。
现代计算设备包括多种类型的存储器。这些类型的存储器中的一些(诸如传统的静态和动态RAM(随机存取存储器))是高速但易失性的存储器;仅当设备被上电时RAM的内容才被保留在那个存储器中。其它类型的存储器(诸如ROM(只读存储器)和闪存)速度明显低于RAM但却是非易失性的;这些类型的存储器的内容可以用于永久性存储,这是因为甚至在设备断电时内容也被保留。
广泛认可的是,作为生产过程的一部分,需要在一些类型的永久性非易失性存储器中为计算设备配备程序,这些程序是设备正常运行所必要的。这种程序可以是在设备被上电时运行的引导程序的一部分,或它们可以提供经常被请求的操作系统服务,或它们可以是重要的应用程序。因此它们需要被配备在非易失性存储器(诸如,ROM或闪存)中。
然而,也被广泛认可的是,这种非易失性存储器在操作中速度明显低于RAM,且这意味着执行非易失性存储器中的程序使设备不能以最佳速度操作。因为用户对他们的计算设备操作的速度期望值非常高,所以制造商已经开发了一种被称为“遮蔽(shadowing)”的技术,所述遮蔽设法减轻这一困难。遮蔽表示将可执行代码从一种类型的存储器拷贝到另一种类型的存储器,以便提高设备的性能。这最频繁地用在将系统软件从相对低速的XIP(就地执行)ROM拷贝到相对高速的RAM这一环境中。
在用于执行虚拟存储寻址的首批CPU变得广泛可用时,该方法首先在20世纪80年代中期的大量销售的计算设备市场中变得突出。这些CPU通常用于将通常使用的BIOS(基本输入输出系统)代码设置在ROM存储器中的设备中。用于将虚拟存储地址映射到不同的物理存储位置的这种CPU的能力意味着,已可以将相对低速的ROM BIOS的全部内容拷贝到更快速的RAM中,然后重新映射BIOS代码的虚拟地址以指向RAM中的副本。
本领域技术人员将知道的是,使用中的所有可寻址存储位置的总和被称为虚拟存储器,并且现代计算设备包含虚拟存储页到物理存储页的映射,保留于由存储器管理单元或MMU所维护的页表中。通过改变这些页表的内容,可以使一组虚拟存储地址指向可寻址物理存储器的任何期望区域。
尽管将ROM BIOS的内容拷贝到RAM中的过程花费一些时间,且该方法可论证地浪费了有用的存储器(因为可执行代码正被复制),但将可执行代码从相对低速存储器遮蔽到较高速存储器的这个过程的确改善了计算设备的整体性能,这是因为在设备的正常操作过程中BIOS代码已被如此频繁地执行:实质上,该设备已不再由于需要对每一个BIOS例程都访问ROM而被降速。
为提高性能而遮蔽可执行对象(executable)明确地是用于电池操作的移动计算设备(诸如,蜂窝式移动电话)的操作系统的特征。存在许多种方法来进行可用在这种设备中的遮蔽。这些方法中的两种在Micron技术的论文、标题为“Comparing XIP and CodeShadowing Architecture for 2.5G Cellular Phones”中被引用:
“可以用两种方式中的一种完成代码遮蔽:
·在引导时拷贝所有代码区域...代码空间的100%的开销被保留在RAM空间中以执行应用程序。
·按需拷贝(copy-on-demand)应用程序以用于执行...这几乎减少RAM空间的开销两倍(代码的50%需要被保留在RAM空间中),但也增加了动态下载的复杂性和等待时间。”(来自http://www.micron.com/publications/wireless3q034q03.html)
遮蔽的第一种类型的实例可以在MicrosoftTM的Windows CETM操作系统的某些实施中见到,其中:
“全部映像都被存储在闪存中...并在系统初始化过程中从闪存中拷贝到RAM中,然后从RAM中运行。”
(见http://www.intel.com/design/flcomp/applnots/29223701.pdf)
上述遮蔽的第二种变型可在Symbian OSTM操作系统(来自Symbian Software Limited的用于移动电话的高级操作系统)的某些实施中找到。该操作系统通过只把经常存取的可执行文件从相对低速的存储器拷贝到RAM(从中,文件以较高速度执行)来加速设备的操作。在设备引导时间而不是在设备操作过程中按需来执行该拷贝过程。
尽管上面描述的不同方法(遮蔽整个操作系统映像或者整个可执行文件)已知用于提高整体系统性能,但它们也广泛地被认为具有某些缺点:
·它们并不是有效率存储的。典型地,仅较小百分比的拷贝的代码被足够频繁地使用来保证遮蔽,但全部映像(对于WindowsCE)或可执行文件(对于Symbian OS)却都被拷贝,且这占用有价值的RAM。
·它们并不是省时的一这是从先前的缺点中得出的:拷贝未被足够频繁使用以保证遮蔽的代码可能降低该系统的速度。
在设备首先被接通时的引导进程中时间效率低是一个特别关注的问题。这里的优化对于移动的电池操作的设备(诸如,智能电话)被认为是尤为重要的,因为用户期望这些设备在上电时以最小的延迟变得充分运行。例如,在蜂窝式移动电话的情况下,在实际接通设备到能够打电话的长时段之间一般被认为使用户非常无奈,以及可能(例如在紧急情况下)引起用户高度关注。
然而,操作系统映像遮蔽和可执行文件遮蔽在这方面上都是次优选的,并为改善引导时间提供了清楚范围:
·作为引导进程的一部分的遮蔽整个操作系统映像是次优选的,因为并不是所有实际上被拷贝的代码都需要引导该设备。
·可执行文件遮蔽不仅浪费时间来遮蔽可执行文件的未使用部分,而且直到文件系统被初始化并准备使用时才能开始工作。因此,它可能仅用于引导进程的一部分。值得指出的是,以每个可执行对象为基础来遮蔽应用程序代码,这也可能降低应用程序启动速度。
因此,虽然遮蔽是被证实的用于提高把可执行代码存储在较低速类型的存储器中的计算设备的性能的方法,但是至今没有用于优化该特定功能的公开的方法。
具体实施方式
本发明基于代替遮蔽整个操作系统映像或者整个可执行文件,相反却按页来遮蔽可执行对象(executable)这一基础。这是特别有利的,因为按页遮蔽不仅去除了许多拷贝不足够频繁使用的代码以保证遮蔽的需要,而且优化了遮蔽的存储器使用和时间开销。此外,因为本发明并不以任何方式依赖编档系统(filing system),所以就可以在整个引导进程中使用它。
在本发明的一个实施例中,设想了能够按照可在系统启动时执行的频繁使用的代码的页进行RAM遮蔽的方法。在本实施例中的第一步骤是确定哪些代码区域需要优化。可用于实现这一点的方法可以包括:
a)人工选择:具有该系统的足够知识的本领域技术人员很可能知道哪些代码区域将会受益于布局优化。
b)自动选择:剖析器(profiler)可用于寻找低速存储器中最频繁被存取的代码区域。
理想地,专门的剖析器应该用于自动选择。这是因为存在传统剖析器仅会找到最经常被存取的那些代码区域的风险,且这不一定是待优化的代码。例如,其中,在程序的执行过程中仅从低速存储器中存取代码一次,然后该代码就在相对频繁的基础上重复运行,存取这个代码的后续努力将在CPU高速缓存器中找到它绝不是不可能的。因此,就不会有从低速存储器中进行后续存取的需要,这是因为它可以从CPU高速缓存器中运行。所以,遮蔽这样的代码将是次优选的。该过程在图1中示出。因此,使用的剖析器的类型应该仅考虑直接从低速存储器中进行的代码存取:本质上,这就等同于伴随有高速缓存缺失的存取的子集。
该第一步的输出,通过人工选择还是通过使用剖析器而自动执行是以函数或过程列表的形式(在下文中简称为函数)。对于每一个,除函数本身的名称外还确定可执行对象的名称或其所位于的库,如图2中所示。然后可以处理该原始函数列表以便根据对每个函数的存取的数量对其进行排序。
优选地,函数名称而不是实际地址用于该实施例中,这是因为只要为系统构造新的二进制映象,则因为围绕其的代码大小将会已经改变,给定函数的地址就相对可能改变。相反,对于函数名称,以及可执行对象的名称或其所处的库,它们被修改是很少见的。
如图2中所示,下一个步骤是,对于该系统的给定构造并把在上面第一步骤中得到的函数的有序列表作为输入,确定最通常被访问的函数所处的页。
设备中的每个函数的大小和存储页的大小都是已知的。因此函数列表可被安排在一系列可能的页中,并且这些可以按照从最频繁被访问到最不频繁被访问的顺序排列。
本领域技术人员将意识到的是,对于每个可能的页来说,在充分了解每个页中的代码和所述的计算设备的硬件规格说明(诸如用于读取和写入的可用存储器的各种类型(包括时钟频率、存取时间、等待状态和数据传送速度)、该设备上的任一CPU的规格说明(包括时钟频率和高速缓存器规格说明)的情况下,任何页现在都能够计算对快速存储器中页的所有存取的总时间和对低速存储器中页的所有存取所花费的总时间之间的差;这是确定性的数学操作。如果该时间差比用于将页从低速存储器拷贝到快速存储器中所花费的时间要大,则已知的是,遮蔽这样的页将会提高系统的性能。
如果该设备中的可用RAM稀缺,以及不可能遮蔽如上被确定来提供性能优势的所有那些页,则系统设计师将拥有所需的信息来为适当数量的被遮蔽的页设置数字,可能选择所分级的那些页以提供最大性能优势。记住,该优化将在该设备的设计过程中被实现,可选地决定增加系统中RAM的数量,如果性能优势能保证这一点话。
本领域技术人员应该意识到的是,用于嵌入式系统的可执行ROM映像的代表性构造过程包括为获得关于那个映像的符号信息所需的所有必要工具。这又提供了映像中的每个函数的地址。从正在使用的操作系统的存储器设置的这些地址和知识中,就可能获得页的地址。此外,对于本领域技术人员来说,无论何时建立新的映像,写入将自动确定地址的工具不是过度复杂的操作。以这种方式,确定将遮蔽哪些页的过程可完全自动化。
一旦将被遮蔽的页的详细资料(details),连同ROM本身的大小一起都是已知的,那么就可能在有足够大小的ROM映像中的代码的末端分配一些未使用的空间以保留将被遮蔽的页的地址阵列,如图3中所示。需要指出的是,几乎所有计算设备中的ROM都具有一些未使用的空间,因此对于ROM来说如此全满以至没有足够空间用于这种类型的小页阵列是很少见的。同样,如果在ROM映像中没有足够的空间用于保留该地址阵列,则若性能优势保证这一点的话也可以增加ROM映像的大小。
最后,所构建的ROM映像、其符号信息、和常见函数的列表被输入到实用程序中。由实用程序使用该符号信息和常见函数的列表来构造如上所述的将被遮蔽的页的阵列,且该信息被插入ROM映像的预分配区域中。写入这种程序对本领域技术人员来说并不认为是过度复杂的。在ROM中的预定位置处存储该阵列的大小和指向其起始地址的指针。有代表性地,这可以在由引导程序代码使用的数据区域中。这仅是几个字节代码的开销,因此并不引起任何性能问题。
在设备的使用中,只要该设备被上电,在ROM映像中存储的页的阵列就在引导进程的早期阶段被检查。当找到有效页地址时,引导进程就调用相关的遮蔽API以将这些页从ROM拷贝到RAM,然后就使存储器管理程序重新映射它们的虚拟地址。在图4中示出了该过程。一旦该过程已经完成,对相关代码的存取将总是发生在相对快速的RAM而不是在相对低速的ROM中。因此,以优化的方式且没有上述的性能损失来为设备提供遮蔽效果。
每当建立新的ROM映像时,页中的映像大小和函数位置很可能改变。因此,确定最通常被访问的函数所位于的页的步骤(包括:页的大小和函数,分配足够大小的ROM映像中的代码的末端处一些未使用空间以保留将被遮蔽的页地址的阵列,以及将该地址阵列插入ROM映像的预分配区域)可被重复,以便生成可被再次最佳地遮蔽的修正映像。
然而,上述的第一步骤仅在计算设备的设计或体系结构中存在较大改变(该改变可能导致频繁受访问的函数的列表的改变)时才需要被重复。
根据本发明的第二实施例,可以修改上述方法,使得它可用于其操作系统一经要求就遮蔽可执行文件的计算设备,这一点在上面提及的Micron论文中公开。这种类型的遮蔽能够合理地独立使用或是除在与任何可执行对象和应用程序(后来才要求被加载)相关的引导过程期间所要求使用的代码遮蔽外也被使用。下面将参考图5描述后一种变型。
在本发明的该实施例中,基本上,上述进程的开始阶段被分成两个部分。剖析(profile)引导进程揭示了哪个代码需要被遮蔽以优化启动时的性能;剖析随后被加载的应用程序揭示了其代码的哪些部分需要被遮蔽。因此开始阶段的输出是用于优化该引导进程的函数和过程的第一列表与用于待被遮蔽的每个应用程序的函数和过程的第二列表的结合。这在图5中的步骤10至步骤14中示出。
本实施例的下一阶段继续如上所述的由第一实施例的第一步骤生成的列表。然而,在该第二实施例中,应用程序的列表在图5的步骤16中被过滤以保证它们在启动时不复制将被遮蔽的页的列表中的任何条目。
在该实施例中,有必要不仅为在启动时将被使用的页的地址阵列,而且为也将被遮蔽的每个应用程序的单独阵列分配ROM中的空间。这在图5的步骤18中示出。这些后面的阵列可通过应用程序名称而单独被识别:紧挨在用于优化启动的阵列之后存储具有起始地址和长度的索引是可用于该目的的许多可能方法中的一种。然而,根据其设计,用于构造将被遮蔽的页的阵列的实用程序可能需要被修改以应付生成ROM的多个表。
如第一实施例中那样,在设备被上电时,所生成的用于引导进程的页的阵列被检验并起作用。然而,在该实施例中,设备中的应用程序加载器也被修改,以便其对于每个应用程序都检查是否已经为其构造了页阵列。在相关期限(term)中,为实施该检查而花费的时间是可忽略的。如果发现阵列对任一应用程序都存在,且如果那个阵列包含有效的页地址,则载入器调用有关的遮蔽API以将这些页从ROM拷贝到RAM并使存储器管理程序重新映射其虚拟地址,如在图5中的步骤20所示。与在引导期间被遮蔽的那些页一样,这将保证对相关代码的存取将总是发生在RAM而不是ROM中;再一次,该系统被提供了遮蔽效益,而没有现有技术的性能损失。
本发明的该实施例的可能优化是部分遮蔽的应用程序的终止伴随着当该应用程序被加载时所映射的存储页的释放,如在图5中的步骤22所示。
本发明的所有方面的进一步优化也都是可能的。例如,那些函数和过程(其保证通过参考从较低速存储器中最频繁被存取的那些函数和程序的列表上的排序而被遮蔽)的严格确定可能被放宽以考虑应用于存储页的最佳适配限制,使得太大而不适合页中的剩余空间的函数被忽略(pass over)以支持将会适合的那些函数。
参考图6,特别关注的一种优化是安排代码的布局,使得最频繁地从低速存储器中载入的、并因此从被遮蔽中得到最多利益的那些区域位于相同的页中。需要特别指出的是,该优化并不与已知的代码优化相同,已知的代码优化是基于局部性(locality)的现象,过去三十年都在研究它。局部性可以被定义为“在程序执行期间存储器引用(memory reference)倾向于被聚集在小的存储区域中的现象”(来自在第25届年度关于微型体系结构内容表的国际研讨会的会议录中由Youfeng Wu提出的“Ordering functions for improvingmemory reference locality in a shared memory multiprocessorsystem”,1992)。
上面由Youfeng Wu提供的论文公开了建立编译器的方法,其增加了程序中的局部性的数量。已知的是,随着伴随的性能方面的实质改善,增加的局部性可以导致高速缓存缺失和页错误的降低。
然而,优化函数布局使得被顺序存取的那些函数在存储器中彼此邻近或邻接与优化函数布局使得从低速存储器中最频繁存取的那些函数彼此邻近是非常不同的操作类型。前者的优化取决于空间测量,而在严格对比之下,后者的优化则取决于时间测量。
这两种类型的优化可能彼此具有相互影响且这是为什么不同的专门剖析工具可能被认为适合于用于优化遮蔽的原因。然而,因为高速缓存通常比遮蔽提供更大的性能优势,对于更好的高速缓存性能的空间优化应当优先于用于更高效的遮蔽的时间优化。数学模拟或测试的迭代过程因此可能伴随优化的每个循环以保证性能增加而未疏忽地变得降级。
本领域技术人员将理解的是,为了使从低速存储器中最频繁被加载的那些区域位于相同页,布局代码不仅对实施代码遮蔽的系统有益,而且无疑也对实施基于页的存储器管理的任何系统有益。
从该说明书中将注意到,对于借助于专业软件工程工具(诸如,剖析器、ROM分析器和性能模拟器)制造结合本发明的计算设备来说可以认为是有利的。也需要理解的是,在这种情况下,计算设备和用于生产该设备的任意这种工程工具都被认为落入本发明的范围内。
本发明提供超越遮蔽的已知方法的多个优点,包括:
·用于遮蔽基于XIP ROM的系统中的所有类型的可执行对象的存储高效方法。利用Symbian OSTM操作系统的实际实验已经显示,按页遮蔽而不是按文件遮蔽降低了大约10的因数的RAM需求,而在设备的性能方面并没有明显降低
·当与基于文件的调页方法相比较时,优化并不要求存在文件系统并因此可以在引导进程中更早地被启动,从而导致更快速的设备引导时间
·基于页的遮蔽比基于文件的遮蔽更快,这是因为它并不需要调用任何文件系统代码
·当与基于操作系统映像的调页方法相比较时,不需要拷贝并不保证遮蔽的页;因此,RAM开销较小且速度也更快
·把从低速存储器中频繁被存取的代码群集到页的共同组中也可以使得执行基于页的存储器管理程序的任何系统受益。
尽管已经参考特定实施例描述了本发明,但应该理解,在由所附权利要求限定的本发明的范围内可以实施各种修改。