- 论坛徽章:
- 20
|
本帖最后由 nswcfd 于 2015-07-07 21:27 编辑
- #include <linux/kernel.h>
- #include <linux/module.h>
- #include <linux/vmalloc.h>
- #include <linux/err.h>
- void *va;
- int init(void)
- {
- va = vmalloc(32);
- printk("va=%p pa=%lx va2=%lx\n", va, __pa(va), __pa(va)+PAGE_OFFSET);
- if (!va || IS_ERR(va))
- return -ENOMEM;
- *(long *)va = jiffies;
- *((long *)va + 1) = 0xfacebead;
- return 0;
- }
- void fini(void)
- {
- vfree(va);
- }
- module_init(init);
- module_exit(fini);
- MODULE_LICENSE("GPL");
复制代码 crash> log | tail -n 1
va=ffffc2000001a000 pa=41000001a000 va2=ffffc2000001a000
crash> p va
va = $7 = (void *) 0xffffc2000001a000 #跟log的输出吻合
crash> rd 0xffffc2000001a000 2 #以va访问内容
ffffc2000001a000: 0000000104ded138 00000000facebead 8............... #跟程序逻辑一致
crash> kmem -v 0xffffc2000001a000
VM_STRUCT ADDRESS RANGE SIZE
ffff81003a6cf280 ffffc2000001a000 - ffffc2000001c000 8192 #得到vm_struct的地址 ffff81003a6cf280
crash> * vm_struct.addr,pages,nr_pages ffff81003a6cf280
addr = 0xffffc2000001a000
pages = 0xffff81003fd06e60 # struct page **pages
nr_pages = 1
crash> rd 0xffff81003fd06e60
ffff81003fd06e60: ffff81000506d838 8....... #费了半天功夫就是为了得到page*
crash> * -x page.index ffff81000506d838
index = 0x3e16 #pfn是0x3e16
crash> kmem ffff81000506d838
PAGE PHYSICAL MAPPING INDEX CNT FLAGS
ffff81000506d838 29f01000 0 3e16 1 28080000000000 #得到page的物理地址
crash> ptov 29f01000
VIRTUAL PHYSICAL
ffff810029f01000 29f01000 #物理地址+PAGE_OFFSET
crash> rd ffff810029f01000 2
ffff810029f01000: 0000000104ded138 00000000facebead 8............... #内容跟前面是一样的
#最后对比输出一下
crash> rd 0xffffc2000001a000 2
ffffc2000001a000: 0000000104ded138 00000000facebead 8...............
crash> rd 0xffff810029f01000 2
ffff810029f01000: 0000000104ded138 00000000facebead 8...............
|
|