CN101604283B - 一种基于Linux内核页表替换的内存访问模型追踪方法 - Google Patents
一种基于Linux内核页表替换的内存访问模型追踪方法 Download PDFInfo
- Publication number
- CN101604283B CN101604283B CN2009100869393A CN200910086939A CN101604283B CN 101604283 B CN101604283 B CN 101604283B CN 2009100869393 A CN2009100869393 A CN 2009100869393A CN 200910086939 A CN200910086939 A CN 200910086939A CN 101604283 B CN101604283 B CN 101604283B
- Authority
- CN
- China
- Prior art keywords
- page table
- memory access
- system call
- linux kernel
- false
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Memory System Of A Hierarchy Structure (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明是一种基于Linux内核页表替换的内存访问模型追踪方法,随着处理器速度与内存访问速度的差距越来越大,内存系统成为系统性能的瓶颈,不同性质的应用程序具有不同类型的内存访问模型,对内存行为的优化方式也不一样,而现有工具都不能高效的追踪程序的内存访问,导致内存优化的复杂性。本发明应用在Linux系统上,通过修改Linux内核,替换目标进程的页表。新的页表对于非代码段页面只保存一项,这样目标进程每次访问内存时都会发生缺页中断,在内核处理缺页中断时,记录相应的地址,就可以追踪特定目标进程的虚拟页面访问顺序,即程序的内存访问模型。本发明具有轻量级的特点,追踪内存访问速度快、追踪出的数据量小,而且不影响操作系统中其它进程的正常运行。使用本发明追踪出内存访问模型,可以指导程序的内存行为优化。
Description
技术领域
本发明涉及操作系统和程序分析领域。
背景技术
现在,处理器速度与内存访问速度的差距越来越大,已经达到了几个数量级,根据最慢的部分决定系统的性能的原则,内存系统成为性能的瓶颈,因此亟需优化程序的内存行为。不同性质的应用程序具有不同类型的内存访问模型,优化的方式也不一样。因此如果我们能确定程序的内存访问模型,就能对症下药,进行预取优化。
程序内存访问模型就是程序内存行为的描述,现在已有文献上并没有明确的定义,而且现有工具都不能高效的追踪程序的内存访问,导致了程序性能分析的复杂性。国外对于内存访问模型已经进行了初步的研究,Junghee等人的研究发现,如果事先知道程序的内存访问模型,就可以做进一步的优化,提高程序的性能。Mary等人使用MPAT工具(a memory pattern analysis tool)分析了三种不同的内存访问模型,以评估内存系统的设计。他根据MPAT收集到的资料,用来分析软件、硬件在哪些方面需要改进以提高内存系统的性能。其在论文中用高速缓存命中率随时间的变化这种形式来描述内存访问模型。而且其未考虑多处理器、多核系统上,多线程程序的内存访问模型。Jonathan等人则利用Chameleon框架软件包里的工具捕获应用程序里的简明内存签名(memorysignature),并产生人工内存地址痕迹来模拟这个签名。Chameleon同时模拟空间和时间局部性,能提供精确的人工痕迹。在现有的各种不同内存层次上,这个痕迹的cache命中率和原来程序基本一样。他将Chameleon应用在高性能(HPC)程序上,通过使用抽样技术来捕获到全面的、并行程序的内存签名,而且仅仅产生5倍的减速。国外也实现了一些内存访问地址追踪工具,如valgrind等,它们的实现并不需要更改Linux内核,而且追踪的是内存访问地址,而不是页面,这样对于高性能计算程序,获得的统计数据量会出现存储空间爆炸的情况。
本发明中的内存访问模型是指程序的虚拟内存页面访问顺序,以及每个页面访问的持续时间(这样就能估算出每个页面的访问次数)。获取了程序的内存访问模型后就能指导对程序的内存行为进行优化。
发明内容
本发明要解决的技术问题是:克服现有技术不足,提出一种基于Linux内核进程页表替换的内存访问模型追踪方法,该轻量级的追踪方法以页面地址为追踪粒度,具有速度快,产生的追踪数据量小的特点,适合于高性能计算程序的内存追踪需求。
本发明采用的技术方案:基于Linux内核进程页表替换的内存访问模型追踪方法,其特征在于包括以下步骤:
(1)引导程序创建出一个子进程来执行要统计内存访问模型的目标程序,在目标程序执行之前,父进程通过向Linux内核添加的系统调用a来启动统计过程,并将要统计的目标进程号(_mt_pid_)传递进内核;
(2)另外申请一个页表,称之为假页表,假页表中对于非代码段的页面只保留一项,这样对非代码段的每次内存访问都会产生缺页中断,除非一直访问某个地址;在切换到目标进程的时候将假页表的地址传递给cr3寄存器,使操作系统与假页表建立联系;
(3)目标进程开始执行,由于使用了假页表,目标程序的每次访问内存都会触发缺页中断,在处理缺页中断时,记录访问的内存页号和访问次数,即内存访问模型;通过向Linux内核添加的系统调用c将内存访问模型数据取出到用户态;
(4)目标进程执行完后,通过向Linux内核添加的调用系统调用b结束统计过程。
在所述步骤(1)中系统调用a为向Linux内核中添加的新系统调用,用来启动统计过程和变量初始化工作;系统调用a首先判断我们要统计的目标进程号(_mt_pid_)是否已经设置,如果已经设置,说明另一个内存访问模型的统计正在进行,则启动失败;如果未设置,则设置目标进程号(_mt_pid_)为引导程序传递给系统调用a的进程号;然后系统调用a初始化内存访问模型追踪所需要的变量并创建一个假页表,将页表地址(_mt_pgd_)设置为假页表的地址,同时备份真页表的地址。
在所述步骤(2)中假页表与真页表的协作方式为:在假页表每次触发缺页中断后,首先通过真页表判断是否真正缺页:若不缺页,则将真页表中保存的物理页信息复制到假页表中;若缺页,则将要访问的页面加载入物理内存中,同时将真页表中对应项的值复制到假页表中;最后将离开的页面在假页表中的表项值清零;这样,假页表中只有当前进程所处理的页面有对应的物理页信息。
在所述步骤(3)中系统调用c为向Linux内核中添加的新系统调用,引导程序通过不断调用系统调用c将追踪到的内存访问模型数据取出到用户态。
在所述步骤(4)中系统调用b为向Linux内核中添加的新系统调用,系统调用b负责终止统计过程;其主要有2个工作,一是将我们要统计的目标进程号(_mt_pid_)归0,二是释放已经没用的假页表。
本发明与现有技术相比的有益效果:
(1)本发明以页面为追踪粒度,具有追踪速度快的特点,可以追踪高性能计算等长时间运行的程序,为程序优化提供指导。
(2)本发明由于采用页面为粒度,还具有追踪出的数据量小的特点。
附图说明
图1为本发明向Linux内核添加的系统调用a的工作流程图;
图2为本发明的引导程序的工作流程图;
图3为本发明的Linux内核缺页中断函数调用关系图;
图4为本发明的Linux内核缺页中断函数代码示例;
图5为本发明的真、假页表交互逻辑图;
图6为本发明的缺页中断处理工作流程图。
具体实施方式:
本发明采用如下步骤:
(1)主要变量设置
//目标进程的pid,为0表示没有启动
pid_t _mt_pid_;
//是否已将假页表的首地址传给cr3寄存器
bool _mt_tran_cr3_;
//假页表的首地址
pgd_t* _mt_pgd_;
//用来备份真页表的首地址
pgd_t* _mt_gd_pgd_;
//上次触发缺页中断的地址
unsigned long_l_mt_add_;
(2)添加系统调用
本发明向Linux内核中添加了3个新系统调用,系统调用a用来启动统计过程,系统调用b用来结束统计过程,系统调用c用来将追踪到的内存访问模型取出到用户态。这样就可以在需要的时候对特定的目标进程启动统计过程,在不需要的时候结束统计过程,最大限度的减少对原来系统运行的影响。
其中系统调用a负责启动统计过程,如图1所示。它首先判断我们要统计的目标进程号(_mt_pid_)是否已经设置。如果已经设置,说明另一个内存访问模型的统计正在进行,则启动失败;如果未设置,则设置_mt_pid_为引导程序传递给系统调用a的进程号。然后系统调用a初始化内存访问模型追踪所需要的变量并创建一个假页表,将页表地址(_mt_pgd_)设置为假页表的地址,同时备份真页表的地址(_mt_gd_pgd_)。若假页表创建失败,则无效返回。
系统调用b负责终止统计过程。其主要有2个工作,一是将我们要统计的进程号(_mt_pid_)归0,二是释放已经没用的假页表。
系统调用c被引导程序调用,将从内核获取的内存访问模型数据不断传送到用户态。得到的内存访问模型,包括内存访问的地址和访问持续时间,可以用来指导预取、I/O等优化。
(3)引导程序
其过程如图2所示,引导程序创建出一个子进程来执行要统计内存访问模型的目标程序,在目标程序执行之前,父进程通过系统调用a来启动统计过程,并将要统计的目标进程号(_mt_pid_)传递进内核。
(4)将操作系统与假页表建立关联,使之依靠假页表进行地址转换:
每个进程都有自己的页表,在进程切换时会设置cr3寄存器的值告知MMU新进程的页表首地址。因此在进程切换时,将假页表的首地址传给cr3即可将MMU与假页表建立联系。对Linux内核来说,就是在context_switch()函数调用switch_mm()函数之前进行判断,如果要切换的进程号是我们要统计的目标程序,则将使用假页表,否则就还用真页表。
(5)缺页中断处理流程:
这是本发明的重要部分,主要对Linux内核的handle_mm_fault()函数进行修改。其相关函数在Linux内核中的调用关系如图3所示,代码调用示例如图4所示。因为已经使用本发明自己的假页表,因此基本每次内存访问都产生缺页中断。只有在当前进程是目标进程且页表已经替换(_mt_tran_cr3_)的情况下,才进行处理。更改过的handle_mm_fault()函数每次处理缺页中断时,首先判断该缺页地址是否在真页表中缺页。如果真的缺页,则调用原有的缺页处理函数handle_pte_fault()来获取物理内存页面。之后判断页面是否为非代码段页面,如果是的话,也即我们要统计的内存访问行为。因此要记录其内存访问地址和系统时间进行统计,如果程序上次访问的地址_l_mt_add_为0,则这是第一次页面访问,只需设定_l_mt_add_的值为本次页面访问的值;如果_l_mt_add_不为0,则将此地址在假页表中的值清0,并设定_l_mt_add_为本次页面访问的值,最后将本次访问地址在真页表中的值复制到假页表中去。真、假页表的逻辑关系如图5所示,本发明具体的缺页中断处理流程如图6所示。
(6)目标进程开始执行后,每次内存访问都会触发缺页中断,缺页中断的页号和系统时间将被记录,引导程序通过调用系统调用c不断将内存访问模型数据取出到用户态,待目标程序执行完毕之后,我们的统计也获得了相应的内存访问数据。这时候,父进程通过调用系统调用b来结束统计过程。
Claims (5)
1.一种基于Linux内核进程页表替换的内存访问模型追踪方法,其特征在于包括以下步骤:
(1)引导程序创建出一个子进程来执行要统计内存访问模型的目标程序,在目标程序执行之前,父进程通过向Linux内核添加的系统调用a来启动统计过程,并将要统计的目标进程号传递进内核;
(2)另外申请一个页表,称之为假页表,假页表中对于非代码段的页面只保留一项,如果当前进程没有一直访问某个地址,则对非代码段的每次内存访问都会产生缺页中断;如果当前进程一直访问某个地址,则对非代码段的每次内存访问都不会产生缺页中断;在切换到目标进程的时候将假页表的地址传递给cr3寄存器,使操作系统与假页表建立联系;
(3)目标进程开始执行,由于使用了假页表,目标程序的每次访问内存都会触发缺页中断,在处理缺页中断时,记录访问的内存页号和访问次数,即内存访问模型;通过向Linux内核添加的系统调用c将内存访问模型数据取出到用户态;
(4)目标进程执行完后,通过向Linux内核添加的系统调用b结束统计过程。
2.根据权利要求1所述的一种基于Linux内核进程页表替换的内存访问模型追踪方法,其特征在于:在所述步骤(1)中系统调用a为向Linux内核中添加的新系统调用,用来启动统计过程和变量初始化工作;系统调用a首先判断要统计的目标进程号是否已经设置,如果已经设置,说明另一个内存访问模型的统计正在进行,则启动失败;如果未设置,则设置目标进程号为引导程序传递给系统调用a的进程号;然后系统调用a初始化内存访问模型追踪所需要的变量并创建所述的假页表,将页表地址设置为假页表的地址,同时备份真页表的地址。
3.根据权利要求1所述的一种基于Linux内核进程页表替换的内存访问模型追踪方法,其特征在于:在所述步骤(2)中的假页表与真页表的关系为:在假页表每次触发缺页中断后,首先通过真页表判断是否真正缺页:若不缺页,则将真页表中保存的物理页信息复制到假页表中;若缺页,则将要访问的页面加载入物理内存中,同时将真页表中对应项的值复制到假页表中;最后将离开的页面在假页表中的表项值清零;这样,假页表中只有当前进程所处理的页面有对应的物理页信息。
4.根据权利要求1所述的一种基于Linux内核进程页表替换的内存访问模型追踪方法,其特征在于:在所述步骤(3)中系统调用c为向Linux内核中添加的新系统调用,引导程序通过不断调用系统调用c将追踪到的内存访问模型数据取出到用户态。
5.根据权利要求1所述的一种基于Linux内核进程页表替换的内存访问模型追踪方法,其特征在于:在所述步骤(4)中系统调用b为向Linux内核中添加的新系统调用,系统调用b负责终止统计过程;其主要有2个工作,一是将要统计的目标进程号归0,二是释放已经没用的假页表。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2009100869393A CN101604283B (zh) | 2009-06-11 | 2009-06-11 | 一种基于Linux内核页表替换的内存访问模型追踪方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2009100869393A CN101604283B (zh) | 2009-06-11 | 2009-06-11 | 一种基于Linux内核页表替换的内存访问模型追踪方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101604283A CN101604283A (zh) | 2009-12-16 |
CN101604283B true CN101604283B (zh) | 2011-01-05 |
Family
ID=41470021
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2009100869393A Expired - Fee Related CN101604283B (zh) | 2009-06-11 | 2009-06-11 | 一种基于Linux内核页表替换的内存访问模型追踪方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101604283B (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102810078A (zh) * | 2011-06-02 | 2012-12-05 | 兰州大学 | 一种分析Linux内核动态执行的方法 |
CN102308282A (zh) * | 2011-07-20 | 2012-01-04 | 华为技术有限公司 | 多处理器体系结构远端内存访问的模拟方法及模拟器 |
WO2012167533A1 (zh) | 2011-10-31 | 2012-12-13 | 华为技术有限公司 | 一种构建内存访问模型的方法及装置 |
CN102662713B (zh) | 2012-04-12 | 2014-04-16 | 腾讯科技(深圳)有限公司 | 提高应用程序运行速度的方法、装置及终端 |
CN103019877B (zh) * | 2012-12-31 | 2016-01-20 | 清华大学 | 基于内核的双重错误调试方法及系统 |
CN103914363B (zh) | 2012-12-31 | 2016-10-26 | 华为技术有限公司 | 一种内存监控方法及相关装置 |
CN107273750B (zh) * | 2017-05-31 | 2021-03-16 | 上海交通大学 | Android设备内核漏洞的修补系统及方法 |
CN111736851B (zh) * | 2020-08-20 | 2020-11-17 | 南京云信达科技有限公司 | 提高用于linux系统的软件的兼容性的方法及系统 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6651132B1 (en) * | 2000-07-17 | 2003-11-18 | Microsoft Corporation | System and method for emulating the operation of a translation look-aside buffer |
CN1808402A (zh) * | 2005-01-17 | 2006-07-26 | 华为技术有限公司 | 一种内存访问监控方法 |
US7313734B2 (en) * | 2002-01-14 | 2007-12-25 | International Business Machines Corporation | Method and system for instruction tracing with enhanced interrupt avoidance |
CN101110044A (zh) * | 2007-08-28 | 2008-01-23 | 中兴通讯股份有限公司 | 一种内存监控管理的方法及系统 |
-
2009
- 2009-06-11 CN CN2009100869393A patent/CN101604283B/zh not_active Expired - Fee Related
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6651132B1 (en) * | 2000-07-17 | 2003-11-18 | Microsoft Corporation | System and method for emulating the operation of a translation look-aside buffer |
US7313734B2 (en) * | 2002-01-14 | 2007-12-25 | International Business Machines Corporation | Method and system for instruction tracing with enhanced interrupt avoidance |
CN1808402A (zh) * | 2005-01-17 | 2006-07-26 | 华为技术有限公司 | 一种内存访问监控方法 |
CN101110044A (zh) * | 2007-08-28 | 2008-01-23 | 中兴通讯股份有限公司 | 一种内存监控管理的方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN101604283A (zh) | 2009-12-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101604283B (zh) | 一种基于Linux内核页表替换的内存访问模型追踪方法 | |
Mittal | A survey of recent prefetching techniques for processor caches | |
ES2948186T3 (es) | Trazado de programa para depuración de viajes de tiempo y análisis | |
US7634642B2 (en) | Mechanism to save and restore cache and translation trace for fast context switch | |
Merten et al. | A hardware-driven profiling scheme for identifying program hot spots to support runtime optimization | |
TWI470425B (zh) | 硬體及軟體系統用之將程式自動分解為多重平行緒之系統,裝置及方法 | |
Brown et al. | Fast thread migration via cache working set prediction | |
CN102184127B (zh) | 一种实现处理器预执行的方法及相应的装置 | |
CN102214137B (zh) | 调试方法和调试设备 | |
JP2021515312A (ja) | 上位層キャッシュ内のエントリに基づいて下位層キャッシュへの流入をログすることによるトレース記録 | |
CN110168507B (zh) | 可执行代码的推测重放 | |
US20140195771A1 (en) | Anticipatorily loading a page of memory | |
US20180217768A1 (en) | Efficient retrieval of memory values during trace replay | |
CN109964207A (zh) | 用于时间行程调试和分析的基于高速缓存的跟踪 | |
Zhang et al. | RnR: A software-assisted record-and-replay hardware prefetcher | |
US20120233410A1 (en) | Shared-Variable-Based (SVB) Synchronization Approach for Multi-Core Simulation | |
CN101963907A (zh) | 一种计算机程序热点的动态剖析机制 | |
Haque et al. | Susesim: a fast simulation strategy to find optimal l1 cache configuration for embedded systems | |
WO2020210048A1 (en) | Cross-thread memory indexing in time-travel debugging traces | |
KR101531455B1 (ko) | 하드웨어 및 소프트웨어 시스템이 자동으로 프로그램을 복수의 병렬 스레드들로 분해하는 시스템들, 장치들, 및 방법들 | |
Srinivasan et al. | A static filter for reducing prefetch traffic | |
CN117043754A (zh) | 执行追踪内的存储器地址压缩 | |
Lee et al. | VM-aware flush mechanism for mitigating inter-VM I/O interference | |
Wolf et al. | Data flow based cache prediction using local simulation | |
JPH06505820A (ja) | 複数のモジュールから結合されるプログラムの機械作成方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20110105 Termination date: 20180611 |