内核与用户空间共享内存的问题
这段程序网上找的:正文
作者:wheelz
来自:
http://www.linuxforum.net/forum/gshowflat.php?cat=&board=linuxk&number=587187&page=0&view=collapsed&sb=5&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内核下,谢谢。 好像没有共享内存的必要把 一般kernel module先用get free pages申请好一片un paged内存,
然后给application用的时候要map一下 Posted by itinsider on 2008-6-25 13:30 http://www.ibmnb.com/images/common/back.gif
一般kernel module先用get free pages申请好一片un paged内存,
然后给application用的时候要map一下
在内核中MAP还是用户空间?
页:
[1]