当前位置: 技术问答>linux和unix
用户程序下如何申请到一段在物理地址上是连续的空间。
来源: 互联网 发布时间:2016-05-29
本文导语: 大概要申请>10000字节的连续物理空间。 我试过了定义全局变量,局部变量,或者用malloc都不行。(用malloc大概能申请到1500-3000字节物理地址连续的空间) | 用户空间应用程序很难申请到大块...
大概要申请>10000字节的连续物理空间。
我试过了定义全局变量,局部变量,或者用malloc都不行。(用malloc大概能申请到1500-3000字节物理地址连续的空间)
我试过了定义全局变量,局部变量,或者用malloc都不行。(用malloc大概能申请到1500-3000字节物理地址连续的空间)
|
用户空间应用程序很难申请到大块的物理上连续的空间,连续的最多是一个物理帧。所以,建议你最好做一个小的driver(字符设备即可)来实现这个功能,因为在内核空间(driver里)就有很多方法来申请到物理上连续的空间,你在driver里面申请好之后,将其转化为虚拟地址,然后提供一个ioctl接口来给应用程序申请连续空间使用即可。
事实上,有些系统中就是这么实现的,比如TI DaVinci平台的CMEMK驱动就是一个申请物理上连续空间的driver,因为DSP处理的数据块地址是要求物理上连续的,它没有内存管理器,该驱动就是满足这一需求的。
如果需要这样一个驱动,可以EMAIL给我,我可以给你一个参考: zuohuiwang(AT)163.com!
GOOD LUCK!
事实上,有些系统中就是这么实现的,比如TI DaVinci平台的CMEMK驱动就是一个申请物理上连续空间的driver,因为DSP处理的数据块地址是要求物理上连续的,它没有内存管理器,该驱动就是满足这一需求的。
如果需要这样一个驱动,可以EMAIL给我,我可以给你一个参考: zuohuiwang(AT)163.com!
GOOD LUCK!
|
应用层申请到得都是虚拟地址连续的空间,貌似没法申请长度大于4096的物理地址连续的空间。不过核心倒是可以用 page_alloc 来申请!
|
一般说来,应用程序不能直接请求物理内存而是虚拟内存。虚拟内存只有在通过内核的页故障异常处理才能分配并映射物理内存,而这种映射是以页长度为单位的。
如果有内核模块的帮助,实现起来就比较容易。在内核中也只能通过请求DMA内存才能真正申请到物理连续的内存;然后用remap
的方式将该物理内存直接暴露给用户程序!
如果有内核模块的帮助,实现起来就比较容易。在内核中也只能通过请求DMA内存才能真正申请到物理连续的内存;然后用remap
的方式将该物理内存直接暴露给用户程序!