文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>《基于linux的C编程与内核导读》连载(15)

《基于linux的C编程与内核导读》连载(15)

时间:2007-06-13  来源:gaowp

4.1.2 linux中的地址映射

1、linux的页表结构

Intel从80286开始实现其“保护模式”,也即段式内存管理。但是很快发现光有段式内存管理而没有页式管理是不够的。因此,在80386中实现了建立在段式内存管理基础上的页式内存管理。这时由段式内存映射而生成的地址不再是“物理地址”了,Intel就称之为“线性地址”。于是,段式存管先将逻辑地址映射成线性地址,然后再由页式存管将线性地址映射成为物理地址。

80386把线性地址空间划分为4K字节的页面,每个页面可以被映射至物理存储空间中任意一块4K的区间。在段式存管中,连续的逻辑地址经过映射后在线性空间还是连续的。但是在页式存管中,连续的线性地址经过映射后在物理空间中却不一定是连续的,其灵活性就体现在这个地方。

Linux假定系统中有三级页表。所访问的每级页表包含下一级页表的页帧号。图4-3显示了一个虚拟地址如何被分解成几个字段,每个字段包含一个特定页表的偏移。为了将一个虚拟地址转换成一个物理地址,处理器必须取出每一个字段的内容,把它变换成包含页表的物理页的偏移并读出下一级页表的页帧号。这个过程被重复三次,直到包含该虚拟地址的物理页的页帧号被找到。然后虚拟地址的最后一个字段、字节偏移,被用来查找页中的数据。

Linux运行的每一个平台都必须提供转换宏,使得内核可以遍历一个特定进程的页表。这样,内核不必知道页表项的格式以及它们如何组织。这是一种很成功的方法:Linux为Alpha处理器提供三级页表,而对Intel x86处理器,只提供两级页表,但使用相同的页表处理代码。

 

2、地址映射

当一个映像被执行时,该可执行映像的内容必须被放到进程的虚拟地址空间。对于可执行映像链接到的共享库也是如此。可执行文件并非真正地被读到物理内存,而只是链接到进程的虚拟内存。然后,随着运行的应用对程序部分的引用,该映像被从可执行映像读到内存。这种将一个映像链到一个进程的虚拟地址空间的技术也被称为内存映射(memery mapping)。

每个进程的虚拟内存都通过一个mm_struct数据结构表示。它包含当前正执行的映像(如bash)的信息以及一些指向vm_area_struct数据结构的指针。每个vm_area_struct数据结构描述虚拟内存区的开始和结束、进程对该内存的访问权以及对该内存的一组操作。这些操作是处理这个虚拟内存区时Linux必须使用的一组例程。例如,当进程试图访问此虚拟内存,却发现(通过页故障)该内存并没有真正地在物理内存中时,虚拟内存操作之一将进行正确的动作。这就是nopage操作。nopage操作在Linux请求调一个可执行映像的页进内存时使用。

当一个可执行映像被映射到进程虚拟地址空间时,一组vm_area_strnct数据结构将被产生。每个vm_area_strnct数据结构表示可执行映像的一部分;是可执行代码,或是初始化的数据(变量),以及未初始化数据等。Linux支持一些标准虚拟内存操作并且当vm_area_strnct数据结构被创建时,相应的虚拟内存操作集将和它们关联起来。

 

3、缺页中断

因为物理内存比虚拟内存小得多,操作系统必须小心以高效地利用物理内存。一种节约物理内存的方法是只装载被执行的程序当前正在使用的虚拟页。例如:一个数据库应用程序可能被运行来查询一个数据库。这种情况下,并非数据库的全部都需要被装入内存,而只是装入那些被检查的数据记录。如果数据库查询是一个搜索查询,那么把处理添加新记录的代码从数据库程序中装载进来是毫无意义的。这种只在被访问时把虚拟页装入内存的技巧叫请求调页。

当进程试图访问一个当前不在内存中的虚拟地址时,处理器将不能为被引用的虚拟页找到页表项,这时处理器通知操作系统发生了缺页故障。

如果故障的虚拟地址无效,这意味着,该进程试图访问一个不该访问的地址。或许应用程序出了些错误,比如写内存中的随机地址。这种情况下操作系统将终止它,保护系统中其他进程不受此恶意进程破坏。

如果故障的虚拟地址有效,但它所引用的页当前不在内存中,操作系统就必须从磁盘上的映像中把适当的页取到内存中,相对来说,磁盘访问需要很长时间,所以进程必须等待一会儿直到该页被取出。如果还有其他可以运行的进程,操作系统将选择其中一个来运行。被取出的页会被写到一个空闲的物理页帧,该虚拟页帧号的页表项也被加入到进程页表中,然后进程从出现内存故障的机器指令处重新开始。以上的过程即为缺页中断。

如果进程需要把一个虚拟页面调入物理内存而正好系统中没有空闲的物理页面,操作系统必须淘汰位于物理内存壮年共的某些页面为之腾出空间。Linux使用最近最少使用(LRU)置换算法来选择要淘汰的页面,具体页面交换机制我们将在后面详细讲解。

 

4、访问控制

页表项中也包含访问控制信息。因为处理器要使用页表项来把进程虚拟地址映射到物理地址,它可以方便地使用访问控制信息来检查并保证进程没有以其不应该采用的方式访问内存。

有许多原因导致限制访问内存区域。有些内存,比如那些包含可执行代码的,自然地就是只读内存;操作系统不应该允许进程写数据到它的可执行代码中。相反,包含数据的则可以被写,但是试图把它当作指令来执行就会失败。大部分处理器至少有两种执行模式:用户态(用户模式)和核心态(核心模式)。我们不希望核心代码被用户执行或核心数据结构被访问,除非处理器运行在核心态下。

相关阅读 更多 +
排行榜 更多 +
几何飞行内购修改版

几何飞行内购修改版

飞行射击 下载
别踩白块内购修改版

别踩白块内购修改版

休闲益智 下载
乐涂数字填色游戏

乐涂数字填色游戏

休闲益智 下载