linux初探

首页

应用服务器

Linux技巧

中文文档

Linux初级

服务器源代码

命令详解

Linux技术应用

Linux安全应用

Linux业界新闻

UniX技术文章

Linux编程与内核

Linux数据库

Linux服务器

Linux安装指导

Linux论坛

首页>>Linux编程与内核>>文章正文

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

作者:wheelz

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

2.6内核验证。

内核模块

QUOTE:
#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;

}

相关文章

·用C++ Builder来定制系统菜单
·unix下编写socket程序的一般步骤
·利用C语言小程序来解决大问题
·C++程序设计从零开始之语句
·.NET开发之中的17种正则表达式小结
·轻松搞定Java内存泄漏
·Java学习之类的属性
·Java学习之值传递
·Java 范型攻略篇

热门文章

·Linux下的编程 PHP高级技巧全
·用Java获得IP地址
·新手学习之浅析一下c/c++中的
·在Linux系统中安装Java
·应用2.6内核超线程模式
·使用TC实现基于linux的流量管
·Linux启动添加内核参数简介
·Linux下的编程 PHP高级技巧全
·在php中避免重复引用的办法
·Linux下的编程 PHP高级技巧全

Copyright@2005 www.linuxGoo.com All Right Reserved