内核模块能否单独编译,单独加入linux内核,给应用程序使用

时间:2021-11-18 22:25:55
我虚拟机装了Ubuntu 12.04.4 LTS \n \l     Linux ubuntu 3.11.0-15-generic #25~precise1-Ubuntu SMP Thu Jan 30 17:42:40 UTC 2
014 i686 i686 i386 GNU/Linux
我也安装了gcc g++编译工具


我下载了linux-3.6内核源码, 在lib目录下有一个bch.c文件,最后有这些字样
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Ivan Djelic <ivan.djelic@parrot.com>");
MODULE_DESCRIPTION("Binary BCH encoder/decoder");


EXPORT_SYMBOL_GPL()下列4个函数
struct bch_control *init_bch(int m, int t, unsigned int prim_poly);

void free_bch(struct bch_control *bch);

void encode_bch(struct bch_control *bch, const uint8_t *data,
unsigned int len, uint8_t *ecc);

int decode_bch(struct bch_control *bch, const uint8_t *data, unsigned int len,
       const uint8_t *recv_ecc, const uint8_t *calc_ecc,
       const unsigned int *syn, unsigned int *errloc);

如果我想在应用程序用到上面的4个函数,我应该如何做?
1 可以将这个module单独编译出来 然后insmod这个module,然后应用程序有bch.h头文件,直接调用吗?
编译时makefile要链接什么呢?想libc.so这样的?

2 把bch代码中跟内核函数有关的修改掉,当做应用层编译使用? 这个我试过,但是不知道哪里有问题,一些函数替换后,编译是通过了,但是init_bch(……)这个函数都没执行成功。

3 还是要编译整个内核?那可以再应用层调用吗?这个比较复杂了。

6 个解决方案

#1


bch.c
是个算法,理论上并不需要内核,在哪里编译都可以,我刚接触linux,对linux的编译方式等不熟悉,不知道简单的弄下。

#2


EXPORT_SYMBOL_GPL导出的符号是在另外的模块中使用的,而不能让应用程序直接调用。想调用的话,自己写一个模块,做承上启下的作用来间接调用。

#3


引用 2 楼 kangear 的回复:
EXPORT_SYMBOL_GPL导出的符号是在另外的模块中使用的,而不能让应用程序直接调用。想调用的话,自己写一个模块,做承上启下的作用来间接调用。

其实是要赞同你来的,点错成板砖了。。。。

#4


楼主通过系统调用来间接调用吧,或者花点时间将bch.c转换成应用代码,遇到不啥内核接口再转

#5


引用 3 楼 r_Jimy 的回复:
Quote: 引用 2 楼 kangear 的回复:

EXPORT_SYMBOL_GPL导出的符号是在另外的模块中使用的,而不能让应用程序直接调用。想调用的话,自己写一个模块,做承上启下的作用来间接调用。

其实是要赞同你来的,点错成板砖了。。。。


喜忧参半。 内核模块能否单独编译,单独加入linux内核,给应用程序使用

#6


我已经转换成应用的了。在linux下没什么问题。
在windows下的一个struct包含一个c[0]编译不过的问题也解决了。

#1


bch.c
是个算法,理论上并不需要内核,在哪里编译都可以,我刚接触linux,对linux的编译方式等不熟悉,不知道简单的弄下。

#2


EXPORT_SYMBOL_GPL导出的符号是在另外的模块中使用的,而不能让应用程序直接调用。想调用的话,自己写一个模块,做承上启下的作用来间接调用。

#3


引用 2 楼 kangear 的回复:
EXPORT_SYMBOL_GPL导出的符号是在另外的模块中使用的,而不能让应用程序直接调用。想调用的话,自己写一个模块,做承上启下的作用来间接调用。

其实是要赞同你来的,点错成板砖了。。。。

#4


楼主通过系统调用来间接调用吧,或者花点时间将bch.c转换成应用代码,遇到不啥内核接口再转

#5


引用 3 楼 r_Jimy 的回复:
Quote: 引用 2 楼 kangear 的回复:

EXPORT_SYMBOL_GPL导出的符号是在另外的模块中使用的,而不能让应用程序直接调用。想调用的话,自己写一个模块,做承上启下的作用来间接调用。

其实是要赞同你来的,点错成板砖了。。。。


喜忧参半。 内核模块能否单独编译,单独加入linux内核,给应用程序使用

#6


我已经转换成应用的了。在linux下没什么问题。
在windows下的一个struct包含一个c[0]编译不过的问题也解决了。