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);
//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);
相关文章推荐
- linux内核提供的内存操作函数
- linux内核同步之每CPU变量、原子操作、内存屏障、自旋锁【转】
- linux 内存映射 remap_pfn_range操作(内核地址映射到用户空间)
- linux内核同步之每CPU变量、原子操作、内存屏障、自旋锁
- linux内核同步之每CPU变量、原子操作、内存屏障、自旋锁
- linux 用户空间与内核空间——高端内存详解
- linux 内核的链表操作
- 【Linux】在内核中申请内存
- 深入理解linux内核--内存寻址
- linux 内核的链表操作(好文不得不转)
- linux通过内核启动参数预留系统内存
- Linux下查看内核、CPU、内存及各组件版本的命令和方法
- Linux下如何查看CPU型号、个数、核数、逻辑CPU数、位数、发行版本、内核信息、内存、服务器生产厂家
- Linux内核开发之内存与I/O访问(三)
- linux 内核链表操作头文件list.h C++
- Linux下给内核或源码制作和打补丁操作命令--diff、patch
- linux 3.4.10 内核内存管理源代码分析10:slab通用长度内存分配
- linux 用户空间与内核空间——高端内存详解
- 从 Linux 内核访问用户空间内存
- 内核中与驱动相关的内存操作之七(slab)