kill_proc和kill_proc_info都是Linux内核提供的API,在VME_Universe驱动中处理中断的时候要用到。原来文件vme_interrupt.c中的相关部分是这样的:
#ifdef ARCH
if (kill_proc_info(handle->notify.siginfo.si_signo,&handle->notify.siginfo,handle->pid) {
#else
if (kill_proc(handle->pid,handle->notify.siginfo.si_signo,(int)&handle->notify.siginfo) {
#endif
printk(KERN_ERR "VME: Error occurred while sending singal to "process %d for interrupt level %d\n",handle->pid,level);
}
这一段在$ make时候会报错说找不到对kill_proc的声明。我自作聪明的解决方式是把#ifdef改成#ifndef,这样条件编译的对象就成了kill_proc_info而不是kill_proc,这样总算能够通过编译,可是会有警告说kill_proc_info未定义。看来这两个函数不是那么清楚就能弄明白的。
查了一下资料,原来kill_proc_info作为内核API在2.6.10版本里就去掉了,这也正是老版本的vme_universe驱动在这个地方并没有条件编译而是直接调用kill_proc_info的原因。至于kill_proc本来是对kill_proc_info的封装,在kill_proc_info不再使用之后就用的这个。可是在2.6.27版本的内核里把kill_proc也给除去,是不是让人很傻眼呢……
于是只好直接动手,先把#ifdef改回去,再直接用kill_pid代替kill_proc,编译,安装……成功!接着加载……不再是FATAL Error,却冒出来一个Segmentation fault。用$ demsg查看,显示的记录有:
VME: Universe device not found
VME: Failure initializing Tundra universe device
BUG: unable to handle kernel NULL pointer dereference at 00000f00
IP: [] free_slave_window+0x2f/0x150 [vme_universe]
*pde: 00000000
Oops: 0000 [#1] SMP
……等等等等。
其实输入$ lsmod的话,也是能显示出vme_universe驱动已被加载。至于什么找不到设备的问题,那是当然的:我还没接上设备呢。我担心的是那个大大的BUG,不知道是不是和所谓Segmentation fault有关?另外,我依然找不到驱动自带的测试程序……
革命尚未成功,同志仍须努力。
赞过:
赞 正在加载……
相关