- 论坛徽章:
- 0
|
关于a版主提到的是否存在多个虚拟地址对1个物理地址的问题,我写了个小测试程序,高手勿笑.
#include <linux/config.h>
#include <linux/version.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/cache.h>
#include <linux/pci.h>
#include <linux/types.h>
#include <linux/mm.h>
#include <linux/vmalloc.h>
#include <asm/page.h>
#include <asm/uaccess.h>
static int __init mm_test(void){
void *pa = 0;
void *va1 = 0;
void *va2 = kmalloc(16, GFP_KERNEL);
if(!va2)
return 0;
printk(KERN_ERR"va2 is %p\n", va2);
pa =(void *) __pa(va2);
printk(KERN_ERR"pa is %p\n", pa);
va1 = ioremap((unsigned long)pa, (unsigned long)16);
if(!va1){
printk(KERN_ERR"ioremap error\n");
kfree(va2);
return 0;
}
printk(KERN_ERR"va1 is %p\n", va1);
strncpy(va1, "double va test\n", 16);
printk(KERN_ERR"%s\n", (char *)va2);
iounmap(va1);
kfree(va2);
return 0;
}
static void __exit mm_exit(void){
return;
}
module_init(mm_test);
module_exit(mm_exit);
MODULE_LICENSE("GPL");
|
平台是32位arm.
运行后打出来的信息如下:
insmod mmtest.ko
va2 is c1761ac0
pa is 01761ac0
va1 is c2878ac0
double va test
[ 本帖最后由 epegasus 于 2009-4-19 18:42 编辑 ] |
|