免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 11560 | 回复: 8
打印 上一主题 下一主题

快速内存操作技术 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2006-04-13 09:40 |显示全部楼层
个人觉得,根本不可行!

首先, 你提到的在vma存在的情况下, swap存在的情况下, 直接访问物理内存. 而且,看情况这块物理内存是用户空间分配的.
在mmu的CPU中, page frame映射到 page中, 不是固定的, 更确切的说, 一块物理页, 如果是用户空间分配的, 不是只给一个任务使用的, 因为swap处于运行中.  别以为你直接访问物理内存, swap就不运行了, 你要用内核的分配物理页函数, 就可能触发kswap

直接访问page frame, 可能导致访问到的page frame存放的是已经被切换出去的任务的数据. 即使你非常注意访问的准确性.

再者,  你这里说得所有东西都没考虑到, 用户任务分配好vma后, 物理地址根本是不确定的. 要不内核的lazy map机制就没用了.

最后, 内核现在的实现已经有非常好的扩展性, 可能是你了解不多. 根本不需要你说得这么多复杂的东西.
在嵌入式mmu CPU环境下,通过 mlock + 锁的技术,可以在内核和用户空间直接在有限的物理页上交换数据. 用户空间malloc几页物理内存, 然后在每页中写入一两个字符, 以完成内核的page frame 到page的映射, 然后用mlock()锁定这几页, 不然swap运行. 然后就可以用这几页来完成用户空间和内核的数据交互. 不过锁的实现都要考虑.

还有, 嵌入式环境没有磁盘, 一般需要将swap off, 就是设置内核的watermark level为0,这样kswap就不会将物理页交换. 直接调swapoff命令. 或者写/proc/sys/vm/swappiness

内核对vm分配也有限制, 所以用户空间malloc过大的空间,也可能不成功, 这时内核的 over commit功能.

论坛徽章:
0
2 [报告]
发表于 2006-04-13 10:37 |显示全部楼层
原帖由 albcamus 于 2006-4-13 09:55 发表


正看的过瘾呢, 是不是还没打完字呀?


没了, 就这些东西, 对内存这块不怎么懂, 不敢乱说.

不过将vm分成 3G/IG, 2G/2G, 1G/3G的选项已经合入最新的内核2.6.17-RC1, 正在看实现.

讨论在:
http://groups.google.com/group/l ... =2#f99732a73435db13

论坛徽章:
0
3 [报告]
发表于 2006-04-14 09:14 |显示全部楼层
说实在的, 看了一会儿, 不知道表述了什么意思.

但有几个说法我认为不正确.
1.  用户空间一次分配4M的空间分配不到?
在有mmu的CPU中, 400M我都分配过. 除非内核的VM分配限制启用,且用户空间分配的虚存 > 1/2物理内存+swap空间大小, 这是默认设置.
不知道你这个结论怎么得出来的. 你仔细看一下Linux libc库和内核如何分配用户空间内存就知道了. 我上面也说了, lazy tlb是内核分配虚存的策略之一.
至于在内核空间一次分配 >4M 物理内存, 这种代码我还没见过, 呵呵.

2. 你一直强调你在用户空间不用malloc, 那是我的理解错了, 不过这也和你顶楼的说法相悖.
如果你用户空间不用malloc, 直接访问物理内存, 也不用内核帮你分配物理内存. 那问题同样存在, 你如何知道你用的哪个物理页, 内核没有自己使用, 或者内核没有分配给其它用户空间任务??
我只知道, Linux物理内存是否被占用, 在物理内存中是不会有记录的, 这些信息记录在VM的低12位地址中. 内核中, 在flat mode的内存管理中, 内核只是用一个bitmap + 数组来管理物理内存.

3.  你说强调的电信设备对内存要求很高, 恰好,我一直在作电信设备, 应该算是核心网级别的. 我只知道这些和硬件总线有关, 向Linux这样的操作系统, 中间隔了一层虚存管理, 确实不如直接使用物理地址方便. 如果是这样,我们一般必须在内核中将虚存关闭, 然后CPU也关闭mmu. 就是把CPU当一个没有mmu的硬件来使用, 但这情况中,我们一般不用Linux, 因为Linux涉及到libc库的问题. 工作量很大.  我个人认为, 向你上面那样简单的直接访问物理地址, 想提高效率的做法, 是有错误的.

其它的东西, 我看不出来和这个主题有什么关系.

[ 本帖最后由 xiaozhaoz 于 2006-4-14 09:24 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-04-14 10:43 |显示全部楼层
原帖由 albcamus 于 2006-4-14 10:31 发表


还有这样的事啊, linux关闭VM&&CPU关闭MMU, 开眼界


老大啊,我可没说 关闭Linux的VM和 在CPU硬件上关闭MMU啊.  我是说在操作系统内核关闭这些东西.

Linux在内核中关闭VM我没有尝试过, 可能会涉及到很多东西.

不过一般的芯片关闭mmu还是有寄存器可以设置的.
Linux不适合这么作, 我认为是因为libc的原因,
一般的LIBC设置成nommu工作模式不太容易, 如ppc, 一般libc都是按照mmu启用情况下编写的.  我一直是这样认为的, 如果有人有更好的见解,欢迎另开主题讨论.

我们一般用 VxWorks, 或者其它一些嵌入式系统作这些事情. 即使有mmu的CPU, 我们也可以不启用. 直接访问实地址, 但必须在硬件中关闭mmu, 而且 操作系统要扩展的足够好才行.

论坛徽章:
0
5 [报告]
发表于 2006-04-14 10:57 |显示全部楼层
如果lz对阅读代码没有兴趣,我想我是找错了讨论对象了. 我只懂技术,  只会看代码和些软件.

你说得libc分配到物理内存后, 请问在有MMU的环境中libc怎么直接分配物理内存?
通过libc, 只能分配到虚存.
你怎么才知道你的东西已经分配到

论坛徽章:
0
6 [报告]
发表于 2006-04-14 11:01 |显示全部楼层
如果lz对阅读代码没有兴趣,我想我是找错了讨论对象了. 我只懂技术,  只会看代码和些软件.

你说得libc分配到物理内存后, 请问在有MMU的环境中libc怎么直接分配物理内存?
通过libc, 只能分配到虚存.
你怎么才知道你的东西已经分配到物理内存了? 内核的lazy tlb决定了虚拟内存分配到后,不会马上对应到物理内存(page frame)

在这个主题中,我只想讨论 你提出的在MMU CPU, VM工作, Swap 工作的情况下, 快速直接访问物理内存的方法. 其它的可以另开主题讨论.

BTW: 虽然我不懂硬件, 但是单节点300ms的延时让我震惊. 我想如果中间通过10个你们的voip设备的话 .....

在Linux内核中实现的方案, 用商业技术来推脱, 有点可笑和羞辱. 如果是机密的商业方案, 还是不要拿出来说为妙.

论坛徽章:
0
7 [报告]
发表于 2006-04-14 11:32 |显示全部楼层
我没看ldd3, 我只看过内核代码.

和顶楼的不同, 你现在说得是不用vma, 直接在内核分配物理内存, 如果是这样的话, 你的用户空间要使用的内存都要内核直接分配物理内存, get_pages(), 通过系统调用进入内核的. 那么这些物理内存是带有__KERNEL__ 属性的.  

那么和我提出的方案一样,为什么不用mlock呢? 这不是更快更方便吗?

论坛徽章:
0
8 [报告]
发表于 2006-04-14 12:19 |显示全部楼层
sysenter这种实现我早就知道了,这时一个几年前的东西了, 我也知道他的效率很高.
其实直接操作/dev/mem的事情我很早就用过, 但是对于实际开发来说.

更改所有用户空间的内存管理方法, 直接操作物理内存,  你怎么保证系统库能正常运行?  如果你不需要系统库, 你编写上层应用程序, 是否要替换所有内存操作代码? 对于分配的所有物理页,你是否要自己管理他的碎片, 等问题? 你是否考虑到了这样的改动对于所有的上层应用程序来说, 有多少附加的工作量?

为什么我用mlock, 只是说把mlock可以用来在用户和内核之间通信使用. 请问,你一次有多少数据量要在用户和内核之间交互?   我现在的使用中都是足够的. 而这种方法的改动是最小的, 效率也不比你提到的低.

对于用户空间任务之间的数据交互, 用线程可以减少很多麻烦.

论坛徽章:
0
9 [报告]
发表于 2006-04-14 12:30 |显示全部楼层
另外, 你多次提到有人建议linus修改vma和mm的实现, 能否给出讨论的链接地址, 多谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP