【问题标题】:undefined reference to exported function from kernel module未定义对内核模块导出函数的引用
【发布时间】:2014-06-14 00:51:57
【问题描述】:

从用户空间,我试图从我正在编程的内核模块中获取一个导出函数,以便我可以访问一个结构数组,以便我可以遍历该数组以找出有多少结构在数组中。

kernel_mod.c

controller_struct_t ctrl_list[MAX_CNTRS];

struct controller_struct_t * get_ctrl_list(void)
{
    return &ctrl_list;
}
EXPORT_SYMBOL_GPL(get_ctrl_list);

user_space.h

controller_struct_t * get_ctrl_list(void);

user_space.c

//MODULE_LICENSE("GPL");
controller_struct_t *ctrl_list = NULL;


ctrl_list = get_ctrl_list();

我尝试将 MODULE_LICENSE("GPL"); 放在 user_space.c 文件中,然后得到 error: expected constructor, destructor, or type conversion before ‘(’ token。我可以构建内核模块,并且我已经验证了该函数已导出。正如我之前提到的,我想获得一个指向ctrl_list 的指针,这样我就可以找出该数组中有多少个结构。我得到的错误如下。

 undefined reference to `get_ctrl_list()'

非常感谢任何帮助!谢谢。

【问题讨论】:

    标签: c arrays linux struct


    【解决方案1】:

    欢迎来到内核模块的世界;并祝贺你编写了你的​​第一个成功的内核模块!

    在 Linux 上,如果您想验证您的内核模块是否已“导出”,您还可以检查文件“/proc/kallsyms”以查看您的内核模块功能是否已导出:

    > grep get_ctrl_list /proc/kallsyms
    

    那么,如果我理解正确,您想从用户空间迭代内核空间中的链表吗?

    首先,确保您对“地址空间”有充分的了解。每个地址空间都是一组唯一的地址,从 0(或 NULL)到机器的最高地址。

    地址空间不应被视为彼此“重叠”。它们更像是“平行宇宙”。每个地址空间都可能有自己独特的“行星冥王星”;然而,每个“行星冥王星”都是独一无二的,并且完全不知道其他地址空间中可能存在的其他“行星冥王星”。

    内核有自己的地址空间,您的内核模块以及所有其他内核模块和内核本身都在其中。它们都共享相同的地址空间。这意味着它们可以轻松地相互交互。一个内核模块可能与另一个模块共享它的链表。每个人都必须公平竞争,并遵守规则(否则会发生坏事)。

    每个 *nix 进程通常都有自己的地址空间,称为“用户空间”。但是,如果您在一个地址空间中有一个变量“pluto”,则该变量(或其地址)在另一个地址空间中没有任何意义。

    因此,如果您在内核空间中拥有链表的地址,那么它在 -any- 用户空间中通常是没有意义的。程序不能(通常)使用该地址从它自己的用户空间访问对象。

    为了访问平行宇宙(或地址空间),您需要某种“虫洞”进入该宇宙(或地址空间)。是否有可通过程序访问的类似虫洞的结构来访问其他地址空间?

    是的!

    例如,共享内存。可以分配(或映射)可访问多个地址空间(包括内核)的内存。这种结构对于“数组”来说是理想的,但对于“链表”可能有些限制(但并非不可能)。

    系统调用也充当从用户空间到内核空间的虫洞; 'ioctls' 也是如此。

    root 用户可以在 Linux 上使用 /proc/kcore 直接访问内核内存(可能是所有内核中最大的虫洞!)

    【讨论】:

    • 非常感谢您提供的信息!我想要一个指向对象数组的指针,所以我遍历数组以找出数组中有多少个结构。做研究是否有像copy_from_user 这样的功能可以以另一种方式工作?我想我可以遍历内核端的数组,然后将一个 int 返回给用户空间。感谢您的帮助!
    猜你喜欢
    • 2023-03-30
    • 2014-12-06
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    相关资源
    最近更新 更多