分享

mmap

 mrjbydd 2011-08-29
mmap--最简单的测试程序(用户空间与内核空间数据交换&&用户态和内核态的数据交换用例) 2011-03-30 18:54:01

++++++ 转载 ++++

//////////////////////////////////////////////////// Kernel mode module

#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/mm.h>

static unsigned long p = 0;


static int __init shao_init(void)
{
       //分配共享内存(一个页面)
      p = __get_free_pages(GFP_KERNEL, 0);

     SetPageReserved(virt_to_page(p));

      printk("<1> p = 0x%08x\n", p);  // we will get value of P
        
    //在共享内存中写上一个字符串
    strcpy(p, "Hello world!\n");

    return 0;

}

static void __exit shao_exit(void)
{
    ClearPageReserved(virt_to_page(p));
    free_pages(p, 0);
}


MODULE_LICENSE("GPL");
MODULE_AUTHOR("helloworld");
MODULE_DESCRIPTION("mmap test");

module_init(shao_init);
module_exit(shao_exit);


//////////////////////////////////////////////////// User mode applicaiton

#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

#define PAGE_SIZE (4*1024)
#define PAGE_OFFSET               0xc0000000

#define KERNEL_VIRT_ADDR 0xc5e3c000 //此处地址即为内核模块打印的地址p,动态的不固定,需要自行修改

int main()
{
         char *buf;
         int fd;
         unsigned long phy_addr;

         fd=open("/dev/mem",O_RDWR);
         if(fd == -1)
                   perror("open");

         phy_addr=KERNEL_VIRT_ADDR - PAGE_OFFSET;


         buf=mmap(0, PAGE_SIZE,
                   PROT_READ|PROT_WRITE, MAP_SHARED,
                   fd, phy_addr);

         if(buf == MAP_FAILED)
                   perror("mmap");

         puts(buf);//打印共享内存的内容

 
         munmap(buf,PAGE_SIZE);

         close(fd);

         return 0;

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多