前言
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 <linux/version.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/slab.h>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);}}