之前曾写过一个关于用gcc在aix中做内核扩展的博文,当时的信息输出用uprintf,目的只是简单验证gcc做个内核扩展的可行性,虽然bsdlog貌似当时试过也可以,但是觉得相对uprintf,步骤要繁琐一点。现在实际的项目当中,发现uprintf有时候不可行,事实上目前我们遇到的问题是bsdlog也不可行,不过至少现在用bsdlog要稍微有点驾轻就熟的意思了。

1. 改写/etc/syslog.conf,在后面加了这么一行:
    kern.info /tmp/debug.log
2. 然后用touch命令生成debug.log作为kernel info级别消息的输出
    bash-3.2#touch /tmp/debug.log
3. 重启一下syslogd这个daemon, 用ps命令查找syslogd的pid:
    bash-3.2# ps -All | grep syslogd
  240001 A   0 3932306 3211424   0  60 20 800360590   792               -  0:01 syslogd
  
    上述命令的输出表明syslogd的
pid=3932306
      当然也可以直接cat /etc/syslog.pid这个文件来获取上述pid信息
4. 重启syslogd:
    bash-3.2# kill -hup 3932306
    注:如果后续删除掉/tmp/debug.log这个文件,然后再用touch重新生成,那么必须重启syslogd.

5. 现在内核扩展的代码中使用bsdlog就可以把消息输出到/tmp/debug.log文件中了,比如下面的代码片段:
   
  1.         } else if (error == EEXIST) {
  2.             bsdlog(LOG_INFO | LOG_KERN, "error = EEXIST\n");
  3.         } else if (error == ENOMEM) {
  4.             bsdlog(LOG_INFO | LOG_KERN, "error = ENOMEM\n");
  5.         } else if (error == EINVAL) {
  6.             bsdlog(LOG_INFO | LOG_KERN, "error = EINVAL\n");
  7.         }
内核模块加载后,查看/tmp/debug.log文件:
bash-3.2# cat /tmp/debug.log
Dec 19 01:35:54 dennis-test kern:info unix: error = EINVAL

不过我们目前遇到的问题上边的bsdlog也不管用,简单描述一下:
通过kernel service提供的inbound_fw,后者相当与aix中tcp/ip协议栈中的一个hook,当有ip包进入ip层时,内核在inboud_fw不为空的情形下调用它所指向的函数,所以类似一个kernel hook,我们将inbond_fw指向我们自己实现的函数,在那个函数中使用bsdlog无效,虽然我们可以确定inbound_fw所指向的函数被调用了。目前这个问题无解。内核里面的调试就是这样让人抓狂...

update: udp will be used by syslog to send msg? udp->ip... reenter??
又或者:A kernel process can use a larger set of system calls than a user process in kernel mode... Kernel routines running under user-mode processes cannot directly use a system call having parameters passed by reference...





02-05 18:20