回复: 回复: LINUX中如何分配按N字节对齐的内存

216 views
Skip to first unread message

Yan, Ze

unread,
Sep 8, 2010, 3:55:48 AM9/8/10
to 罗辉, jiehunt, Adam Jiang, xtfeng, linux-kernel
多谢各位的回复。


To 罗辉


alloc_pages分配的最小单位是页,在需要大量内存的时候是个好的解决办法,但是在不需要大内存空间的条件下,或者需求空间不确定的(可能有时候需要较大有时候需求很小)时候会造成浪费。这个是我的理解。


目前的情况是,需要按64字节对齐,而且每次DMA的数据,从用户数据上来看,数据长度不确定,还是以低于4K的情况占绝大多数。所以使用alloc_pages并不是特别理想。


To Adam


那个算法本身没有问题,我的concern只是:
#1 对于某些场景而言,会有一些浪费,比如分配1字节的buffer但是要求64字节,那么浪费的字节数为63字节。
~ 不过这种浪费
#2 需要额外多保存一个指针,那么需要在数据结构里添加,对于想做upsteam的code,似乎不是很合适的改法。如果能有一个更common的改法就更好了。但毫无疑问也是一个解决方法。


不知道我是否把我的意思表达的足够清楚。:)


对于http://www.linux-mips.org/archives/linux-mips/2004-10/msg00187.html,那个thread没完全看
这个的思路似乎是直接改slab中关于alignment的设定,因为kmalloc其实对于小于8K(?)的空间是会从slab去拿。
但是改slab会影响整个OS,而且对齐字节数越高,slab的效果就越差。 而且本意也只是针对个别设备的特殊要求。


To Xiaotian Feng


kmem_cache 系列函数其实类似于另外一套DMA 分配的方式。


>struct dma_pool *dma_pool_create(const char *name, struct device *dev,
> size_t size, size_t align, size_t boundary)



不想使用这个dma_pool的原因是,每次DMA传输的数据都是不定长度的,而Pool建立会要求size限制,为每次传输create/alloc/destory dma_pool 感觉也会有不小的开销。


谢谢大家的回复,这个问题我清楚多了,之后我会稍微总结下发出来的。


Ze




谢谢t


------------------ 原始邮件 ------------------
发件人: "罗辉"<luohu...@gmail.com>;
发送时间: 2010年9月8日(星期三) 中午12:34
收件人: "jiehunt"<jiehu...@gmail.com>;
抄送: "linux-kernel"<linux-...@zh-kernel.org>;
主题: Re: 回复: LINUX中如何分配按N字节对齐的内存


我测试过用kmalloc()分配的内存最大为128K,这个结果可能是平台相关的,一
般dma内存分配最终都会调用alloc_pages()函数

于 2010年09月08日 12:31, jiehunt 写道:
> 感觉这个方法可行,alloc_pages应该分配的就是连续的页面
>
> 在 2010年9月8日 下午1:26,罗辉 <luohu...@gmail.com
> <mailto:luohu...@gmail.com>>写道:
>
> 用 alloc_pages()函数就可以分配页对齐的内存,一般是4k、8k、16k字节
> 对齐等
>
> 于 2010年09月08日 12:14, Yan, Ze 写道:
>
> 请问怎么写这个宏,麻烦给个思路就行了。 谢谢
>
>
> Ze
>
>
> ------------------ 原始邮件 ------------------
> 发件人: "Adam Jiang"<jiang...@gmail.com
> <mailto:jiang...@gmail.com>>;
> 发送时间: 2010年9月8日(星期三) 中午12:05
> 收件人: "刘知言"<lzy...@gmail.com <mailto:lzy...@gmail.com>>;
> 抄送: "Yan, Ze"<5412...@qq.com <mailto:5412...@qq.com>>;
> "linux-kernel"<linux-...@zh-kernel.org
> <mailto:linux-...@zh-kernel.org>>;
> 主题: Re: LINUX中如何分配按N字节对齐的内存
>
>
> On Wed, Sep 08, 2010 at 11:50:44AM +0800, 刘知言 wrote:
>
> 写个宏就搞定了
>
> 如何写?用GCC的__attribute__宏么?
>
> /阿当
>
>
> 2010/9/8 Yan, Ze<5412...@qq.com <mailto:5412...@qq.com>>:
>
> 限制于总线能力和跨边界导致的性能下降问题,所以DMA需求
> 按照一定字节对齐的内存。
>
>
> Kmalloc似乎是分配不了这样的内存,求教大家,有没有好办法。
>
>
> Ze
> _______________________________________________
> Linux 内核开发中文邮件列表
> Linux-...@zh-kernel.org
> <mailto:Linux-...@zh-kernel.org>
> http://zh-kernel.org/mailman/listinfo/linux-kernel
> Linux 内核开发中文社区: http://zh-kernel.org
>
> _______________________________________________
> Linux 内核开发中文邮件列表
> Linux-...@zh-kernel.org <mailto:Linux-...@zh-kernel.org>
> http://zh-kernel.org/mailman/listinfo/linux-kernel
> Linux 内核开发中文社区: http://zh-kernel.org
>
> _______________________________________________
> Linux 内核开发中文邮件列表
> Linux-...@zh-kernel.org <mailto:Linux-...@zh-kernel.org>
> http://zh-kernel.org/mailman/listinfo/linux-kernel
> Linux 内核开发中文社区: http://zh-kernel.org
>
>
> _______________________________________________
> Linux 内核开发中文邮件列表
> Linux-...@zh-kernel.org <mailto:Linux-...@zh-kernel.org>
> http://zh-kernel.org/mailman/listinfo/linux-kernel
> Linux 内核开发中文社区: http://zh-kernel.org
>
>

_______________________________________________
Linux 内核开发中文邮件列表
Linux-...@zh-kernel.org
http://zh-kernel.org/mailman/listinfo/linux-kernel
Linux 内核开发中文社区: http://zh-kernel.org
_______________________________________________
Linux 内核开发中文邮件列表
Linux-...@zh-kernel.org
http://zh-kernel.org/mailman/listinfo/linux-kernel
Linux 内核开发中文社区: http://zh-kernel.org

Adam Jiang

unread,
Sep 8, 2010, 6:08:58 AM9/8/10
to Yan, Ze, linux-kernel
On Wed, Sep 08, 2010 at 03:55:48PM +0800, Yan, Ze wrote:
> To Adam
>
> 那个算法本身没有问题,我的concern只是:
> #1 对于某些场景而言,会有一些浪费,比如分配1字节的buffer但是要求64字节
> ,那么浪费的字节数为63字节。~ 不过这种浪费
> #2 需要额外多保存一个指针,那么需要在数据结构里添加,对于想做upsteam的
> code,似乎不是很合适的改法。如果能有一个更common的改法就更好了。但毫无
> 疑问也是一个解决方法。
>
>
> 不知道我是否把我的意思表达的足够清楚。:)

我理解你的意思了。

> 对于


> http://www.linux-mips.org/archives/linux-mips/2004-10/msg00187.html
> 那个thread没完全看这个的思路似乎是直接改slab中关于alignment的设定,因
> 为kmalloc其实对于小于8K(?)的空间是会从slab去拿。但是改slab会影响>
> 整个OS,而且对齐字节数越高,slab的效果就越差。 而且本意也只是针对个别
> 设备的特殊要求。

> 不想使用这个dma_pool的原因是,每次DMA传输的数据都是不定长度的,而Pool
> 建立会要求size限制,为每次传输create/alloc/destory dma_pool 感觉也会有
> 不小的开销。

也就是说,你面临的问题是,如何为大小不一的传输数据申请DMA pool,不知道这
个说法对否?如果是这样,你仍然可以使用dma_pool也就是DMA-API来做这件事情
,不过,你可能需要freelist算法来申请不同大小的pool来适应你的需求。当然,
如果这种内存申请的量如果不大的话,用freelist就有些大材小用了。

前面发送的那个thread说的意思是,kmalloc返回地址无法保证对齐,而对齐一般
都用于DMA的情境中,所以,关于对齐的内存申请方法都用DMA-API来管理了。所以
他建议直接使用DMA-API而不是通过kmalloc来申请用以DMA的内存。

期待看到你的解决方法。

/阿当

Reply all
Reply to author
Forward
0 new messages