reserve_bootmem(addr,size,flag)
这个函数的三个参数,addr是你要保留的地址,size就是要保留的大小,flag是标志位,要来确定是否检查你要保留的空间是否已经被保留了,它可以设置为两个值,BOOTMEM_DEFAULT和BOOTMEM_EXCLUSIVE,前者就是总是会返回0(也就是保留成功),而后者则会检查你所要保留的空间是否已经被保留了,若已经被保留了,则它返回失败(负数)
那么这个函数一般放在哪里使用过了,我们建议放到内核init/main.c中,在页表的建立之前进行保留,比如我们下面的代码,放在main中的start_kernel函数中,我们的内核是2.6.32
asmlinkage void __init start_kernel(void)
{
……
……
trap_init()
if(reserve_bootmem(0x41000000,0x100000,BOOTMEM_EXCLUSIVE) != 0){
printk("reserve fail----\n")
}
printk("we reserve boot meme of 0x41000000 for gps---------------------------------\n")
mm_init()
……
……
}
这样就保留了一个起始地址为0x41000000,大小为1M的空间
您在编程的时候出现的这个问题吗?一般这个问题出现是因为程序当中分配内存过大,或者内存不够,内存条坏死导致的。可以先查看是不是内存有问题,有问题重新换一根内存,或者查看程序当中是否分配了过多的内存,如果过多,减少内存的分配,还可以查看是否有程序持续内存泄露,导致内存分配不合理。1, 你是说内存不够用么?一般很少有这个问题,因为linux本身对内存要求并不高。增加内存,并重新给你的 swap 分下区吧,设置为你物理内存的两倍;2,你是想改 linux kernel 和 user space 的 1:3 分配比例么?可以使用某些补丁来改成 2:2 之类的,2.6 的内核里面现在应该有选项可以设置的,让你在编译内核的时候,即可完成设置;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)