【发布时间】:2017-07-25 02:10:07
【问题描述】:
假设我有一个 .h 和 .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 文件包含 void insert_node fn 的定义,它使用 kmalloc() 创建一个 tree_node 并将其插入到树中。我可以使用 Makefile 编译代码来编译内核模块,因为 .h/.c 文件是内核模块的一部分。
现在,我也想在用户空间中使用相同的数据结构及其 fns。我需要使用新的用户空间特定的 makefile 来编译它,它注意用 malloc 和 free 替换内核特定的调用,如 kmalloc 和 kfree ?我如何使用#ifdef #else #endif 的各种组合,以便通过使用各自的make文件在用户空间和内核空间中编译文件。
请注意:kmalloc/kfree 只是解释的简单示例。文件包含其他内核特定的 API,在用户空间中编译文件时需要排除/替换这些 API。
【问题讨论】:
-
听起来像是 XY 问题。重构代码并将其拆分为不同的模块。如果它与内核函数深度交织,那么将其用于用户空间也是一个坏主意。