您的位置:首页 > 运维架构 > Linux

Linux内核内存操作

2011-01-06 14:13 330 查看
//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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: