一个真实的FreeBSD进程的地址空间的探察分析
2009-05-13 03:10:14来源:未知 阅读 ()
一个真实的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
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 最便宜的空间域名! 2014-11-11
- 提示:bad kernel: arp : 内网IP地址 is on em0 but got rep 2009-05-13
- freebsd和linux下添加IP地址和静态路由 2009-05-13
- fb 相当快的ports源地址 2009-05-13
- 分析squid的日志,罗列出一天最多的点击url 2009-05-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash