现在的位置: 首页 > 综合 > 正文

感受虚拟内存-2(cat /proc/pid/maps 和 listvma.ko

2014年10月21日 ⁄ 综合 ⁄ 共 982字 ⁄ 字号 评论关闭

注:在根据传递的pid参数来找tas_struct结构时候,用find_task_by_vpid好像不行,换了一种方式

struct task_struct *p=pid_task(find_get_pid(pid),PIDTYPE_PID);

先写个循环执行的程序,不让其马上终止。。

代码:

#include <stdio.h>
#include <stdlib.h>
int main(int ac,char**av)
{
    int i;
    unsigned char *buff;
    buff=(char*)malloc(sizeof(char)*1024);
    printf("pid is %d\n",getpid());
    for(i=0;i<60;i++)
	sleep(60);
    return 0;
}

1 ,首先用查看proc文件中相应进程的方法来查看进程的虚拟地址域空间。

结果如下:

2,然后用在内核中打印该进程的虚拟地址域的方法

代码如下:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
static int pid;
module_param(pid,int,0644);
static int __init listvma_init(void)
{
    struct task_struct *p;
    struct vm_area_struct *pm;
    p=pid_task(find_get_pid(pid),PIDTYPE_PID);
    pm=p->mm->mmap;
    while(pm)
    {
	printk("start:%p\tend:%p\n",(unsigned long*)pm->vm_start,
		(unsigned long*)pm->vm_end);
	pm=pm->vm_next;
    }
    return 0;
}
static void __exit listvma_exit(void)
{
    printk("levaing..\n");
    return ;
}
module_init(listvma_init);
module_exit(listvma_exit);
MODULE_LICENSE("GPL");

给其传递进程的参数:

insmod listvma.ko pid=231

结果如下图:

对比两个结果,发现是全部吻合的。。。。。

抱歉!评论已关闭.