无法找到__put_user_1的定义位置

时间:2014-12-09 21:49:33

标签: ubuntu linux-kernel c

我一直在浏览linux内核模块编程指南,我决定了解put_user(*(msg_Ptr),buffer)的工作原理。完成所有宏扩展后,看起来这个内联汇编会将__pu_val放入用户空间的缓冲区中。我把它放在我的程序中。

asm volatile("call __put_user_1" : "=a" (__ret_pu)   : "0" (__pu_val), "c" (buffer) : "ebx");

查看内核代码,在/usr/src/linux-headers-3.13.0-37/arch/x86/include/asm/uaccess.h中似乎只提到了一个__put_user_1函数。这就像一个外部函数原型:

/*
 * Strange magic calling convention: pointer in %ecx,
 * value in %eax(:%edx), return value in %eax. clobbers %rbx
 */
extern void __get_user_1(void);

我看不到在任何地方定义它的位置,但是Module.symvers在内核中有__get_user_1符号:

0x167e7f9d  __get_user_1    vmlinux EXPORT_SYMBOL

我的目标是能够将put_user代码放在我的源代码中,以便我可以了解内核与用户空间的确切交互方式,但我没有取得多大成功。

1 个答案:

答案 0 :(得分:0)

它位于put_user.S - 和ASM文件似乎没有被索引内核源代码的东西索引。仍然只是一个宏或静态定义。可能本来可以放在一个C文件中并使用内联汇编声明而不是汇编它然后为了清楚起见而链接它。                      - RobotHumans