一个真实的FreeBSD进程的地址空间的探察分析

2009-05-13 03:10:14来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

  
一个真实的FreeBSD进程的地址空间的探察分析
雨丝风片:chinaunix.net
为了形象地描述一个真实的FreeBSD进程的地址空间的组织结构,我写了一个简单的程序,然后使用FreeBSD的kvm接口探察组成它的虚拟地址空间的数据结构,希望通过形象的图示和对真实数据的分析来讲述相关的知识,以便和代码阅读、分析形成有效互补。内核空间原是一篇漆黑,一切都只能停留在由内核源代码产生的想象中。现在有了kvm这个手电筒,就可以借着这点亮光探索前进了。希望大家能够多提意见和问题,多指出方向,以便我们能探索出更大的未知领域。
参考文献:
【FreeBSD操作系统设计与实现】第五章:Memory Management
【FreeBSD虚存系统splay树的基本原理】
【FreeBSD虚存系统splay树的代码分析】
【使用kvm接口探察内核空间的方法】
作为测试进程的小程序很简单:
CODE:
[Copy to clipboard]
      1    int main(void)
      2    {
      3        for(;;)
      4            ;
      5    }一旦运行,这个进程便会陷入无限循环中,处于一种相对静止的状态,方便我们使用kvm接口对其进行探察。我们从描述其地址空间的vmspace结构体开始,把vm_map结构体和描述其地址空间中的连续区域的所有vm_map_entry结构体的内容都打印了出来,如下图1所示:

图1 一个真实进程的地址空间的组成结构图示
图1中蓝色小方块就是vm_map_entry结构体,除了位于vm_map结构体中的一个是用来作为头节点之外,实际用来描述测试进程地址空间的vm_map_entry结构体共有11个,它们分别表示地址空间中的一段连续区域。这11个vm_map_entry结构体是按照splay树的形态绘制的,树中的左右孩子指针在图1中用黑色箭头表示。我们知道,vm_map_entry结构体除了组织成splay树之外,还组织成了一个双向循环链表,其中,prev指针在图1中用红色箭头表示,而next指针则用蓝色箭头表示。注意,vm_map结构体里面的header也是这个双向循环链表中的一员。
图1中下方的方块分别给出了每个vm_map_entry结构体所表示的内存区域的大小,地址相邻的vm_map_entry结构体画在一排,我们可以看出,地址空间实际上由三大块组成。
下面我们来看看所打印出来的每个数字的实际含义。
首先来看看vmspace结构体:
CODE:
[Copy to clipboard]
    space.vm_swrss = 0
    space.vm_tsize = 1
    space.vm_dsize = 1
    space.vm_ssize = 32

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:OpenBSD下添加新硬盘.分区.格式化.挂载

下一篇:freebsd6 配置 pureftp