我是靠谱客的博主 阔达篮球,最近开发中收集的这篇文章主要介绍access_process_vm,将当前进程的一段内存内容拷贝到另一个进程的内存中,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

access_process_vm,将当前进程的一段内存内容拷贝到另一个进程的内存中,由于当前进程的(主要指内核进程和用户进程,或内核态的用户进程之间进行拷贝,由于双方的页表不同所以不能访问到对方的东西,可以用这个函数把对方的页映射到高端内存然后进行拷贝,实现不同进程间的内存拷贝)

 

 

#include <linux/sched.h>
#include <linux/mm.h>

extern int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write);
char buf[4096+8] = "TEST ACCESS_PROCESS_VM 000000";
void test_user_copy(void)
{
 struct task_struct *t;
 int len = 1024*4;
 long addr = 0x8696008; //this is a fixed addr printed by tfile.c, never change.
 int found = 0;
 int i;

        for_each_process(t) {
            if(!strncmp("a.out", t->comm, 5)) {found++; break; }
            printk("%p %s/n", t, t->comm);
        }
        if(!found) return;

        //so I can see kernel writing is done from user space. each time, the addr is not the
        //same
        sprintf(buf + 16, "%p", &addr);

        for(i = 0; i < 6*256; i++) { //256 pages = 1M
            access_process_vm(t, addr+i*4096, buf, len, 1);  //addr USER, buf is KERNEL
        }
        printk("i = %d addr max = %lx /n", i, addr + i*4096);
}

int mod_init(void)
{
 test_user_copy();
 return 0;
}

void mod_exit(void)
{
}

module_init(mod_init);
module_exit(mod_exit);

 

 

 

 

---------------------------------------------------------------------------------------------------------------------------------------------------

test.c

 

#include <stdlib.h>
#include <stdio.h>
char *cp;

main()
{
    cp = malloc(1024*4); //4M
    printf("cp = %p size = 4k/n", cp);//change addr value in module according to this printed value.


    for(;;) {
      getchar();
      printf("%s, /n", cp);
    }
}

最后

以上就是阔达篮球为你收集整理的access_process_vm,将当前进程的一段内存内容拷贝到另一个进程的内存中的全部内容,希望文章能够帮你解决access_process_vm,将当前进程的一段内存内容拷贝到另一个进程的内存中所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(76)

评论列表共有 0 条评论

立即
投稿
返回
顶部