当前位置: 技术问答>linux和unix
请问启动时如何预留一段连续的RAM空间?
来源: 互联网 发布时间:2016-07-22
本文导语: 我们想开发一个设备驱动,该驱动需要巨大的连续buffer,所以打算在启动的时候就预留一大块连续的空间,由该驱动独占使用。请问linux2.6内核中有没有现成的方式或接口可以实现该目的,还是需要自己用page_alloc预分...
我们想开发一个设备驱动,该驱动需要巨大的连续buffer,所以打算在启动的时候就预留一大块连续的空间,由该驱动独占使用。请问linux2.6内核中有没有现成的方式或接口可以实现该目的,还是需要自己用page_alloc预分配一大块空间(甚至最好是写一个这样的驱动,来管理这块区域)?
谢谢。
谢谢。
|
__get_free_pages(unsigned int __nocast gfp_mask, unsigned int order)
所申请的内存大小由参数order决定,order最大为10,即可以最大申请2的10次方个页面
所以一次可申请到的内存最大为1024*4K,即4M(参见伙伴算法)
若需要大于4M的连续内存,就要申请很多个4M的内存块,这些内存块里面的空间是连续的
但是块与块之间不一定连续,所以要找连在一起的内存块。
我是在系统已经起来了,驱动里面需要很大一块缓冲区时这么做的,不知道是不是符合你的情况
所申请的内存大小由参数order决定,order最大为10,即可以最大申请2的10次方个页面
所以一次可申请到的内存最大为1024*4K,即4M(参见伙伴算法)
若需要大于4M的连续内存,就要申请很多个4M的内存块,这些内存块里面的空间是连续的
但是块与块之间不一定连续,所以要找连在一起的内存块。
我是在系统已经起来了,驱动里面需要很大一块缓冲区时这么做的,不知道是不是符合你的情况
|
你可以通过共享内存申请一个hugetlb页面来实现,接口是
shmget(IPC_PRIVATE, size, SHM_HUGETLB | IPC_CREAT | SHM_R | SHM_W);
你把size参数设为256M,相当于申请了一块连续的256M的共享内存。
SHM_HUGETLB是2.6内核开始支持的hugeTLB功能,可以支持256M的页面。
shmget(IPC_PRIVATE, size, SHM_HUGETLB | IPC_CREAT | SHM_R | SHM_W);
你把size参数设为256M,相当于申请了一块连续的256M的共享内存。
SHM_HUGETLB是2.6内核开始支持的hugeTLB功能,可以支持256M的页面。
|
#define alloc_bootmem(x)
__alloc_bootmem((x), SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS))
#define alloc_bootmem_low(x)
__alloc_bootmem((x), SMP_CACHE_BYTES, 0)
#define alloc_bootmem_pages(x)
__alloc_bootmem((x), PAGE_SIZE, __pa(MAX_DMA_ADDRESS))
#define alloc_bootmem_low_pages(x)
__alloc_bootmem((x), PAGE_SIZE, 0)
__alloc_bootmem((x), SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS))
#define alloc_bootmem_low(x)
__alloc_bootmem((x), SMP_CACHE_BYTES, 0)
#define alloc_bootmem_pages(x)
__alloc_bootmem((x), PAGE_SIZE, __pa(MAX_DMA_ADDRESS))
#define alloc_bootmem_low_pages(x)
__alloc_bootmem((x), PAGE_SIZE, 0)
|
我们系统里也有类似的用法,实现起来也比较简单。
loader想kernel传递cmdline参数的时候加上一个mem=xxxM的参数。
这样kernel就只会使用你指定的大小做其总共的内存进行管理。
而剩下的部分你就可以自由使用了。我们是用来做Switch上DMA的buffer的。
loader想kernel传递cmdline参数的时候加上一个mem=xxxM的参数。
这样kernel就只会使用你指定的大小做其总共的内存进行管理。
而剩下的部分你就可以自由使用了。我们是用来做Switch上DMA的buffer的。