原帖由 xiaozhaoz 于 2006-4-13 09:40 发表
个人觉得,根本不可行!
首先, 你提到的在vma存在的情况下, swap存在的情况下, 直接访问物理内存. 而且,看情况这块物理内存是用户空间分配的.
在mmu的CPU中, page frame映射到 page中, 不是固定的, 更确切的说, ...
原帖由 albcamus 于 2006-4-13 09:55 发表
正看的过瘾呢, 是不是还没打完字呀?
原帖由 xiaozhaoz 于 2006-4-13 09:40 发表
个人觉得,根本不可行!
首先, 你提到的在vma存在的情况下, swap存在的情况下, 直接访问物理内存. 而且,看情况这块物理内存是用户空间分配的.
在mmu的CPU中, page frame映射到 page中, 不是固定的, 更确切的说, ...
原帖由 xiaozhaoz 于 2006-4-14 09:14 发表
说实在的, 看了一会儿, 不知道表述了什么意思.
但有几个说法我认为不正确.
1. 用户空间一次分配4M的空间分配不到?
在有mmu的CPU中, 400M我都分配过. 除非内核的VM分配限制启用,且用户空间分配的虚存 > 1 ...
原帖由 xiaozhaoz 于 2006-4-14 09:14 发表
说实在的, 看了一会儿, 不知道表述了什么意思.
但有几个说法我认为不正确.
1. 用户空间一次分配4M的空间分配不到?
在有mmu的CPU中, 400M我都分配过. 除非内核的VM分配限制启用,且用户空间分配的虚存 > 1 ...
原帖由 xiaozhaoz 于 2006-4-14 09:14 发表
3. 你说强调的电信设备对内存要求很高, 恰好,我一直在作电信设备, 应该算是核心网级别的. 我只知道这些和硬件总线有关, 向Linux这样的操作系统, 中间隔了一层虚存管理, 确实不如直接使用物理地址方便. 如果是这样,我们一般必须在内核中将虚存关闭, 然后CPU也关闭mmu. 就是把CPU当一个没有mmu的硬件来使用, 但这情况中,我们一般不用Linux, 因为Linux涉及到libc库的问题. 工作量很大. 我个人认为, 向你上面那样简单的直接访问物理地址, 想提高效率的做法, 是有错误的.
原帖由 albcamus 于 2006-4-14 10:31 发表
还有这样的事啊, linux关闭VM&&CPU关闭MMU, 开眼界
原帖由 xiaozhaoz 于 2006-4-14 10:57 发表
如果lz对阅读代码没有兴趣,我想我是找错了讨论对象了. 我只懂技术, 只会看代码和些软件.
你说得libc分配到物理内存后, 请问在有MMU的环境中libc怎么直接分配物理内存?
通过libc, 只能分配到虚存.
你怎么 ...
原帖由 xiaozhaoz 于 2006-4-14 11:32 发表
我没看ldd3, 我只看过内核代码.
和顶楼的不同, 你现在说得是不用vma, 直接在内核分配物理内存, 如果是这样的话, 你的用户空间要使用的内存都要内核直接分配物理内存, get_pages(), 通过系统调用进入内核的. 那 ...
原帖由 思一克 于 2006-4-14 12:53 发表
to orbire
是不是这样:
m = open("/dev/mem", ...);
lseek(m, 1204, 0);
read(m, buf, sizeof(buf));
write(m, "123456", 6);
直接操作物理内存?
"
在内核空间申请 ...
原帖由 obrire 于 2006-4-14 16:29 发表
正是,当你得先知道确切的物理地址, 也就是OFF_SET,一般我的系统分配在0x600000以后.
我采用在/proc/mem_window输出一个地址及尺寸, 然就这样操作了
原帖由 思一克 于 2006-4-14 12:30 发表
to obrire,
我看了你的做法,觉得不错。
比如,在用户空间malloc()了32M虚拟地址,如何在用户空间知道其物理开始地址并且打开/dev/mem线性操作相应的地址?
原帖由 思一克 于 2006-4-14 16:57 发表
可是你
m = open("/dev/mem", ...)
read(m, .....)
本身就是要调用copy_to_user. 那能快的起来吗,怎么能是“比mmap更快的方法”?
原帖由 思一克 于 2006-4-14 17:05 发表
to obrire,
内核中的VMA (vmlist)的的虚拟地址 减去 PAGE_OFFSET 也不等于物理地址啊?你如何算出来的
原帖由 思一克 于 2006-4-14 17:07 发表
那你open("/dev/mem", ...)之后,又不read/write了。
去memset哪个地方?
"所以我不会用read/write
memset area
*(DWORD *)addr = 0x000000f
这不会更简单吧. "
原帖由 思一克 于 2006-4-14 17:10 发表
to orbire,
_pa(x)不能用于kernel的VMA(vmalloc得到的)地址。无效的
原帖由 思一克 于 2006-4-14 16:57 发表
可是你
m = open("/dev/mem", ...)
read(m, .....)
本身就是要调用copy_to_user. 那能快的起来吗,怎么能是“比mmap更快的方法”?
原帖由 思一克 于 2006-4-17 10:48 发表
那到底什么是快速操作物理内存?
open("/dev/mem",,,) read/write已经被否定了。
mmap你说过不是最快的。
如何最快--物理内存
原帖由 思一克 于 2006-4-17 11:40 发表
ioremap好象不是做那个用途的吧。
另外,ioremap得到的虚拟地址如何转换为物理地址? 还有调用ioremap如何使返回地址在你的应用空间?
原帖由 obrire 于 2006-4-17 12:30 发表
iomem *address = ioremap(0x600000/*物理地址*/, 0x200000/*尺寸*/)
此处的address已经是虚地址了
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |