一、前言
在开发中经常会遇到运行内存虚标的情况,例如1G读出来是900多MB,但是客户要求第三方软件需要读出1G,这个时候可以在软件端做处理
二、核心代码处理路径
longan/kernel/linux-5.4/mm/page_alloc.c
三、调试与处理
void si_meminfo(struct sysinfo *val)
{
val->totalram = totalram_pages();
printk("toalram = %d \n",totalram_pages());//在这里打印出实际值*4便为存储大小
val->sharedram = global_node_page_state(NR_SHMEM);
val->freeram = global_zone_page_state(NR_FREE_PAGES);
val->bufferram = nr_blockdev_pages();
val->totalhigh = totalhigh_pages;
val->freehigh = nr_free_highpages();
val->mem_unit = PAGE_SIZE;
}
打印出来的值进行判断,例如若大于1G小于2G,则显示2G,代码处理如下:
unsigned long get_total_virmem(void) {
//1GB=1048576KB temp=1048576KB/4-262144KB 2 = 2097152KB、 temp-2097152KB/4-524288KB.....786432-----n*262144
unsigned long one_GB_value = 262144;
unsigned long mem_group[] = (1*one_GB_value,2*one_GB_value,3*one_GB_value,4*one_GB_value,5*one_GB_value,6*one_GB_value,7*one_GB_value,8*one_GB_value);
int i;
for (i=0;i<sizeof(mem_group)/sizeof(mem_group[0]);i++){
if (totalram_pages() <= mem_group[i])
break;
if (i == sizeof(mem_group)/sizeof(mem_group[0])-1)
i--;
}
//printk("zwh test mem group = %d \n",mem_group[i]);
return mem_group[i];
}
将get_total_virmem()替换totalram_pages(),就能得出矫正后的值
四、总结
虽然这是在全志平台所作的修改,但在其他平台依旧行得通。