<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>不然你要我怎么样 &#187; kmalloc</title>
	<atom:link href="http://www.xiangmocheng.com/tag/kmalloc/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.xiangmocheng.com</link>
	<description>彪悍的代码不需要注释</description>
	<lastBuildDate>Wed, 30 Nov 2011 11:47:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>kmalloc vmalloc malloc区别</title>
		<link>http://www.xiangmocheng.com/2009/09/kmalloc-vmalloc-malloc-difference/</link>
		<comments>http://www.xiangmocheng.com/2009/09/kmalloc-vmalloc-malloc-difference/#comments</comments>
		<pubDate>Wed, 09 Sep 2009 06:23:55 +0000</pubDate>
		<dc:creator>xiangmocheng</dc:creator>
				<category><![CDATA[Embedded]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[kmalloc]]></category>
		<category><![CDATA[malloc]]></category>
		<category><![CDATA[vmalloc]]></category>

		<guid isPermaLink="false">http://xiangmocheng.yo2.cn/articles/kmalloc-vmalloc-malloc%e5%8c%ba%e5%88%ab.html</guid>
		<description><![CDATA[kmalloc()和vmalloc()介绍 kmalloc() 用于申请较小的、连续的物理内存 1. 以字节为单位进行分配，在&#60;linux/slab.h&#62;中 2. void *kmalloc(size_t size, int flags) 分配的内存物理地址上连续，虚拟地址上自然连续 3. gfp_mask标志：什么时候使用哪种标志？如下： &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- 情形                                                  相应标志 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- 进程上下文，可以睡眠                  GFP_KERNEL 进程上下文，不可以睡眠     [...]]]></description>
			<content:encoded><![CDATA[<p><strong>kmalloc()和vmalloc()介绍</strong></p>
<p><span style="color: #ff0000;">kmalloc()</span></p>
<p>用于申请较小的、连续的物理内存</p>
<p>1. 以字节为单位进行分配，在&lt;linux/slab.h&gt;中</p>
<p>2. void *kmalloc(size_t size, int flags) 分配的内存物理地址上连续，虚拟地址上自然连续</p>
<p>3. gfp_mask标志：什么时候使用哪种标志？如下：</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
情形                                                  相应标志<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
进程上下文，可以睡眠                  GFP_KERNEL<br />
进程上下文，不可以睡眠               GFP_ATOMIC<br />
中断处理程序                            GFP_ATOMIC<br />
软中断                                    GFP_ATOMIC<br />
Tasklet                                  GFP_ATOMIC<br />
用于DMA的内存，可以睡眠            GFP_DMA | GFP_KERNEL<br />
用于DMA的内存，不可以睡眠         GFP_DMA | GFP_ATOMIC<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>4. void kfree(const void *ptr)</p>
<p>释放由kmalloc()分配出来的内存块<br />
<span id="more-69429"></span><br />
<span style="color: #ff0000;">vmalloc()</span></p>
<p>用于申请较大的内存空间，虚拟内存是连续的</p>
<p>1. 以字节为单位进行分配，在&lt;linux/vmalloc.h&gt;中</p>
<p>2. void *vmalloc(unsigned long size) 分配的内存虚拟地址上连续，物理地址不连续</p>
<p>3. 一般情况下，只有硬件设备才需要物理地址连续的内存，因为硬件设备往往存在于MMU之外，根本不了解虚拟地址；但为了性能上的考虑，内核中一般使用kmalloc()，而只有在需要获得大块内存时才使用vmalloc()，例如当模块被动态加载到内核当中时，就把模块装载到由vmalloc()分配的内存上。</p>
<p>4.void vfree(void *addr)，这个函数可以睡眠，因此不能从中断上下文调用。</p>
<p><strong>malloc(), vmalloc()和kmalloc()区别</strong></p>
<p>[*]kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存</p>
<p>[*]kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续,malloc不保证任何东西(这点是自己猜测的,不一定正确)</p>
<p>[*]kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大</p>
<p>[*]内存只有在要被DMA访问的时候才需要物理上连续</p>
<p>[*]vmalloc比kmalloc要慢
<div style="margin-top: 10px">
<p><strong>转载请注明：</strong> 转载自<a href="http://www.xiangmocheng.com/">不然你要我怎么样</a></t>        </br><strong>本文链接地址:</strong> <a href="http://www.xiangmocheng.com/2009/09/kmalloc-vmalloc-malloc-difference/">kmalloc vmalloc malloc区别</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.xiangmocheng.com/2009/09/kmalloc-vmalloc-malloc-difference/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

