博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
虚拟地址_物理地址_逻辑地址_页表_内存映射
阅读量:6826 次
发布时间:2019-06-26

本文共 1622 字,大约阅读时间需要 5 分钟。

1. 虚拟地址和物理地址:

虚拟地址关系到进程的用户空间和内核空间,而物理地址则用来寻址实际可用的内存。

linux用页表来为物理地址分配虚拟地址。

进程的虚拟地址空间,都被内核划分为很多等长的部分,这样的部分成为页。物理内存也划分为同样大小的页。

2. 页表

页表是一种数据结构,用来将虚拟地址空间映射到物理地址空间。

实现两个地址空间关联最容易的方法是使用数组,对虚拟地址空间的每一页都分配一个数组项,同时该数组项指向与之关联的物理地址页。

因为虚拟地址空间的大部分区域没有使用,所以可以使用内存用量少的多级分页模型。

3. 多级分页模型:

为减少页表的大小并忽略不需要的区域,linux把虚拟地址划分为多个部分。

举个例子:

我们将虚拟地址划分为4个部分,这样就需要一个三级的页表。

a. 虚拟地址的第一个部分称为全局页目录(Page Global Directory, PGD) --- PGD 用于索引进程中的一个数组,每个进程有且只有一个PGD,PGD的数组项指向另一些数组的起始地址,这些数组称为中间页目录。

b. 虚拟地址的第二部分称为中间页目录(Page Middle Directory) --- 在通过PGD中的数组找到对应的PMD之后,PMD的数组项也是一个指针,指向下一级数组,即页表或页目录

c. 虚拟地址的第三部分称为PTE(Page Table Entry, 页表数组) ---PTE 用来索引页表,页表的数组项指向物理内存页。

虚拟内存页和物理内存页之间的映射就此完成,

d. 虚拟地址的最后一部分称为偏移量,它指定了页内部的一个字节位置,每个地址都指向地址空间的某个字节。

页表的特色在于,对虚拟地址空间中不需要的区域,不必创建中间页目录或页表,所以多级页表节省了大量内存。

多级页表的缺点就是每次访问内存时,必须逐级访问多个数组后,才能将虚拟地址转换为物理地址。linux使用下面两种方法来加速该过程:

4. 内存访问加速方法:

a. 使用了MMU(Memory Management Unit,内存管理单元)。

b. 地址转换中出现最频繁的那些地址,保存到 地址转换后备缓冲器(Translation Lookaside Buffer, TLB)的高速缓存中。这些地址无需访问页表即可从高速缓存中直接获得地址数据。

5. 内存映射:

将任意来源的数据传输到进程的虚拟地址空间中。

用户可以像普通内存一样访问作为映射目标的地址空间区域,但任何修改都会自动传输到数据源。

例如:文件的内容可以映射到内存中,只需读取相应的内存即可访问文件内容,或者向内存写入数据来修改文件的内容。内核会保证任何修改都会自动同步到文件中。

内核在实现设备驱动程序时直接使用了内存映射,外设的I/O可以映射到虚拟地址空间中,对相应内存区域的读写会由系统重定向到设备,从而大大简化了驱动程序的实现。

6. 逻辑地址到线性物理地址的映射:

逻辑地址指的是机器语言指令中,用来指定一个操作数或一条指令的地址。

一种是使用段地址+段内偏移量做逻辑地址。段的描述符保存在GDT(global descriptor table)或者LDT(local descriptor table)中。每个线程有不同的逻辑地址(不同的段地址),再映射到不同的线性物理地址

另一种是使用paging机制。每个线程有相同的逻辑地址,由paging机制将逻辑地址映射到线性物理地址。
Linux倾向于使用paging机制,因为不同机器架构的分段机制不同。
kernel不使用LDT,尽管有一个系统调用允许线程创建自己的LDT。在执行segment-oriented的windows应用时,这个调用是有用的,例如Wine。

转载于:https://www.cnblogs.com/hehehaha/archive/2013/01/28/6333002.html

你可能感兴趣的文章
IOC容器
查看>>
“利益相关者”课堂讨论电子版
查看>>
意见总结
查看>>
servlet增删改查
查看>>
php - 中文字符串分割
查看>>
图解HTTP
查看>>
HTML - form (转)
查看>>
浅析C#深拷贝与浅拷贝 (转)
查看>>
3226. [SDOI2008]校门外的区间【线段树】
查看>>
如何解决jersey框架中以json格式返回数组,当数组中元素一个时json格式不对
查看>>
HDU 4898 The Revenge of the Princess’ Knight ( 2014 Multi-University Training Contest 4 )
查看>>
Kafka参数调优实战,看这篇文章就够了!
查看>>
delphi 把一个表的内容转到另一个表暂存时出错的解决方法。
查看>>
JavaScript 操作cookie
查看>>
BeanUtils.copyProperties() 用法
查看>>
微信公众平台开发 - 基础篇
查看>>
WinForm更新文件
查看>>
setprecision **fixed
查看>>
JVM系列五:JVM监测&工具[整理中]
查看>>
局部自适应自动色阶/对比度算法在图像增强上的应用。
查看>>