2017-03-05 64 views
-2

可以说,我有一个h和.c文件,最初是为内核空间。编译为用户空间相同的C代码以及内核空间

#ifndef __TREE_H__ 
#define __TREE_H__ 

/* #includes for kernel headers*/ 

struct tree_node_t{ 
    int data; 
    struct tree_node_t *left; 
    struct tree_node_t *right; 
}; 

struct tree{ 
int data; 
struct tree_node_t *root; 
}; 

void insert_node(struct tree *tree, int data); 
#endif 

可以说,相应的.c文件包含无效insert_node FN的定义,使用kmalloc(),营造出tree_node并将其插入到一棵树。我能够使用Makefile编译代码来编译内核模块,因为.h/.c文件是内核模块的一部分。

现在,我想用在用户空间相同的数据结构和FNS为好。我需要使用新的用户空间中的特定的Makefile它负责更换像kmallockfreemallocfree而不是特定的内核调用编译它?我如何使用#ifdef #else #endif的各种组合,以便通过使用各自的make文件在用户空间和内核空间中编译这些文件。

PLS NTE:kmalloc/kfree只是简单的例子来解释。文件包含其他内核特定的API,在编译用户空间中的文件时需要将其排除/替换。

+0

听起来像一个XY问题。重构代码并将其分成不同的模块。如果它与内核函数深深交织在一起,将它用于用户空间也是一个坏主意。 – Olaf

回答

2

您可以使用编译的分化目标__KERNEL__宏:内核代码(宏定义)或应用程序(没有定义宏)。

这个宏确实在Linux内核中用于uapi头文件和其他一些文件。参见例如include/uapi/linux/ethtool.h

相关问题