平台信息:
内核:linux3.0.68
系统:android/android5.1
平台:s5p4418
作者:庄泽彬(欢迎转载,请注明作者)
邮箱:2760715357@qq.com
摘要:调整android系统的init.rc文件中开启服务的oom的值,使之可以被杀死。
首先:我们来做一下实验,在android系统的init.rc文件中添加一个服务。这个服务只做一件事情不断的申请内存。
oom.c的源码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 #include <sys/stat.h> 6 #include <sys/types.h> 7 8 #include <fcntl.h> /* Definition of AT_* constants */ 9 #include <sys/stat.h> 10 11 12 13 #define LOG_TAG "MyLed_jni" 14 #include <utils/Log.h> 15 #include <android/log.h> /* liblog */ 16 17 18 int main(void) 19 { 20 int i = 0; 21 char *buf; 2223 fprintf(stderr,"--------------------------- success --------------------------------> "); 30 sleep(40); 31 #if 1 32 for(i = 0;i < 200;i ++){ 33 fprintf(stderr,"%d: oom test ",i); 34 buf = malloc(0xffffff); 35 bzero(buf,0xffffff); 36 if(buf == NULL){ 37 printf("--------------------------- fail -------------------------------> ");49 }else{ 50 printf("--------------------------- success --------------------------------> "); 51 } 52 } 53 while(1); 54 #endif 61 return 0; 62 }
在android系统启动之后开启服务:start oom,
系统会打印出这样的调试信息:] Kernel panic - not syncing: Out of memory and no killable processes...。由于找不到可杀死的进程,导致系统重启,为了不让系统重启,我们需要修改进程的oom_adj的值。
1、 start oom 开启服务
2、ps 查看服务的pid号为1783
root 1783 1 9244 396 c0062998 b6eb1324 S /system/bin/oom
3、root@u4209:/ # cat /proc/1783/oom_adj
-17
-17表示服务不可被杀死。因此我们需要改变他的值为普通的进程的等级为0.这样oom服务即可被杀死不会发出kernel panic。导致系统重启.
改变oom服务的oom_adj的方法:
1、使用命令的方式:
echo 0 > /proc/$PID/oom_adj //$PID改成服务的pid号
echo f > /proc/sysrq-trigger //调用oom_kill杀死内存的hog进程
这样设置之后oom服务在申请内存过多的时候就不会导致系统重启,而是将进程杀死。