Linux 内存管理系统.doc

  1. 1、本文档共38页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux 内存管理系统

Linux 内存管理系统:初始化 ? Linux 内存管理系统:初始化 作者:Joe Knapka 臭翻:colyli 内存管理系统的初始化处理流程分为三个基本阶段: 激活页内存管理 ( 在swapper_pg_dir中初始化内核的页表 初始化一系列和内存管理相关的内核数据( Turning On Paging( (i386) 启动分页机制(i386) Kernel 代码被加载到物理地址0x100000(1MB),在分页机制打开后被重新映射到 PAGE_OFFSET + 0x100000的位置(PAGE_OFFSET在IA32上为3GB,即进程虚拟地址中用户 空间与内核空间的分界处)。这是通过将物理地址映射到编译进来的页表 (在 arch/i386/kernel/head.S中)的0-8MB以及PAGE_OFFSET-PAGE_OFFSET+8MB实现的。然后 我们跳转到init/main.c中的start_kernel,这个函数被定位到PAGE_OFFSET+某一个地址。 这看起来有些狡猾。要注意到在head.S中启动分页机制的代码是通过让它自己所执行的地 址空间不再有效的方式来实现这一点的;因此0-4MB被映射(不明白:hence the 0-4MB identity mapping.)。在分页机制没有启动之前,start_kernel是不会被调用的,我们假 定他运行在PAGE_OFFSET+某一个地方的位置。因此head.S中的页表必须同样映射内核代码 所使用的地址,这样后继才能跳转到staert_kernel处;因此PAGE_OFFSET被映射(不明 白:hence the PAGE_OFFSET mapping.)。 下面在head.S中分页机制启动时的一些神奇的代码: /* * Enable paging */ 3: movl $swapper_pg_dir-__PAGE_OFFSET,%eax movl %eax,%cr3 /* set the page table pointer.. */ movl %cr0,%eax orl $0%eax movl %eax,%cr0 /* ..and set paging (PG) bit */ jmp 1f /* flush the prefetch-queue */ 1: movl $1f,%eax jmp *%eax /* make sure eip is relocated */ 1: 在两个1的label之间的代码将第二个label 1的地址加载到EAX中,然后跳转到那里。这 时,指令指针寄存器EIP指向1MB+某个数值的物理地址。而label都在内核的虚拟地址空 间(PAGE_OFFSET+某个位置),所以这段代码将EIP有效的从物理地址空间重新定位到了虚 拟地址空间。 Start_kernel函数初始化了所有的内核数据,然后启动了init内核线程。Start_kernel中 最初的几件事情之一就是调用setup_arch函数,这是一个和具体的体系结构相关的设置函 数, 调用了更底层的初始化细节。对于x86 平台而言, 这些函数在 arch/i386/kernel/setup.c中。 在setup_arch 中和内存相关的第一件事就是计算低端内存(low-memory) 和高端内存 (high-memory)的有效页的数目;每种内存类型(each memory type)最高端的页的数目分别 保存在全局变量highstart_pfn和highend_pfn中。高端内存并不是直接映射到内核的虚拟 内存(VM)中;这是后面要讨论的。 接下来,setup_arch 调用init_bootmem 函数以初始化启动时的内存分配器(boot-time memory allocator)。Bootmem内存分配器仅仅在系统boot的过程中使用,为永久的内核数 据分配页。因此我们不会对它涉及太多。需要记住的就是bootmem 分配器(bootmem allocator)在内核初始化时提供页,这些页为内核专门预留,就好像他们是从内核景象文 件中载入的一样,他们在系统启动以后不参与任何的内存管理活动。 初始化内核页表 之后,setup_arch调用在arch/i386/mm/init.c中的paging_init函数。这个函数做了一些 事情。首先它调用pagetable_init函数去映射整个的物理内存,或者在PAGE_OFFSET到4GB 之间的尽可能多的物理内存,这是从PAGE_OFFSET处开始。 在pagetable_init函数中,我们在swapper_pg_dir中精确的建立了内核的页表,映射到 截至PAGE_OFFSET的整个物理内

文档评论(0)

f8r9t5c + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档