access_process_vm,将当前进程的一段内存内容拷贝到另一个进程的内存中

本文介绍了一个用于实现不同进程间内存拷贝的Linux内核函数access_process_vm。该函数能够将一个进程的内存内容拷贝到另一个进程中,适用于内核进程与用户进程之间的交互。文章通过一个具体的测试案例展示了如何使用此函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值