Linux 内存管理系统

Linux 内存管理系统

ID:37201080

大小:162.00 KB

页数:38页

时间:2019-05-19

Linux 内存管理系统_第1页
Linux 内存管理系统_第2页
Linux 内存管理系统_第3页
Linux 内存管理系统_第4页
Linux 内存管理系统_第5页
资源描述:

《Linux 内存管理系统》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Linux内存管理系统:初始化 Linux内存管理系统:初始化作者:JoeKnapka臭翻:colyli内存管理系统的初始化处理流程分为三个基本阶段:激活页内存管理l在swapper_pg_dir中初始化内核的页表初始化一系列和内存管理相关的内核数据lTurningOnPagingl(i386)启动分页机制(i386)Kernel代码被加载到物理地址0x100000(1MB),在分页机制打开后被重新映射到PAGE_OFFSET+0x100000的位置(PAGE_OFFSET在IA32上为3GB,即进程虚拟地址中用户空间与内核空间的分界处)。这是通过将物理地址映射到编译进来的页表(在arc

2、h/i386/kernel/head.S中)的0-8MB以及PAGE_OFFSET-PAGE_OFFSET+8MB实现的。然后我们跳转到init/main.c中的start_kernel,这个函数被定位到PAGE_OFFSET+某一个地址。这看起来有些狡猾。要注意到在head.S中启动分页机制的代码是通过让它自己所执行的地址空间不再有效的方式来实现这一点的;因此0-4MB被映射(不明白:hencethe0-4MBidentitymapping.)。在分页机制没有启动之前,start_kernel是不会被调用的,我们假定他运行在PAGE_OFFSET+某一个地方的位置。因此head.S中的

3、页表必须同样映射内核代码所使用的地址,这样后继才能跳转到staert_kernel处;因此PAGE_OFFSET被映射(不明白:hencethePAGE_OFFSETmapping.)。下面在head.S中分页机制启动时的一些神奇的代码:/**Enablepaging*/3:movl$swapper_pg_dir-__PAGE_OFFSET,%eaxmovl%eax,%cr3/*setthepagetablepointer..*/movl%cr0,%eaxorl$0x80000000,%eaxmovl%eax,%cr0/*..andsetpaging(PG)bit*/jmp1f/*flu

4、shtheprefetch-queue*/1:movl$1f,%eaxjmp*%eax/*makesureeipisrelocated*/1:在两个1的label之间的代码将第二个label1的地址加载到EAX中,然后跳转到那里。这时,指令指针寄存器EIP指向1MB+某个数值的物理地址。而label都在内核的虚拟地址空间(PAGE_OFFSET+某个位置),所以这段代码将EIP有效的从物理地址空间重新定位到了虚拟地址空间。Start_kernel函数初始化了所有的内核数据,然后启动了init内核线程。Start_kernel中最初的几件事情之一就是调用setup_arch函数,这是一个和

5、具体的体系结构相关的设置函数,调用了更底层的初始化细节。对于x86平台而言,这些函数在arch/i386/kernel/setup.c中。在setup_arch中和内存相关的第一件事就是计算低端内存(low-memory)和高端内存(high-memory)的有效页的数目;每种内存类型(eachmemorytype)最高端的页的数目分别保存在全局变量highstart_pfn和highend_pfn中。高端内存并不是直接映射到内核的虚拟内存(VM)中;这是后面要讨论的。接下来,setup_arch调用init_bootmem函数以初始化启动时的内存分配器(boot-timememorya

6、llocator)。Bootmem内存分配器仅仅在系统boot的过程中使用,为永久的内核数据分配页。因此我们不会对它涉及太多。需要记住的就是bootmem分配器(bootmemallocator)在内核初始化时提供页,这些页为内核专门预留,就好像他们是从内核景象文件中载入的一样,他们在系统启动以后不参与任何的内存管理活动。初始化内核页表之后,setup_arch调用在arch/i386/mm/init.c中的paging_init函数。这个函数做了一些事情。首先它调用pagetable_init函数去映射整个的物理内存,或者在PAGE_OFFSET到4GB之间的尽可能多的物理内存,这是从

7、PAGE_OFFSET处开始。在pagetable_init函数中,我们在swapper_pg_dir中精确的建立了内核的页表,映射到截至PAGE_OFFSET的整个物理内存。这是一个将正确的数值填充到页目录和页表中去的简单的算术活。映射建立在swapper_pg_dir中,即kernel页目录;这也是初始化页机制时所使用的页目录。(当使用4MB的页表的时候,直到下一个4MB边界的虚拟地址才会被映射在这里,但这没有什么,因为我们不会

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。