<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:微软雅黑
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>
Hi&nbsp;:<BR>&nbsp;<BR>&nbsp;&nbsp; you can find out the meaning in vmalloc.c, function vmalloc().<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;vmalloc accept only one parameter, the size of memory that you want to allocate.<BR>&nbsp;&nbsp; this function will return the virtual address which you can use to read/write data inside it.<BR>&nbsp;&nbsp; vmalloc hides some implementation details about real memory allocation, for example: the virtual address that<BR>returned from vmalloc() function is continuous, but physical memory can not continuous. <BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp; vmalloc() will first call function <font color="#ff0000">alloc_vmap_area</font>(), which you mentioned before, this function will occupy a continuous<BR>virtuall address space in VMALLOC region, note that it only occupies virtual address space, no physical memory are mapped to<BR>these virtual address at this moment. so if you operate at this virtual address as you did before, it is a bug! <BR>&nbsp;&nbsp;&nbsp; vmalloc() then call function __vmalloc_area_node(), which will find out enough non-continuous physical memory, then modify<BR>PTEs of current task, map the virtual address to real physical memory. after this, you can operate at the address returned by<BR>alloc_vmap_area(). the example code you did lacks this action, you can try to add this and test again.<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp; i suggest that you use kmalloc() and vmalloc() directly. if you want to allocate small and physical continuous memory, use kmalloc().<BR>if you want to allocate very large(e.g. 10MB) and physical non-continuous memory, use vmalloc().<BR>&nbsp;<BR>&nbsp;<BR>Best Regards<br>&nbsp;<BR><div><div id="SkyDrivePlaceholder"></div><hr id="stopSpelling">Date: Wed, 18 Apr 2012 18:00:03 +0800<br>Subject: Re: how to use the memory allocated in kernel?<br>From: summerxyt@gmail.com<br>To: dhylands@gmail.com<br>CC: kernelnewbies@kernelnewbies.org<br><br>Hi Dave,<br><br>Thanks for reply. My English is not very good, and so I want to ask about a term:map. Does map mean that create a relationship between the virtual space and physical memory?<br><br>Thanks again!<br><br><div class="ecxgmail_quote">
在 2012年4月18日 下午4:17,Dave Hylands <span dir="ltr">&lt;<a href="mailto:dhylands@gmail.com">dhylands@gmail.com</a>&gt;</span>写道:<br><blockquote style="padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid;" class="ecxgmail_quote">
Hi ,<br>
<div><div class="h5"><br>
On Wed, Apr 18, 2012 at 12:44 AM, 夏业添 &lt;<a href="mailto:summerxyt@gmail.com">summerxyt@gmail.com</a>&gt; wrote:<br>
&gt; Hi everyone,<br>
&gt;<br>
&gt; there are some functions can alloc memory in kernel, but it seems that I<br>
&gt; cannot use it directly. Here is my code:<br>
&gt;<br>
&gt; static int mytest_vm(){<br>
&gt;<br>
&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct vm_struct *v_start;<br>
&gt;<br>
&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v_start=alloc_vm_area(PAGE_SIZE,NULL); //the kernel api has changed,<br>
&gt; I don't understand why there is a second parameter<br>
&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(v_start==NULL){<br>
&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printk("cannot alloc page\n");<br>
&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>
&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&gt;<br>
&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sprintf((char *)v_start-&gt;addr,"this is a test.\n");<br>
&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printk("after sprintk:%s",(char *)v_start-&gt;addr);<br>
&gt;<br>
&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free_vm_area(v_start);<br>
&gt;<br>
&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>
&gt; }<br>
&gt; module_init(mytest_vm);<br>
&gt;<br>
&gt; but it just got a kernel Oops. Can anyone explain this to me? Thanks very<br>
&gt; much!<br>
<br>
</div></div>If my understanding of things is correct, this just allocates virtual<br>
space. That virtual space isn't backed by any physical pages.<br>
<br>
The normal kernel allocators are things like kmalloc and vmalloc.<br>
<span class="ecxHOEnZb"><font color="#888888"><br>
--<br>
Dave Hylands<br>
Shuswap, BC, Canada<br>
<a href="http://www.davehylands.com" target="_blank">http://www.davehylands.com</a><br>
</font></span></blockquote></div><br>
<br>_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</div>                                               </div></body>
</html>