__get_free_pages
时间: 2023-07-31 07:07:36 浏览: 469
__get_free_pages是Linux内核提供的一种内存分配函数,用于在物理地址连续的情况下分配多个页框(page frame)。
它的函数原型如下:
```
unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order);
```
其中,gfp_mask是内存分配标志,用于指定内存分配的一些属性,例如是否可以阻塞、是否可以回收页面等等。order则指定需要分配的页框数量,它的值为2的幂次方,表示需要分配2的order次方个页框。
__get_free_pages函数会通过buddy系统来分配连续的物理页面,并返回这些页面的首地址。需要注意的是,__get_free_pages函数分配的内存需要手动释放,可以使用free_pages函数来释放分配的页面。此外,__get_free_pages函数仅适用于内核态,不能在用户态中使用。
相关问题
__get_free_pages睡眠
__get_free_pages函数在分配内存的过程中可能会引起睡眠,具体原因如下:
当需要分配的页框数量比较多时,__get_free_pages函数可能无法找到足够连续的物理页面,此时就需要等待其他进程释放一些物理页面,或者等待内核通过页面置换算法将一些页面换出到磁盘上,以便腾出足够的物理页面。这个等待的过程就可能引起睡眠,使得当前进程进入睡眠状态,等待内核将页面腾出来后再继续执行。
需要注意的是,__get_free_pages函数的睡眠行为可能会对系统的性能产生影响,因此在编写内核代码时应该尽可能避免使用它,而选择更加高效的内存分配函数,例如kmalloc或者kmem_cache_alloc等。
不能保证物理空间上连续的内存分配函数是( ) A __get_free_pages B kmalloc C vmalloc D
A __get_free_pages 是不能保证物理空间上连续的内存分配函数。__get_free_pages函数用于从物理内存中分配指定数量的连续页面,但并不能保证返回的页面在物理地址上是连续的。这是因为系统中的内存分配和回收是动态的,可能会导致页面在物理地址上分散分布。而kmalloc函数和vmalloc函数则用于分配虚拟地址空间上的内存,不涉及物理地址的连续性。因此,正确答案是A __get_free_pages。
阅读全文