1、介绍
简单来说就是查看进程的虚拟地址空间是如何使用的。总共包括六列,每列及其含义如下。
address | perms | offset | dev | inode | pathname
(1)地址:本段在虚拟内存中的地址范围;对应vm_area_struct中的vm_start和vm_end。
(2)权限:本段的权限; r-读,w-写,x-执行, p-私有;对应vm_flags。
(3)偏移地址:即本段映射地址在文件中的偏移;对于有名映射指本段映射地址在文件中的偏移,对应vm_pgoff;对于匿名映射为vm_area_struct->vm_start。
(4)主设备号与次设备号:所映射的文件所属设备的设备号,对应vm_file->f_dentry->d_inode->i_sb->s_dev。匿名映射为0。其中fd为主设备号,00为次设备号。
(5)文件索引节点号:对应vm_file->f_dentry->d_inode->i_ino,与ls –i显示的内容相符。匿名映射为0。;
(6)映射的文件名:对有名映射而言,是映射的文件名,对匿名映射来说,是此段内存在进程中的作用。[stack]表示本段内存作为栈来使用,[heap]作为堆来使用,其他情况则为无。
关于更基础的地址空间划分、地址空间与mm_struct的管理 可以参照 这里 (很全面)!!!
其中涉及的task_struct, mm_struct , vm_area_struct等结构可以额外搜索文章详细了解,这里只做简要介绍。例如 这里
①task_struct:每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。
代码位置: 位置:<include\linux\sched.h> - 593行
部分代码如下:
struct task_struct
{
/*...*/
struct mm_struct *mm;
struct mm_struct *active_mm;
/* Per-thread vma caching: */
struct vmacache vmacache;
/*...*/
}
②mm_struct:每一个进程都会有唯一的mm_struct结构体。
位置:<include\linux\mm_types.h> - 340行
部分代码如下:
struct mm_struct
{
/*...*/
struct vm_area_struct *mmap; /* list of VMAs */
struct rb_root mm_rb;
u64 vmacache_seqnum; /* per-thread vmacache */
unsigned long mmap_base; /*映射基地址*/
unsigned long mmap_legacy_base; /*不是很明白这里*/
unsigned long task_size; /*该进程能够vma使用空间大小*/
unsigned long highest_vm_end; /*该进程能够使用的vma结束地址*/
pgd_t * pgd;
atomic_t mm_users;
atomic_t mm_count;
int map_count; /* vma的总个数 */
unsigned long total_vm; /* 映射的总页面数*/
/*...*/
unsigned long start_code, end_code, start_data, end_data;
unsigned long start_brk, brk, star