mmap--最简单的测试程序(用户空间与内核空间数据交换&&用户态和内核态的数据交换用例)

//内核模块测试程序

#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);

 

         //在共享内存中写上一个字符串

         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("Kuanish");

MODULE_DESCRIPTION("mmap test");

 

module_init(shao_init);

module_exit(shao_exit);

 

//用户态测试程序

#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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值