04_22 vma(进程下的每个虚拟内存区域查看)对象实战

前言

vma不太懂的可以往前翻
03_008内存映射原理_虚拟内存区域vm_area_struct详解,和mmap系统钓调用及物理内存结构体完全分析
vam 虚拟内存区域 每个进程下有多个vma 这次是查看每个vma的起始地址 结束地址和大小使用
1.进程在用户空间调用mmap也就是上面那个函数。
2.在当前进程的地址空间当中寻找一段连续的空虚的虚拟地址
3.给这块虚拟地址分配一个vm_area_struct的结构并对其各个区域进行初始化
4.将新键的虚拟结构插入到虚拟地址空间(mm_struc)的链表或者红黑树当中

结构体扫盲

task_stuct 进程描述符
mm_struct 用户虚拟进程地址空间描述符
vm_area_struct 虚拟区域描述符

代码

#include 
#include 
#include 
#include 
#include 

static int pid;
module_param(pid,int,S_IRUGO);//传递模块参数 这个参数最后表示能被所有人读或者取

static void printFunc(struct task_struct *task)
{
    struct mm_struct *mm;
    struct vm_area_struct *vma;
    int i =0;
    unsigned long start,end,length;
    mm = task->mm;
    pr_info("mm=%p\n",mm);
    vma = mm->mmap;
    down_read(&mm->mmap_sem); //读的时候要进行保护
    pr_info("vmas:vma start end\n");
    while(vma){
        i++;
        start = vma->vm_start;
        end = vma->vm_end;
        length=end-start;
        pr_info("地址开始结束 长度....\n");
        vma = vma->vm_next;
    } 
    up_read(&mm->mmap_sem);
}

static int __init myvma_init(void)
{
    struct task_struct *task;
    //根据进程号拿到进程描述符
    if(pid==0){
        task=current;
    }
    else{
        task =pid_task(find_vpid(pid),PIDTYPE_PID);
    }

}

你可能感兴趣的:(狂刷KPI,性能优化,数据库)