- 论坛徽章:
- 0
|
原帖由 bripengandre 于 2009-5-27 15:27 发表 ![]()
这里没有munmap确实是遗漏了,但程序退出时,这个映射关系自然解除:
摘自man:
The munmap() system call deletes the mappings for the specified address range, and causes further references to
...
哥们太细心了。。我最近在做的一个小东西也用了NETLINK进行内存共享,做的事情和你差不多,我在内核里面申请了一段内存空间进行缓存,如果缓存满了就会通过netlink将缓存地址和缓存大小通知用户态进程去读取数据。在用户态我会做一个映射,如下:
- map_addr = mmap(0, buffer_size, PROT_READ|PROT_WRITE, MAP_SHARED, map_fd, buffer_addr);
- memcpy(buff_pos, map_addr, buffer_size); /* copy kernel data to user buffer, wait for transmiting */
- munmap(map_addr, buffer_size);
复制代码
看了你的代码后,我有了一些启发,我想我这个有点多余了,因为缓存从一申请开始它的大小和地址就应该不变了,所以只用到退出程序时接触映射就够了,而我这样效率更低了。
另外我有一个问题就是,我采用这种方式,如果当内核里面往缓存写数据速度太快时候,用户进程读取速度过慢,这样就会有数据的丢失的情况有时候会发生,我现在能做的就是增大内核缓存的申请,这种方法可能还是有一个限制,不知道大家有没有什么好的解决方法,谢谢了。 |
|