内存管理-Linux内核读书笔记(转自搜狐达人空间)

来源:互联网 发布:淘宝极速贷款 编辑:程序博客网 时间:2024/05/20 22:29

Linux内核的内存管理程序采用了分页管理方式,利用页目录和页表结构处理内核中其他部分代码对内存的申请和释放操作.内存的管理是以内存页面为单位进行的,一个内存页面是指地址连续的4KB内存. Linux 0.11内核的内存管理目录中共有三个文件,Makefile , memory.c , page.s. 其中page.s 仅包含内存页异常的中断处理过程,主要实现了对缺页和页写保护的处理. memory.c是内存页面管理的核心文件. 总体功能描述 Intel 80x86 CPU中,程序在寻址过程中使用的是由段和偏移值构成的地址(虚拟地址),该地址不能直接用来寻址物理内存地址,内存管理的主要功能就是将虚拟地址映射到物理内存中. 综上,虚拟地址通过段管理机制首先变换成一种中间地址形式---CPU 32位的线性地址,然后使用分页管理机制将此线性地址映射到物理地址. 内存分页管理机制 Intel 80x86系统中,内存分页管理是通过页目录表和内存页表所组成的二级表进行的. 页目录表中的每个表项(页目录项)(4B)用来寻址一个页表,每个页表项(4B)用来指定一页物理内存页.因此,当指定了一个页目录项和一个页表项,我们就可以确定所对应的某个物理内存页. 页目录表最多可寻址1024个页表,页表最多可寻址1024个物理内存页面.在80386中,一个页目录表共可以寻址1024x1024x4096B=4GB的内存空间. Linux0.11内核中,所有进程都使用一个页目录表,而每个进程都有自己的页表. 对于进程来说,在申请内存时使用的是线性地址.一个32位的线性地址被分成了3个部分,分别用来指定一个页目录项(页目录表中的偏移,31-22位),一个页表项(页表中的偏移,21-12位),物理内存页的偏移地址(最后12位). 对于进程0,其页表是在页目录表之后,共4页;对于应用程序进程,其页表所使用的内存是在进程创建时向内存管理程序申请的,因此是在主内存区中. 一个系统中可以同时存在多个页目录表,但在某个时刻只有一个页目录表可用.当前可用的页目录表是用CPU寄存器CR3来确定的. 页表的页表项的结构如下图: 页框地址(PAGE FRAME ADDRESS) 31-12位 可用(AVAIL) 00 D A 00 U/S R/W P 页框地址(PAGE FRAME ADDRESS)指定了一页内存的物理起始地址,因为内存页是以4KB为边界的,所以其低12位总是0,因此表项的低12位可作他用. 存在位(PRESENT-P)确定了一个页表项是否可以用于地址转换过程.P=1表示该项可用.当目录表项或二级表项的P=0时,则该表项是无效的,不能用于地址转换过程.当CPU试图使用一个页表项进行地址转换时,如果此时任意一级页表项的P=0,则处理器就会发出页异常信号.此时缺页中断异常处理程序就可以把所请求的页加入到物理内存中,并且导致异常的指令会被重新执行. 已访问(Accessed-A),已修改(Dirty-D),读/写位(Read/Write-R/W),用户/超级用户位(User/Supervisor-U/S).

原创粉丝点击