Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1253038
  • 博文数量: 177
  • 博客积分: 1528
  • 博客等级: 上尉
  • 技术积分: 1891
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-15 18:03
文章分类

全部博文(177)

文章存档

2020年(1)

2018年(19)

2017年(4)

2016年(21)

2015年(40)

2014年(13)

2013年(26)

2012年(16)

2011年(37)

我的朋友

分类: LINUX

2011-09-19 12:05:04

例子中,用户态程序的KERNEL_VIRT_ADDR就是内核模块打印的地址p
这里是hard coding(先加载内核模块,再把打印的地址赋值给KERNEL_VIRT_ADDR),
可以采用其他的方式传递。

2.6内核验证。
  1. //kernel

  2. #include <linux/config.h>
  3. #include <linux/module.h>
  4. #include <linux/kernel.h>
  5. #include <linux/mm.h>

  6. MODULE_LICENSE("GPL");
  7. MODULE_AUTHOR("Wheelz");
  8. MODULE_DESCRIPTION("mmap demo");

  9. static unsigned long p = 0;

  10. static int __init init(void)
  11. {
  12.     //分配共享内存(一个页面)
  13.     p = __get_free_pages(GFP_KERNEL, 0);
  14.     SetPageReserved(virt_to_page(p));

  15.     printk("<1> p = 0x%08x\n", p);

  16.     //在共享内存中写上一个字符串
  17.     strcpy(p, "Hello world!\n");

  18.     return 0;
  19. }

  20. static void __exit fini(void)
  21. {
  22.     ClearPageReserved(virt_to_page(p));
  23.     free_pages(p, 0);    
  24. }

  25. module_init(init);
  26. module_exit(fini);
  1. //user

  2. #include <sys/mman.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. #include <stdio.h>

  7. #define PAGE_SIZE (4*1024)

  8. #define PAGE_OFFSET        0xc0000000
  9. #define KERNEL_VIRT_ADDR    0xc5e3c000

  10. int main()
  11. {
  12.     char *buf;
  13.     int fd;
  14.     unsigned long phy_addr;

  15.     fd=open("/dev/mem",O_RDWR);
  16.     if(fd == -1)
  17.         perror("open");
  18.     phy_addr=KERNEL_VIRT_ADDR - PAGE_OFFSET;

  19.     buf=mmap(0, PAGE_SIZE,
  20.         PROT_READ|PROT_WRITE, MAP_SHARED,
  21.         fd, phy_addr);
  22.     if(buf == MAP_FAILED)
  23.         perror("mmap");
  24.     puts(buf);//打印共享内存的内容
  25.     munmap(buf,PAGE_SIZE);

  26.     close(fd);
  27.     return 0;
  28. }
阅读(4110) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~