当前位置:操作系统 > Unix/Linux >>

用户态和内核共享内存:最简单的例子

#include

  #include

  #include

  #include

  MODULE_LICENSE("GPL");

  MODULE_AUTHOR("Wheelz");

  MODULE_DESCRIPTION("mmap demo");

  static unsigned long p = 0;

  static int __init 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 fini(void)

  {

  ClearPageReserved(virt_to_page(p));

  free_pages(p, 0);

  }

   module_init(init);

  module_exit(fini);

  用户态程序---------------------------------

  #include

  #include

  #include

  #include

  #include

  #define PAGE_SIZE (4*1024)

  #define PAGE_OFFSET 0xc0000000

  #define KERNEL_VIRT_ADDR 0xc5e3c000

  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;

  }

  

上一个:Linux内核获取当前进程指针
下一个:Solaris、Linux和FreeBSD的内核比较

更多Unix/Linux疑问解答:
路由原理介绍
子网掩码快速算法
改变网络接口的速度和协商方式的工具miitool和ethtool
Loopback口的作用汇总
OSPF的童话
增强的ACL修改功能
三层交换机和路由器的比较
用三层交换机组建校园网
4到7层交换识别内容
SPARC中如何安装Linux系统(2)
SPARC中如何安装Linux系统(1)
用Swatch做Linux日志分析
实战多种Linux操作系统共存
浅析Linux系统帐户的管理和审计
Linux2.6对新型CPU的支持(2)
电脑通通透
玩转网络
IE/注册表
DOS/Win9x
Windows Xp
Windows 2000
Windows 2003
Windows Vista
Windows 2008
Windows7
Unix/Linux
苹果机Mac OS
windows8
安卓/Android
Windows10
如果你遇到操作系统难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,