概述
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,将当前进程的一段内存内容拷贝到另一个进程的内存中所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复