C语言 GMP内核模块

bqf10yzr  于 9个月前  发布在  其他
关注(0)|答案(2)|浏览(117)

我是安静的新模块编码,我需要运行一些计算,在模块中使用GMP库。
那么第一个问题:在内核中运行GMP通常是可能的吗?为了测试,我写了这个模块:

#include <linux/init.h>
#include <linux/module.h>
#include <gmp.h>

int hallo_init(void)
{
   mpz_t testFactor;
   mpz_init( testFactor, NULL);
   mpz_set_str(testFactor, "19", 10);
   int length = (int) mpz_sizeinbase(testFactor,2);

   printk(KERN_ALERT "That is testFactor: %x \n",length);

   return 0;
}

void hallo_exit(void)
{
   printk(KERN_ALERT "exit \n");
}

module_init(hallo_init);
module_exit(hallo_exit);

字符串
我使用以下命令运行它:

sudo make -C /lib/modules/$(uname -r)/build M=$PWD modules -lgmp


生成文件由以下内容组成

obj-m := gmpFile.o


我还尝试在makefile中使用-lgmp:

obj-m := halloGmp.o
ccflags-y := -lgmp


但我总是得到一个致命的错误:gmp.h: No such file or directory任何建议?将感谢帮助!

pengsaosao

pengsaosao1#

我对GMP不太熟悉,但你不太可能动态地将一个库链接到一个内核模块。
原因是内核是一个独立的程序,不知道你使用的任何系统库(比如glib...),很可能GMP使用这些库。
我能想到的唯一解决方案是,你做一个内核模块,与用户域中的程序通信,并将GMP链接到应用程序的用户域部分。

y4ekin9u

y4ekin9u2#

事实上,这里唯一的答案是从一个家伙谁是“不熟悉GMP”是恼人的。
Yes<gmp.h>是gcc自带的,而不是内核,因此你不能对内核模块使用gmp,因为你不能链接它。
我遇到了类似的问题,我需要比unsinged long long更大的数字,而Linux内核中似乎没有等效的数字。我反而创建了一个存储long long扩展器和溢出计数器的结构来解决这个问题。请随意引用我的项目:https://github.com/DRK-512/Operating-Systems/blob/main/Linux-Operations/Fibanocci-Driver/src/fibonacci.c
另外,如果您选择使用gmp,请避免使用mpz_sizeinbase函数,因为当输入659034621587630041982498215时,它会报告28而不是27

相关问题