- 1、本文档共38页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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-4MBidentity 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,%eaxmovl %eax,%cr3 /* set the page table pointer.. */movl %cr0,%eaxorl $0%eaxmovl %eax,%cr0 /* ..and set paging (PG) bit */jmp 1f /* flush the prefetch-queue */1:movl $1f,%eaxjmp *%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-timememory allocator)。Bootmem内存分配器仅仅在系统boot的过程中使用,为永久的内核数据分配页。因此我们不会对它涉及太多。需要记住的就是bootmem 分配器(bootmemallocator)在内核初始化时提供页,这些页为内核专门预留,就好像他们是从内核景象文件中载入的一样,他们在系统启动以后不参与任何的内存管理活动。初始化内核页表之后,setup_arch调用在arch/i386/mm/init.c中的paging_init函数。这个函数做了一些事情。首先它调用pagetable_init函数去映射整个的物理内存,或者在PAGE_OFFSET到4GB之间的尽可能多的物理内存,这是从PAGE_OFFSET处开始。在pagetable_init函数中,我们在swapper_pg_dir中精确的建立了内核的页表,映射到截至PAGE_OFFSET的整个物理内
您可能关注的文档
最近下载
- 2023年11月四川省德昌生态环境监测站招考4名就业见习人员笔试历年高频考题(难、易错点荟萃)答案带详解附后.docx
- C103116【基础】2025年东北师范大学045101教育管理《841学校组织与管理之教育管理学》.pdf VIP
- ABB 传动变频器 ACS880-04(200-600 kW)传动模块硬件手册 安装及使用手册.pdf
- (入党积极分子)思想汇报.doc VIP
- 入党积极分子(发展对象)培训班学习心得体会.docx VIP
- 物业二次装修管理培训课件.pptx
- 祭母舅的祭文.docx
- 国家开放大学电大本科《社会保障学》2024期末试题及答案(试卷号:1283).doc VIP
- 公路工程标准施工招标文件 2018年版(完整版).doc
- 国家开放大学电大本科《社会学概论》期末试题及答案(试卷号:1282).doc
文档评论(0)