linux中的内存管理.ppt.ppt
《linux中的内存管理.ppt.ppt》由会员分享,可在线阅读,更多相关《linux中的内存管理.ppt.ppt(39页珍藏版)》请在三一办公上搜索。
1、1,Linux中的内存管理,2,从机器加电启动开始,处理器就在不断的取指令、执行指令。内存分配和内存寻址是关系系统运行很重要的问题。要更深入理解系统底层的管理机制,难免要涉及内核实现机制的分析。本章将先分析内存管理,然后再通过具体实例进行编程体验。,3,关于内核源码学习,系统实现的具体细节最终落到源代码上。从理解运行机制出发,分析各种数据结构。在理论明了、有一定的程序基础后再阅读梳理代码,这是需要反复且花功夫的一件事。阅读工具帮助追踪复制调用,数据结构定义等windows环境下利用Source Insightlinux环境下利用lxr(linux cross reference)或glimps
2、e等阅读顺序一般按顺序阅读启动代码;然后进行专题阅读,如进程部分,内存管理部分等。在每个功能函数内部应该一步步来。OK,感兴趣的话,反复读。纵向:顺着程序的执行顺序逐步进行。横向:分模块进行划分不是绝对的,而是经常结合在一起进行Linux的启动:顺着linux的启动顺序读,大致流程如下(以X86平台为例):./arch/x86/boot/bootSect.S./arch/x86/boot/setup.S./arch/x86/kernel/head.S./init/main.c中的start_kernel()对于内存管理等部分,可以单独拿出来按模块进行阅读分析。参考书LINUX内核源代码情景分析
3、,4,主要内容,内存空间,内存寻址,内存分配和回收,5,内存寻址,6,简单的说系统运行就是两步:装入内存、执行;从装入内核、运行内核,到装入用户程序、运行用户程序。怎么从内存中执行第1条指令?系统初始化时装入OS内核程序:这意谓着要构建操作系统进程,最关键的还包括给内核分配空间并构建内核占用空间的页表记录内核在内存的哪里。(内存分配)初始化完成后,内核程序已放进内存。执行阶段,处理器只需按规定的机制查询内核的页表找到要执行的指令然后依次执行即可,当然难免遇到程序跳转,可利用栈进行相应的跳转和返回。(内存寻址),7,如何运行用户程序的第1条指令?由内核装入用户程序:同样要构建用户程序的进程,给用
4、户进程分配空间并构建页表记录下来进程在内存的哪里。(内存分配)用户程序装入后,执行阶段处理器也是按规定的机制查询用户进程的页表找到要执行的指令然后依次执行即可,难免遇到程序跳转,可利用栈进行相应的跳转和返回。(内存寻址),实际上内存分配和内存寻址方式是密切联系的,先假设用户程序的内存已经分配,看看指令寻址过程具体是怎样的,8,4、物理地址、虚拟地址及线性地址,几个地址名词,物理地址:将主板上的物理内存条所提供的内存空间定义为物理内存空间,其中每个内存单元的实际地址就是物理地址。虚拟地址:将应用程序员看到的内存空间定义为虚拟地址空间(或地址空间),其中的地址就叫虚拟地址(或虚地址),分段机制下,
5、一般用“段:偏移量”的形式来描述。线性地址:指一段连续的,范围为0到n的地址空间,一个线性地址就是线性地址空间的一个绝对地址。,9,linux是什么样的地址映射机制?,内存管理有两种,一种是段式管理,另一种是页式管理,而页式管理更为先进。从 80 年代中期开始,页式内存管理进入了各种操作系统(以 Unix 为主)的内核,一时成为操作系统的一个热点。硬件对系统寻址方式的制约:Intel平台:其 80286 开始实现保护模式的分段机制,但是很快就发现,光有段式内存管理而没有页式内存管理会使它的 X86 系列逐渐失去竞争力以及作为主流 CPU 产品的地位。于是,从 80386到后来的IA32中实现了
6、对页式内存管理的支持。但为了兼容旧的系统结构,它的页式存储管理只能建立在段式存储管理的基础上。其他平台:多数硬件不支持分段机制,而是线性地址分页机制linux设计地址映射机制要考虑:Intel IA32的分段机制是不可禁止的,linux适应IA32就必须支持分段机制;但若要方便移植到其他平台,还要方便去除分段机制;,10,何谓“支持硬件分段机制”:在要求分段的硬件下,地址处理必须的流程是通过段寄存器找到段处理的相关信息:段基址、段界限等。面对intel这种强硬需求,linux必须提供这些信息,并提供程序流程进行分段处理。但Linux没有妥协,它做了特殊的段机制设计:linux上的程序文件面向硬
7、件只描述代码段和数据段(各有内核态和用户态)共4个段,且段基址都为0,段界限为4GB。段机制前后地址实际上没有变化,然后进入分页机制 方便移植:段机制前后地址实际上没有变化意谓着在不要求分段的其他硬件平台上,上述的段处理程序就可以很容易的裁掉而不影响分页地址处理。,11,段a,段b,段b,思考:linux下使每个段基址为0,段界限为4GB。比较a、b段的第一条指令地址,若按段思维,段基址都是0,段内指令从偏移0开始,两个段指令地址不就相同了,即使有分页机制,也无法区别开他们映射的内存地址啊?,段a,段机制,12,例:i386体系结构的机器上,对c程序helloworld反汇编后观察指令地址逻辑
8、地址(虚拟地址)。linux下常用ELF格式可执行文件,ld总是从地址0 x8000000开始安排程序代码段。观察下图可以看到实际上linux下整个虚拟地址空间是线性的。,13,段a,段b,段b,思考:linux下使每个段基址为0,段界限为4GB。linux的段机制下a、b段的第一条指令地址偏移不是0,所以即使段基址都是0,地址也不会重叠;每个段界限最大到4G,内存不够用怎么办?虚拟内存的关键只装入部分不足时置换,具体由页机制处理。,段a,段机制,外存,14,总之,linux下针对intel硬件设计了段机制,但所有段基址都是0,长度不超过4G。这个段机制前后地址不发生变化。配合linux这种特
9、殊的段设计,最关键的是生成的虚拟地址,虽然看似段:偏移的二维形式,但实际上是一维平坦的地址空间。,在这样的设计下内存分配和内存寻址过程实际上有下面几步系统段表是为了应付硬件写好的固定内容,用户程序不需要管形成虚拟地址分配内存构造页表执行开始段页机制寻址,装入程序时完成,a.o,b.o,c.o,源代码,ELF可执行文件windows下是exe格式,逻辑地址 段:偏移,内存,内核-堆栈-数据段-代码段,物理地址,虚拟内存地址,线性地址实际上没有变化,只装入一部分,2)开始执行读程序代码段第1条虚拟地址,利用页表进行地址映射即可找到指令在物理内存的位置并执行。,页表,1)elf文件装入,各种信息生成
10、并记录:进程相关:pcb(task_struct)内存相关:通过读可执行程序中的内容形成虚拟地址相关信息(mm_struct):代码段“从*到*”,数据段“从*到*”等等形成虚拟内存空间。分配一定的内存,伴随着分配内存就要记录占用的内存信息,页表就构造出来了。,16,一个程序编译连接后形成的地址空间是一个虚拟地址空间,但mm_struct形成时才意谓着进程的虚拟地址空间描述完成。页表有填入的实际映射信息,才真正有物理空间,然后随着内存的请页与交换页表内容动态变化。所以4G的虚拟内存不一定非要4G的物理内存。内存寻址过程总结:取代码段的第1条指令,此时指令是虚拟地址;虚拟地址经过段机制处理后我们
11、称为线性地址,实际上地址没有任何变化;利用页表得到指令实际所在的物理内存地址;在内存就执行,不在就调入。,mm_struct:对整个虚存空间描述vm_area_struct:逻辑区域方面组织,从数据结构角度理解进程创建过程的内存处理(选看),四个地址、两个地址空间虚拟地址空间的好处对程序员屏蔽底层地址,更好的支持虚拟处理,19,内存空间,20,关于虚拟地址空间的理解,程序编译链接后,可执行文件里描述了进程指令和数据在哪里虚拟地址。程序装入时,这些信息被记录到mm_struct里以备给操作系统查看。可以说通过mm_struct进程的线性虚拟地址空间被描述出来。程序执行时,CPU要从mm_stru
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 中的 内存 管理 ppt

链接地址:https://www.31ppt.com/p-5437917.html