设置首页  |   加入收藏  |  联系我们   
您的位置: 主页>Linux知识>内核研究>正文
使用范例:用户态和内核共享内存
文章来源:  编辑:  发布时间:2007-10-29

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

  2.6内核验证。

  内核模块-----------------------

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

(e129)


 
Tags:共享 内存 用户 范例 使用 #include buf fd 内核 static

Google
 
上一篇: 用tags/cscope看内核源代码-HOWTO   下一篇: 2.6.x版Linux内核发现安全漏洞
【返回顶部】 【打印】 【大】 【中】 【小】 【关闭】

 我来说两句
用户名: 新注册) 密码: 匿名评论 [论坛讨论]
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 相关文章
 热门文章

 
版权所有  2005-2006  Linux集中营  闽ICP备07500055号