当前位置: 技术问答>linux和unix
linux驱动里如何分配大于2M的内存空间
来源: 互联网 发布时间:2016-05-04
本文导语: 我用RH9做主机linux usb器件驱动,因为是高速,所以必须一次传完,循环收会出错,因此要开辟2.56M的内存空间,而用__get_free_pages(GFP_KERNEL,9)最多只能分配2M内存,当用__get_free_pages(GFP_KERNEL,10)准备分配4M时出错,从而不...
我用RH9做主机linux usb器件驱动,因为是高速,所以必须一次传完,循环收会出错,因此要开辟2.56M的内存空间,而用__get_free_pages(GFP_KERNEL,9)最多只能分配2M内存,当用__get_free_pages(GFP_KERNEL,10)准备分配4M时出错,从而不能分配2M以上内存,不知如何解决,请教高手!谢谢
|
那你看看你内核中MAX_ORDER这个宏定义是多少(include/linux/mmzone.h)!
在2.6.10的kernel中,是这样定义的
看看你的多少,贴出来,你可以试着修改该宏定义大一些,满足你的需要!
Good Luck!
在2.6.10的kernel中,是这样定义的
#ifndef CONFIG_FORCE_MAX_ZONEORDER
#define MAX_ORDER 11
#else
#define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER
#endif
看看你的多少,贴出来,你可以试着修改该宏定义大一些,满足你的需要!
Good Luck!
|
可以考虑下vmalloc()函数,不过该函数分配的内存物理上是不连续的,所以不能用来做DMA之类的操作!
具体使用,自己看内核的例子!
另外对于__get_free_pages()能分配的最大的内存,是可以通过重新配置,编译内核来扩大的! 具体配置选项好像是
CONFIG_FORCE_MAX_ZONEORDER!如果内核是你自己可以控制的,建议重编译内核,然后用__get_free_pages()这个函数!
Good Luck!
具体使用,自己看内核的例子!
另外对于__get_free_pages()能分配的最大的内存,是可以通过重新配置,编译内核来扩大的! 具体配置选项好像是
CONFIG_FORCE_MAX_ZONEORDER!如果内核是你自己可以控制的,建议重编译内核,然后用__get_free_pages()这个函数!
Good Luck!
|
2.4内核,order的最大值是9.
2.6内核,order的最大值是10或11,依赖于平台.
2.6内核,order的最大值是10或11,依赖于平台.
|
要做DMA操作吗? 如果不是的话,可以用vmalloc
|
linux 技术交流群 8709932 欢迎大家的加入
|
up
|
另外,vmalloc你试过没有,也许可以满足你的需求!
|
因此要开辟2.56M的内存空间
=============================
是你自己写驱动,还是移植别人的?一定要那么多page frames吗?
=============================
是你自己写驱动,还是移植别人的?一定要那么多page frames吗?