在用户空间中,我试图从我正在编程的内核模块中获取导出的函数,这样我就可以得到一个结构数组,这样我就可以遍历该数组,找出数组中有多少结构。
内核模块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);
用户空间.h
controller_struct_t * get_ctrl_list(void);
用户空间.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()'
非常感谢您的帮助!谢谢。
最佳答案
欢迎来到内核模块的世界;祝贺您编写了第一个成功的内核模块!
在Linux上,如果要验证内核模块是否已“导出”,还可以检查文件“/proc/kallsyms”,查看是否已导出内核模块函数:
> grep get_ctrl_list /proc/kallsyms
所以,如果我理解正确,您想从用户空间迭代内核空间中的链表吗?
首先,确保您对“地址空间”有很好的理解。每个地址空间都是一组唯一的地址,从0(或空)到计算机可能的最高地址。
地址空间不应该互相“重叠”。它们更像是“平行宇宙”。每个地址空间可能有它自己独特的“行星冥王星”;然而,每个“行星冥王星”都是独一无二的,并且完全不知道在其他地址空间中可能存在的另一个“行星冥王星”。
内核有自己的地址空间,即内核模块所在的位置,以及所有其他内核模块和内核本身。它们都共享同一个地址空间。这意味着它们可以很容易地相互作用。一个内核模块可能与另一个模块共享它的链表。每个人都必须公平竞争,遵守规则(否则坏事就会发生)。
每个*nix进程通常都有自己的地址空间,称为“用户空间”。但是,如果在一个地址空间中有一个变量'pluto',则该变量(或其地址)在另一个地址空间中没有意义。
因此,如果在内核空间中有链表的地址,那么在任何用户空间中都没有意义。程序不能(通常)使用该地址从自己的用户空间访问对象。
为了访问一个平行的宇宙(或地址空间),您需要在那个宇宙(或地址空间)中插入某种“蠕虫洞”。是否有可编程访问的类似虫洞的结构来访问其他地址空间?
对!
例如,共享内存。可以为多个地址空间(包括内核)分配(或映射)可访问的内存。这种结构对于“数组”来说是理想的,但对于“链表”来说可能有点局限(但并非不可能)。
系统调用在用户空间和内核空间之间也起着蠕虫洞的作用;“ioctls”也是如此。
根用户可以在Linux上直接使用/proc/kcore访问内核内存(可能是内核最大的漏洞!)
关于c - 未定义对内核模块导出函数的引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24215613/