我是安静的新模块编码,我需要运行一些计算,在模块中使用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
任何建议?将感谢帮助!
2条答案
按热度按时间pengsaosao1#
我对GMP不太熟悉,但你不太可能动态地将一个库链接到一个内核模块。
原因是内核是一个独立的程序,不知道你使用的任何系统库(比如glib...),很可能GMP使用这些库。
我能想到的唯一解决方案是,你做一个内核模块,与用户域中的程序通信,并将GMP链接到应用程序的用户域部分。
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