uClinux系统内核2.6,使用GFP_KERNEL | GFP_DMA分配内存失败!

月吻长河 2006-05-01 11:49:24
unsigned char *p;
p = kmalloc(512,GFP_KERNEL | GFP_DMA);
分配内存失败,

但是,只用GFP_KERNEL就可以分配成功
请问这是什么问题?
...全文
952 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tb01412 2006-05-08
  • 打赏
  • 举报
回复
分析LZ的需求:
1.要使用物理地址
2.要将DMA区的CAHCE关闭
3.对这个区的数据相关操作不能优化

对于第一点,UCLINUX可以达到
对于第二点,GNU/LINUX可以用GFP_DMA来实现
对于第三点,无论是哪种,都需要调用内核函数来实现

所以关键是第二点内容,也就是CACHE的控制,至于为何用GFP_DMA参数失败,我猜想是不是可以在内核配置中有相关选项来控制的呢???实在是没办法,在内核模块中显示地操作协处理器,以控制开关某段物理内存地址的CACHE,也就是在调用kmalloc之后写几条汇编语句来关闭相关地址段的CACHE,在调用kfree之前显示关闭其相关地址的CACHE

一般说来,在没有MMU的CPU中,是没有CACHE功能的,LZ可能是在有MMU的CPU中使用UCLINUX,而且还想使用其中的CACHE功能,由于UCLINUX最初设计的想法是建立在没有MMU的CPU上的,所以根本就没有考虑到LZ有这样奇怪的需求,对于这样的需求,内核最初没有想到,现在LZ却要使用,就只有使用自己提供的解决办法来做了,以上观点,纯属个人猜想,仅供参考,被误导了之后不要来怪我哈
tb01412 2006-05-08
  • 打赏
  • 举报
回复
既然都支持DMA,为何会分配失败呢?只用GFP_DMA试一下?
无法帮LZ想出好的办法了
月吻长河 2006-05-06
  • 打赏
  • 举报
回复
to tb01412(tb):
uClinux是支持DMA的
这个问题和优化没有关系
tb01412 2006-05-05
  • 打赏
  • 举报
回复
如果UCLINUX不支持DMA的话,我就不晓得还有什么办法可以满足你的要求了
不过我好像在LINUX设备驱动程序中看到过在驱动中显示地调用一些函数可以禁止优化,CACHE之类的,具体我也记不得在哪一页了
月吻长河 2006-05-02
  • 打赏
  • 举报
回复
楼上兄弟理解得很对!
我的有1MB的SDRMA是没有进行Cache映射的。
我是想给DMA分配内存的时候从这1MB中分配,但是不知道GFP_DMA行不行,我试了使用GFP_DMA总是分配失败。
请问还有其他办法吗?
否则没有其他办法解决Cache一致性问题我就只能不用Data Cache了,但是这样系统性能会下降!
tb01412 2006-05-01
  • 打赏
  • 举报
回复
不好意思,不能解决LZ的意思,不过还是顺便说几句:
uClinux好像不支持虚拟地址的概念吧?直接用GFP_KERNEL参数,其结果与GFP_DMA相差不大,只不过GFP_DMA区获得的地址是低于16M的,不过在嵌入式芯片领域,DMA区并没有限定在16M地址之内,唯一要注意的应该是关于cache的处理,DMA是不能带cache的

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧