找回密码
 注册
快捷导航
查看: 9139|回复: 3

内核与用户空间共享内存的问题

[复制链接] |自动提醒
阅读字号:

2449

回帖

16

积分

9261

资产值

高级会员 Rank: 2Rank: 2

注册时间
2002-6-22
铜牌荣誉勋章(注册8年以上会员)银牌荣誉勋章(注册10年以上会员)
发表于 2008-6-24 20:04:43| 字数 1,438| - 中国–广东–佛山 奥飞数据BGP机房 | 显示全部楼层 |阅读模式
这段程序网上找的:
正文
作者:wheelz
来自:
http://www.linuxforum.net/forum/ ... mp;o=all&fpart=
例子中,用户态程序的kernel_virt_addr就是内核模块打印的地址p
这里是hard coding(先加载内核模块,再把打印的地址赋值给kernel_virt_addr),
可以采用其他的方式传递。

2.6内核验证。

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


#include <linux/config.h>

#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/mm.h>



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 <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



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;

}  

2.6内核下能正常运行, 2.4内核能运行,但用户程序不能输出内核写入的字符,无任何错误,何解?或者谁能告诉我用户态程序如何与内核模块共享内存,在2.4内核下,谢谢。
JAVA+PHP+VC+linux c

2694

回帖

51

积分

1万

资产值

钻石会员 Rank: 3Rank: 3Rank: 3

注册时间
2007-7-4
发表于 2008-6-25 12:51:24| 字数 12| - 中国–山东–滨州 移动 | 显示全部楼层
好像没有共享内存的必要把
回复 支持 反对

使用道具 举报

326

回帖

0

积分

340

资产值

入门会员 Rank: 1

注册时间
2007-10-6
发表于 2008-6-25 13:30:35| 字数 67| - 中国–上海–上海 联通 | 显示全部楼层
一般kernel module先用get free pages申请好一片un paged内存,
然后给application用的时候要map一下
Impossible is nothing.
回复 支持 反对

使用道具 举报

2449

回帖

16

积分

9261

资产值

高级会员 Rank: 2Rank: 2

注册时间
2002-6-22
铜牌荣誉勋章(注册8年以上会员)银牌荣誉勋章(注册10年以上会员)
 楼主| 发表于 2008-6-25 17:11:24| 字数 120| - 中国–浙江–杭州 电信 | 显示全部楼层
QUOTE:
Posted by itinsider on 2008-6-25 13:30
一般kernel module先用get free pages申请好一片un paged内存,
然后给application用的时候要map一下

在内核中MAP还是用户空间?
JAVA+PHP+VC+linux c
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Powered by Discuz! X3.5 © 2001-2023 Comsenz Inc

GMT+8, 2025-2-12 19:15 , Processed in 0.086338 second(s), 31 queries , Gzip On, OPcache On.

手机版|小黑屋|安卓客户端|iOS客户端|Archiver|备用网址1|备用网址2|在线留言|专门网

返回顶部