昨天对watchdog的代码浅显的看了一下,今天又有进一步的学习了,在看到我昨天处理了关于手机重启的问题我以为是WATCHDOG导致的,但是在LOG 中并没有发现WATCHDOG TIMEOUT,所以这个应该不是这个问题导致的,但我还不是知道到底是什么问题导致的重启。
今天就来讲讲我看到的关于别人watchdogd.c(d->demon)上所打的patch,主要就是为了当在out of memery 时候,把watchdog相关的页换出去,而导致了????watchdog超时所导致的IPINC,在log中的thread的中可以看到在watchdog下 会有
<4>[65286.320990] [<c130c119>] handle_pte_fault+0x79/0xa60
<4>[65286.320999] [<c130cb86>] handle_mm_fault+0x86/0xc0
<4>[65286.321007] [<c1227f50>] ? pgtable_bad+0x130/0x130
<4>[65286.321016] [<c1228064>] do_page_fault+0x114/0x3c0
从上面可以看出watchdog进程的页被换出来了,没能找到,所以必需把这个进程的页锁起来,这个只要在相应进程中用到系统调用,syscall(__NR_mlockall,MCL_CURRENT | MCL_FUTURE),mlockall的函数就是底层实现页表驻留的,防止被换出去。
说道系统调用,这里就不得不说点东西了,在用户空间想进入内核空间访问的话,就智能利用系统调用了,在系统调用在我看来就是调用了内核中的某个函数罢了,它就是利用了一张表格,而宏_NR_mlockall,就相当于是这张表格的下标数组,指向的就是内核中的真正的函数名,如 #define SYS_mlockall __NR_mlockall,呵呵,这个其实就是定义了指向的就是系统中的mlockall,接下来就找mlockall在哪里实现了,大爷的啊,我在代码里竟然只看到了extern int mlockall (int __flags) __THROW,的定义,和一些注释说明,呀呀的啊,这个cscope不是坑爹的吧,真就只能找c,和c++的代码中的啊,晕死,现在不知的怎么下去了,呵呵,接下来的应该是汇编的实现,但是能找到其他函数的汇编实现的地方,但是这个确不能看到,哎,看来也智能暂时休息休息了。对了,在看汇编的时候,又不同架构下的汇编实现,所以所用的指令也是不一样的,用:tnext一个一个的往下看知道了。