Linux内核内存操作

//All right revsered by yoki2009
//mailto:imj040144@tom.com
//微出版 www.epube.biz 相信梦想无界
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/kernel.h>       /* printk() */
#include <linux/slab.h>         /* kmalloc() */
#include <linux/fs.h>           /* everything... */
#include <linux/errno.h>        /* error codes */
#include <linux/timer.h>
#include <linux/types.h>        /* size_t */
#include <linux/fcntl.h>        /* O_ACCMODE */
#include <linux/hdreg.h>        /* HDIO_GETGEO */
#include <linux/kdev_t.h>
#include <linux/vmalloc.h>
#include <linux/genhd.h>
#include <linux/blkdev.h>

/*

alloc_page为从系统高端映射内存中分配出来,page_address返回该页的内核虚拟地址
对于高端内存仅再该页已经被映射的情况下,内核虚拟地址才存在,virt_to_page为接受
一个内核逻辑地址,因为需要的是逻辑地址,从Vmalloc返回的内存或高端内存无效,
kmap返回内核虚拟地址,对于低端内存页,它返回页的逻辑地址,高端内存页,创建一个
特殊的映射
*/
static int __init mem_test_init(void)
{
 printk("Hello, world/n");
 void * gap = (void *)__get_free_page(GFP_KERNEL);
 memcpy(gap,"a",sizeof("a"));

 printk("[LOWMEM VirtPage]get_free_page == %x/n",gap);
 printk("[LOWMEM alloc_page]mem content == %s/n",(char *)gap);
 //page_to_pfn函数得到每个page在mem_map的数组里面的位置,左移PAGE_SHIFT
 //就是乘以页的大小,这就得到了该页的物理地址,这个物理地址加上PAGE_OFFSET(3G)
 //就得到了该page的线形地址
 //每个页描述结果存在一个成为mem_map的数组里,而且是严格按照物理内存顺序来
 //存放的,页就是物理上第一个页描述结构,作为mem_map数组的第一个元素,依次类推
 void * phy_address = page_to_pfn((struct page *)gap)<<PAGE_SHIFT;
 printk("[LOWMEM VirtPage]Physical Address == %x/n",phy_address);
 printk("[LOWMEM VirtPage]Linear_address == %x  PAGE_OFFSET == %x/n",phy_address+PAGE_OFFSET,PAGE_OFFSET);
 void * vtp = (void *)virt_to_page(phy_address+PAGE_OFFSET);
 printk("[LOWMEM VirtPage]virt_to_page == %x/n",vtp); 

 void * ap = (void *)alloc_page(GFP_KERNEL);
 void * pa = (void *)page_address(ap);
 printk("[HIGH MEM VirtPage]page_address == %x/n",pa);
// printk("[page_address]mem content == %s/n",&pa);
 

 printk("[VirtPage]kmap == %x/n",kmap(ap));
 
 free_page(ap);
 free_page(gap);
 return 0;
}

static void __exit mem_test_exit(void)
{
 
}

module_init(mem_test_init);

module_exit(mem_test_exit);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值