分配连续物理内存的原因

在分配内存时,系统会尽量给我们分配连续的物理内存,这样有什么好处呢?我知道的有如下2条:

1、DMA不使用页表机制,因此必须分配连续的物理内存。
2、使用连续物理内存可以提高系统整体性能。

上面第1条很容易理解,我主要说明下第2条:
    在分页机制打开的情况下,系统访问内存的典型流程为:  

1、根据提供的线性地址访问系统TLB,看是否能够命中(hit)。
2、若访问TLB命中(hit),则可以直接得到线性地址对应的物理地址,执行步骤4;否则执行步骤3。
3、访问TLB未命中,则系统会读取内存中的页目录、页表,通过页目录、页表来把线性地址转换为对应的物理地址,同时利用淘汰算法把页目录、也表信息写入TLB以便以后快速进行地址转换。
4、系统用这个物理地址到系统cache(L1、 L2)中查找物理页。
5、如果在系统cache中找到物理页则直接读取或写入该物理页,如果没有则从物理内存中读取或写入同时利用淘汰算法将物理内存放入系统cache。

注意:以上的步骤可能会有一些并行性。

如果系统分配连续的物理内存,则对应的线性地址一般也是连续的,这样在多数情况下,连续的线性地址可以通过相同的页目录项、页表来转换成物理地址,这就提高了访问TLB的命中率,同时,连续的物理地址也可以提高系统cache的命中率。

补充:
以上讨论的系统访问物理内存流程是一种典型情况,在真实系统中,系统可能先访问系统cache(L1、L2)再访问TLB,这主要决定于系统cache(L1、L2)使用的地址是物理地址还是线性(虚拟)地址。若cache采用的是线性地址,则系统先访问cache再访问TLB;若cache采用的物理地址,则系统先访问TLB再访问cache。

 

 

 

首先要明白一个概念:进程中使用的所有地址都是虚地址,在linux下这个虚地址就是所谓的线性地址。linux中进程可运行在用户态和内核态,(典型配置情况下)当进程运行在用户态时,它使用的线性地址只能位于0~3G范围内,当进程运行于内核态时,它使用的线性地址地址范围为3G~4G

为了把线性地址转化为物理地址,每个进程都有自己私有的页目录和页表。linux在建立进程页目录时,把用户地址空间的页目录项(0~767项)清空而将内核页目录表(swapper_pg_dir)的第768项到1023项拷贝到进程的页目录表的第768项到1023项中。由于内核在初始化时也只映射了物理内存的前896M,我们可以知道内核也目录表只能保证第768项开始的224项中有有效映射。从这里我们可以知道,所有的进程都共享了其内核线性地址空间

当一个进程在内核空间发生缺页故障的时候,这主要发生在访问内核空间动态映射区线性地址,在其处理程序中,就要通过0号进程的页目录(swapper_pg_dir)来同步本进程的内核页目录,实际上就是拷贝0号进程的内核页目录到本进程中(内核页表与进程0共享,故不需要复制)。如果进程0的该地址处的内核页目录也不存在,则出错,具体代码可以参考vmalloc的实现源码。

当进程运行于用户态时,若其需要申请内存空间,内核首先会在其用户线性空间中分配需要的线性地址空间,再通过伙伴分配系统分配物理内存并把分配的物理内存跟用户空间线性地址映射起来,最后再修改进程的页目录项及页表项写入这些映射关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值