从pid转换至task_struct
2016-03-11 23:08
1061 查看
转自: http://blog.chinaunix.net/uid-20644632-id-68049.html
今天在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 里面不能再使用)。具体信息可以参考:
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=17f98dcf6010a1cfd25d179fd0ce77d3dc2685c3
解决的方法是使用 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
测试了一下,可以正常工作。
今天在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 里面不能再使用)。具体信息可以参考:
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=17f98dcf6010a1cfd25d179fd0ce77d3dc2685c3
解决的方法是使用 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
测试了一下,可以正常工作。
相关文章推荐
- 在linux系统下 第二个ide通道的硬盘被标识为什么?
- 关于shell局部变量和全局变量
- 递归调用
- 【POJ3195】Candies(差分约束系统)
- 263. Ugly Number
- 链队列简单应用将输入的句子输出
- 用Linux/Unix命令把十六进制转换成十进制(转)
- hud 1465、2049、2045 (递推)[含简单C(n,m) n!的写法]
- codevs 3004 I'm the king of the world.(好中二
- 2016寄语
- hdu FatMouse's Speed 动态规划DP
- 第四十九天
- 将博客搬至CSDN
- 字节流
- 文件操作实例
- sublime text2 配置成golang IDE
- 文件内容操作九行
- 文件操作十二行
- 文件复制
- 五子棋程序键盘初始化/打印输出