Chinaunix首页 | 论坛 | 博客
  • 博客访问: 591831
  • 博文数量: 50
  • 博客积分: 4764
  • 博客等级: 上校
  • 技术积分: 597
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-18 09:00
个人简介

资深IT码农,擅长Linux、C/C++、bash

文章分类

全部博文(50)

文章存档

2015年(17)

2014年(2)

2011年(7)

2010年(4)

2009年(20)

分类: LINUX

2010-05-26 17:36:54

find_task_by_vpid undefined 问题

冷胜魁(Seaquester)
lengshengkui@gmail.com
2010-5-26

今天在build一个kernel module的时候,遇到一个问题。

编译的时候出现下面的警告:
WARNING: "find_task_by_vpid" [/home/work/try/va2pa/va2pa.ko] undefined!

insmod的时候失败,错误信息如下:
insmod: error inserting 'va2pa.ko': -1 Unknown symbol in module

查看dmesg信息发现:
[ 7201.843077] va2pa: Unknown symbol find_task_by_vpid

这表示模块中使用的 find_task_by_vpid 函数没有被kernel export。

很奇怪,因为这个module是来自于别人写的一段代码,里面使用了find_task_by_pid。然后,有注释说,在Linux Kernel 2.6.24以后,应该使用 find_task_by_vpid。

我在2.6.18和2.6.26上面测试过,是OK的。

这次使用的kernel是2.6.34,结果出现了上面的错误。

google了一下,发现在Linux Kernel 2.6.30之后(确切的说是从2.6.31开始),find_task_by_vpid没有被export(Kernel 里面还有定义该函数,但是没有导出symbol,所以 driver 里面不能再使用)。具体信息可以参考:


解决的方法是使用 pid_task 来替代。
查了一下pid_task的定义,发现它的参数类型与find_task_by_vpid不一样,需要使用find_vpid来转换一下。

#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
    if (!(pcb_tmp = find_task_by_pid(pid))) {
#elif LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)
    if (!(pcb_tmp = find_task_by_vpid(pid))) {
#else
    if (!(pcb_tmp = pid_task(find_vpid(pid), PIDTYPE_PID))) {
#endif

测试了一下,可以正常工作。
阅读(10572) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

seaquester2011-04-13 12:56:44

zc0074200: 在2.6.38内核中,find_vpid会报unkonwn symbol的错误,我也是在module中写的这样的代码,求问为什么。include <linux/pid.h>已经加入.....
没有测试过2.6.38,所以不知道kernel API是否有变化,建议检查一下find_vpid有没有导出。

zc00742002011-04-11 15:26:41

在2.6.38内核中,find_vpid会报unkonwn symbol的错误,我也是在module中写的这样的代码,求问为什么。include <linux/pid.h>已经加入